Introduction
The LXD team is very excited to announce the release of LXD 5.5!
This release introduces quite a few new exciting features, including the beginning of object storage support in LXD, as well as a number of smaller but very welcome additions and fixes.
Enjoy!
New features and highlights
Storage buckets (on Ceph)
LXD is getting support for object storage!
This is done by adding a whole new concept of storage buckets along with dedicated command (lxc storage bucket
) and APIs.
This allows LXD users to create new storage buckets, assign them a size limit and then manage access keys to that bucket. The bucket has its own URL with an S3 API.
Our initial implementation is limited to using Ceph with its rados gateway providing the S3 API. In LXD 5.6, we will be extending this feature to all other storage drivers through the use of minio.
stgraber@dakara:~$ lxc storage create remote-object cephobject cephobject.radosgsw.endpoint=http://athos.hosts.mtl.stgraber.net:7480
Storage pool remote-object created
stgraber@dakara:~$ lxc storage bucket create remote-object foo
Storage bucket foo created
stgraber@dakara:~$ lxc storage bucket key create remote-object foo admin --role admin
Storage bucket key admin added
Access key: TNZAYZSYIHM243PS8337
Secret key: xbBTY8exhnXdm3uwEcsBjeBVBFzi4n4NOhtOEYa3
stgraber@dakara:~$ lxc storage bucket show remote-object foo
config: {}
description: ""
name: foo
s3_url: http://athos.hosts.mtl.stgraber.net:7480/foo
location: ""
stgraber@dakara:~$ time s3cmd put Downloads/Win11_English_x64v1.iso s3://foo --multipart-chunk-size-mb=1000 --no-ssl --host athos.hosts.mtl.stgraber.net:7480 --host-bucket athos.hosts.mtl.stgraber.net:7480 --access_key TNZAYZSYIHM243PS8337 --secret_key xbBTY8exhnXdm3uwEcsBjeBVBFzi4n4NOhtOEYa3
upload: 'Downloads/Win11_English_x64v1.iso' -> 's3://foo/Win11_English_x64v1.iso' [part 1 of 6, 1000MB] [1 of 1]
1048576000 of 1048576000 100% in 26s 37.30 MB/s done
upload: 'Downloads/Win11_English_x64v1.iso' -> 's3://foo/Win11_English_x64v1.iso' [part 2 of 6, 1000MB] [1 of 1]
1048576000 of 1048576000 100% in 25s 39.72 MB/s done
upload: 'Downloads/Win11_English_x64v1.iso' -> 's3://foo/Win11_English_x64v1.iso' [part 3 of 6, 1000MB] [1 of 1]
1048576000 of 1048576000 100% in 28s 35.28 MB/s done
upload: 'Downloads/Win11_English_x64v1.iso' -> 's3://foo/Win11_English_x64v1.iso' [part 4 of 6, 1000MB] [1 of 1]
1048576000 of 1048576000 100% in 31s 32.15 MB/s done
upload: 'Downloads/Win11_English_x64v1.iso' -> 's3://foo/Win11_English_x64v1.iso' [part 5 of 6, 1000MB] [1 of 1]
1048576000 of 1048576000 100% in 29s 33.45 MB/s done
upload: 'Downloads/Win11_English_x64v1.iso' -> 's3://foo/Win11_English_x64v1.iso' [part 6 of 6, 307MB] [1 of 1]
322172928 of 322172928 100% in 9s 33.17 MB/s done
real 2m37.658s
user 0m20.592s
sys 0m4.383s
stgraber@dakara:~$ s3cmd get s3://foo/Win11_English_x64v1.iso --multipart-chunk-size-mb=1000 --no-ssl --host athos.hosts.mtl.stgraber.net:7480 --host-bucket athos.hosts.mtl.stgraber.net:7480 --access_key TNZAYZSYIHM243PS8337 --secret_key xbBTY8exhnXdm3uwEcsBjeBVBFzi4n4NOhtOEYa3
download: 's3://foo/Win11_English_x64v1.iso' -> './Win11_English_x64v1.iso' [1 of 1]
5565052928 of 5565052928 100% in 31s 170.59 MB/s done
Above you can see the creation of a new bucket and its use from a standard S3 client.
Instance Ready state
A common issue facing LXD users is knowing when an instance is ready to be used.
This isnât something that LXD itself can help a lot about as the definition of âreadyâ is a pretty case specific one. But what LXD can do is let you tell it when ready and then expose this over the API.
The way this works is through our guest API (/dev/lxd):
stgraber@dakara:~$ lxc list u1
+------+---------+-----------------------+-------------------------------------------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+---------+-----------------------+-------------------------------------------+-----------+-----------+
| u1 | RUNNING | 172.17.250.107 (eth0) | 2602:fc62:b:250:216:3eff:feb9:e5bd (eth0) | CONTAINER | 0 |
+------+---------+-----------------------+-------------------------------------------+-----------+-----------+
stgraber@dakara:~$ lxc exec u1 bash
root@u1:~# curl --unix-socket /dev/lxd/sock lxd/1.0
{"state":"Started","api_version":"1.0","instance_type":"container","location":"none"}
root@u1:~# curl --unix-socket /dev/lxd/sock lxd/1.0 -X PATCH -d '{"state": "Ready"}'
root@u1:~# exit
stgraber@dakara:~$ lxc list u1
+------+-------+-----------------------+-------------------------------------------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+-------+-----------------------+-------------------------------------------+-----------+-----------+
| u1 | READY | 172.17.250.107 (eth0) | 2602:fc62:b:250:216:3eff:feb9:e5bd (eth0) | CONTAINER | 0 |
+------+-------+-----------------------+-------------------------------------------+-----------+-----------+
This works with both containers and virtual-machines so long as the devlxd API has not been disabled.
Configurable BGP hold time
A new bgp.peers.NAME.holdtime
configuration key has been introduced.
This allows for setting a specific BGP hold time value on a peer, typically reducing it to a value much lower than the usual default of 180s.
All projects queries for storage volumes
Similar to what was done a few releases ago with the instances API, itâs now possible to retrieve volume information across projects by using the ?all-projects=true
keyword in the URL.
stgraber@dakara:~$ lxc query /1.0/storage-pools/default/volumes?all-projects=true
[
"/1.0/storage-pools/default/volumes/container/bgp-test",
"/1.0/storage-pools/default/volumes/container/centos3",
"/1.0/storage-pools/default/volumes/container/centos4",
"/1.0/storage-pools/default/volumes/container/charmcraft-lxd-1779348-0-0-amd64?project=charmcraft",
"/1.0/storage-pools/default/volumes/container/lxd-build",
"/1.0/storage-pools/default/volumes/container/snapcraft-lxd",
"/1.0/storage-pools/default/volumes/container/snapcraft-microceph-1142335?project=snapcraft",
"/1.0/storage-pools/default/volumes/container/speedtest",
"/1.0/storage-pools/default/volumes/container/u1",
"/1.0/storage-pools/default/volumes/custom/backups",
"/1.0/storage-pools/default/volumes/custom/images",
"/1.0/storage-pools/default/volumes/virtual-machine/v1",
"/1.0/storage-pools/default/volumes/virtual-machine/v2",
"/1.0/storage-pools/default/volumes/virtual-machine/win11"
]
OOM kill counter in metrics
A new metrics API entry has been added to track the number of times the kernel Out Of Memory killer has been triggered.
stgraber@dakara:~$ lxc config set u1 limits.memory=64MiB
stgraber@dakara:~$ lxc query /1.0/metrics | grep lxd_memory_OOM_kills_total
# HELP lxd_memory_OOM_kills_total The number of out of memory kills.
# TYPE lxd_memory_OOM_kills_total counter
lxd_memory_OOM_kills_total{name="u1",project="default",type="container"} 0
stgraber@dakara:~$ lxc exec u1 -- apt update
Hit:1 http://archive.ubuntu.com/ubuntu focal InRelease
Hit:2 http://security.ubuntu.com/ubuntu focal-security InRelease
Hit:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease
stgraber@dakara:~$ ts... 56% Killed
stgraber@dakara:~$ lxc query /1.0/metrics | grep lxd_memory_OOM_kills_total
# HELP lxd_memory_OOM_kills_total The number of out of memory kills.
# TYPE lxd_memory_OOM_kills_total counter
lxd_memory_OOM_kills_total{name="u1",project="default",type="container"} 1
Database optimization
And lastly, not really a new feature but a significant focus of this release.
A lot of work has gone into reducing the number of database requests performed by LXD as well as generally optimizing those requests.
This should provide better overall performance and avoid a number of timeouts that were hitting some larger cluster users.
Complete changelog
Here is a complete list of all changes in this release:
Full commit list
- Doc: Fix LXD volume group to LVM
- Remove redundant LXD before ZFS pool
- Doc: change a LVM to an LVM
- doc/authentication: add information about a server behind NAT
- lxc/remote: Allow specifying alternate server address for tokens
- i18n: Update translation templates
- lxd/db/warningtype: Move warning type definitions to warningtype package
- lxd: Update usages of warning types
- lxd/db/cluster/warnings: Add cluster.Warnings
- lxd/db/warnings.mapper: Remove db.Warnings and its code generation
- lxd/db/cluster/warnings.mapper: Update generated code
- lxd/db/cluster/mapper: Get Images/Certificates by ID
- shared/api/certificate: Add api.Certificate URL helper
- lxd/warnings: Add getWarningEntityURL
- lxd/warnings/warnings: Use cluster package helpers for Warnings
- lxd/db/warnings.mapper: Remove db package warnings generated files
- lxd/db/generate: Remove v1 generator
- lxd/db/cluster: Remove version flag from generator comments
- lxd/db/warnings: Remove unused types
- doc/storage: add link to video about benchmarking storage drivers
- lxd/db/storage/buckets: Fix member specific filter bug in GetNetworkLoadBalancers
- lxd/db/cluster/projects: Move ProjectFeatures and ProjectFeaturesDefaults into cluster package
- lxd/db/cluster/open: Update EnsureSchema to use ProjectFeaturesDefaults for default project features
- lxd/api/project: Use cluster.ProjectFeatures and cluster.ProjectFeaturesDefaults
- lxd/db/network/forwards: Adds context arg to GetNetworkForwards and GetNetworkForward
- lxd/network: GetNetworkForward and GetNetworkForwards usage
- lxd/db/network/forwards: Adds optional listenAddresses filter to GetNetworkForwards
- lxd/db/network/load/balancers: Adds context argument to GetNetworkLoadBalancer and GetNetworkLoadBalancers
- lxd/network: Usage of GetNetworkLoadBalancers and GetNetworkLoadBalancer
- lxd/db/network/load/balancers: Adds optional listenAddresses filter to GetNetworkLoadBalancers
- lxd/db/cluster/stmt: Export Stmt helper
- lxd/db/cluster: Use exported Stmt helper
- lxd/db/generate/db/method: Use exported Stmt helper
- lxd/db/cluster/mapper: Update generated code
- lxd/db/transaction: Remove Cluster/ClusterTx prepared stmts field
- lxd/db: Use cluster.Stmt as the only statement store
- lxd/storage/drivers/driver/lvm/volumes: Fix âlvm.stripes cannot be used with thin pool volumesâ error
- lxd/lifecycle/network/load/balancer: Fix load balancer lifecycle types
- shared/api/event/lifecycle: Fix typo in constant
- lxd: Update response.SyncResponseLocation URL generation to use api.NewURL() helper
- lxd/network/load/balancers: Add missing networks segment to URL response in networkLoadBalancersPost
- lxd/storage/volumes: Adds missing volume name to URL response in storagePoolVolumeTypePostRename
- lxd/lifecycle: Reworks URL generation to use api.NewURL()
- lxd/lifecycle/cluster/member: Update ClusterMemberAction.Event to use api.NewURL
- lxd/lifecycle/instance/backup: Updates InstanceBackupAction.Event to clarify what backup name is expected
- lxd/instance/backup: Pass full backup name to lifecycle.InstanceBackupRetrieved.Event
- lxd/lifecycle/storage/volume: Make StorageVolumeAction.Event require volume with name and type
- lxd/lifecycle/storage/volume/backup: Updates StorageVolumeBackupAction.Event to clarify the type of backup name required
- lxd/storage/volumes/backup: Pass full backup name into lifecycle events
- lxd/lifecycle/storage/volume/snapshot: Updates StorageVolumeSnapshotAction.Event to expect snapshot volume
- doc: add spellcheck
- doc: add spellchecking to the tests
- doc: add an extension to allow spelling exceptions
- doc: update word list for spellchecker
- doc: fix spelling README.md
- doc: fix spelling api-extensions.md
- doc: fix spelling architectures.md
- doc: fix spelling backup.md
- doc: fix spelling events.md
- doc: fix spelling faq.md
- doc: fix spelling instances.md
- doc: fix spelling security.md
- doc: fix spelling server.md
- doc: fix spelling network_bridge_resolved.md
- doc: fix spelling metrics.md
- doc: fix spelling projects.md
- doc: fix spelling rest-api.md
- doc: fix spelling network_bridge.md
- doc: fix spelling network_macvlan.md
- doc: fix spelling network_ovn.md
- doc: fix spelling storage_btrfs.md
- doc: fix spelling clustering.md
- doc: fix spelling container-environment.md
- doc: fix spelling database.md
- doc: fix spelling dev-lxd.md
- doc: fix spelling network_acls.md
- doc: fix spelling network_load_balancers.md
- doc: fix spelling userns-idmap.md
- doc: fix spelling syscall-interception.md
- doc: fix spelling requirements.md
- doc: fix spelling remotes.md
- doc: fix spelling storage_zfs.md
- doc: fix spelling storage_lvm.md
- doc: fix spelling storage_drivers.md
- doc: fix spelling storage_dir.md
- doc: fix spelling storage_cephfs.md
- doc: fix spelling storage_ceph.md
- doc: fix spelling network_sriov.md
- doc: fix spelling network_physical.md
- doc: fix spelling network_forwards.md
- doc: fix spelling network_ovn_peers.md
- doc: fix spelling network_zones.md
- doc: fix spelling storage_add_volume.md
- doc: fix spelling image_handling.md
- doc: fix spelling migration.md
- doc: fix spelling production-setup.md
- doc: exclude some tags from spell checking
- doc: allow Markdown syntax when we need markup in a link
- doc: fix spelling authentication.md
- doc: fix spelling cloud-init.md
- doc: fix spelling containers.md
- doc: fix spelling contributing.md
- doc: fix spelling daemon-behavior
- doc: fix spelling debugging.md
- doc: fix spelling doc-cheat-sheet.md
- doc: fix spelling networks.md
- doc: fix spelling storage.md
- doc: fix spelling network_bridge_firewalld.md
- doc: fix spelling network_ovn_setup.md
- doc: fix spelling storage_backup.md
- doc: fix spelling installing.md
- doc: fix spelling instance-exec.md
- doc: fix spelling profiles.md
- doc: fix spelling CONTRIBUTING.md
- lxd: Use lifecycle URL in SyncResponseLocation
- lxd/lifecycle/storage/pool: Remove projectName arg from StoragePoolAction.Event
- lxd/networks: Adds project to networksPost SyncResponseLocation response
- lxd/storage/pools: Updates storagePoolsPost to use a common lifecycle var
- lxd/storage/pools: Fix comment typo in storagePoolsPost
- lxd/storage/pools: Updates storagePoolPut and storagePoolDelete to use updated lifecycle function
- lxd/storage/volumes: Adds project to SyncResponseLocation in storagePoolVolumeTypePostRename
- lxd/db/instances: Donât use query parameters with IN statement when loading instance config in InstanceList
- lxd/db/instances: Use query.Params in GetProjectAndInstanceNamesByNodeAddress
- lxd/db/instances: Use query.Params in GetProjectInstanceToNodeMap
- lxd/db/instances: Use consistent IN format
- lxd/db/instances: Remove unused generateInClauseParams function
- lxd/db/network/forwards: Use query.Params in GetNetworkForwards
- lxd/db/network/load/balancers: Use query.Params in GetNetworkLoadBalancers
- lxd/db/cluster: Donât use prepared statements in RemoveNodeFromClusterGroup and AddNodeToClusterGroup
- lxd/db/images: Updates getImagesByFingerprintPrefix to use QueryScan rather than prepare
- lxd/db/transaction: Removes unused prepare function
- lxd/resources: Fix VPD parser crash
- lxd/db/cluster/snapshots: Updates ToInstance to be more flexible
- lxd: snapshot.ToInstance usage
- lxd/db/instances: Refactors InstanceList into several smaller functions
- lxd/db/instances: Adds snapshot support to InstancesToInstanceArgs and associated functions
- lxd: Use consistent log context name for err
- lxd/instances/get: Log instance render errors in doInstancesGet
- lxd: Donât pass duplicate profiles into instance.Load
- lxd/instance/drivers/driver/common: Updates Snapshots to avoid using tx.GetInstanceSnapshotsWithName
- lxd/instance/instance/utils: Removes inefficient unused LoadFromAllProjects function
- lxd/network/driver/ovn: Update Leases to use InstanceList
- lxd/network/driver/bridge: Updates Leases to use InstanceList
- lxd/instance/instance/utils: Removes unused LoadByProject function
- lxd/instance: Reworks autoCreateInstanceSnapshots and autoCreateInstanceSnapshotsTask to use InstancesToInstanceArgs
- lxd/daemon: Updates usage of autoCreateInstanceSnapshotsTask
- lxd/instance: Update pruneExpiredInstanceSnapshotsTask to use tx.InstancesToInstanceArgs
- lxd/instance: Reworks pruneExpiredInstanceSnapshotsTask to use tx.InstancesToInstanceArgs
- lxd/instance/instance/utils: Removes unused LoadAllInternal function
- shared/api: Add Ready state
- shared/api: Add function to get status code from status name
- shared/instance: Allow volatile.last_state.ready key
- lxd/db: Add function to remove volatile.last_state.ready key
- lxd: Unset volatile.last_state.ready on daemon init
- lxd/instance/drivers: Set volatile.last_state.ready on stop/shutdown
- lxd/instance/drivers: Return api.Ready when ready
- lxd/devlxd: Add instance state to /1.0
- lxd/devlxd: Allow setting instance state in /1.0
- test/deps: Add ready-state subcommand
- test: Test instance Ready state using devlxd
- lxd/profiles/utils: Updates getProfileInstancesInfo to use tx.InstancesToInstanceArgs
- api: Add instance_ready_state
- doc/devlxd: Add PATCH /1.0
- doc/devlxd: Update GET /1.0
- docs: Update storage create pool howto
- lxd-agent: Handle PATCH /1.0 in devlxd
- lxd/config: Fix expanded show of instance snapshot
- doc: update version of lxd-sphinx-extensions
- doc: mark up default values correctly for clustering.md
- doc: mark up default values correctly for network_zones.md
- doc: mark up default values correctly for instances.md
- doc: mark up default values correctly for production-setup.md
- doc: mark up default values correctly for projects.md
- doc: mark up default values correctly for network_bridge.md
- doc: mark up default values correctly for network_macvlan.md
- doc: mark up default values correctly for network_ovn.md
- doc: mark up default values correctly for network_physical.md
- doc: mark up default values correctly for storage_btrfs.md
- doc: mark up default values correctly for storage_ceph.md
- doc: mark up default values correctly for storage_cephfs.md
- doc: mark up default values correctly for storage_dir.md
- doc: mark up default values correctly for storage_lvm.md
- doc: mark up default values correctly for storage_zfs.md
- doc: mark up default values correctly for security.md
- doc: mark up default values correctly for server.md
- lxd/network/forwards: Add support for config patching in networkForwardPut
- lxd/network/load/balancers: Add support for config patching in networkLoadBalancerPut
- lxd/fsmonitor/drivers/errors: Removes unused variable ErrNotImplemented
- lxd/storage/drivers/driver/common: Adds default âNot supportedâ functions
- lxd/storage/drivers/driver/cephfs/volumes: Fall back to using common (ânot supportedâ) RefreshVolume function
- lxd/storage/drivers/errors: Removes little used ErrNotImplemented
- lxd/storage/backend/mock: Removes use of drivers.ErrNotImplemented
- lxd/storage/backend/lxd: Switch to ErrNotSupported in CreateInstanceFromCopy
- lxd/networks: Restrict network config view to admin users
- lxd/storage/pools: Restrict storage pool config view to admin users
- lxd/storage/drivers/driver/btrfs: Scan pool device source for BTRFS filesystems before mounting
- lxd/db/instances: Adds snapshot support to instanceProfilesFill
- lxd/db/instances: Adds fillProfiles argument to InstancesToInstanceArgs
- lxd/instance/instance/utils: Switch to InstancesToInstanceArgs in LoadByProjectAndName
- lxd/instance/instance/utils: Switch to InstancesToInstanceArgs in CreateInternal
- lxd/instance/drivers/driver/common: Donât reload snapshot profiles in Snapshots
- lxd/profiles/util: InstancesToInstanceArgs usage in getProfileInstancesInfo
- lxd/db/instances: InstancesToInstanceArgs usage in InstanceList
- lxd/instance: InstancesToInstanceArgs usage in autoCreateInstanceSnapshotsTask
- lxd/instance: InstancesToInstanceArgs in pruneExpiredInstanceSnapshotsTask
- lxd/db/instances: Remove inefficient InstanceToArgs function
- test: Move devlxd-client into its own directory
- test: Remove source/baz file at end of filemanip test
- lxd/daemon: Add explicit instancesLoaded bool to indicate if shared mounts can be cleaned up
- lxd/storage/drivers/utils: Adds loopDeviceSetup and loopDeviceAutoDetach functions
- lxd/storage/drivers/driver/btrfs: Switch to loopDeviceSetup for loop device management
- lxd/storage/drivers/driver/lvm: Switch to loopDeviceSetup for loop device management
- lxd/storage/drivers/utils/cgo: Removes unused file
- lxd/storage/cgo: Removes unused file
- doc: update project description
- doc: update Project and community section
- shared/util/linux: Fix typo in comment of ExitStatus
- shared/util/linux: Adds detection of RunError to ExitStatus
- shared/validate/validate: Adds IsRequestURL function
- test: Run proxy listener command before adding proxy device
- test: Sleep longer when starting up proxy listener process after restart
- client/util: Set transport.DialTLSContext in tlsHTTPClient
- test: Add retries to udhcpc6 calls
- test: Add retries to udhcpc calls
- lxd/db/network/load/balancers: Fix regression in GetNetworkLoadBalancers
- doc/reference: improve description of storage option
- test: Keep retrying to signal to container to reboot in basic_usage
- lxd/profiles/utils: Removes incorrect comment from doProfileUpdateInstance
- lxd: Fixes API version for instances in project usedby.
- lxd/db: Fix escaped slashes in storage volume URIs.
- lxd/cluster/membership: Improve error in membershipCheckClusterStateForAccept
- lxd/db/cluster: Improve URL generation.
- client/lxd/cluster: No reason to use queryStruct in DeleteClusterMember
- gomod: Update dependencies
- workflows: Adds edge ppaâs and removes make deps step.
- lxd/storage/drivers/zfs: set atime=off and relatime=on
- doc/reference: fix description of dir source param
- lxd/cgroup/abstractions: Improve errors from GetIOStats
- lxd/instance/instance/utils: Updates DeleteSnapshots to use more efficient Snapshots() function
- lxd/instance/drivers: instance.DeleteSnapshots usage
- shared/util: Adds context argument to RunCommandSplit, RunCommandInheritFds and RunCommandWithFds
- shared/util: Adds RunCommandContext and deprecates RunCommand
- lxd: RunCommand* context usage
- shared/util: Unexports RunError fields and adds NewRunError function
- shared/util: NewRunError usage
- shared/util/linux: Use errors.As in ExitStatus
- lxd/archive/archive: shared.NewRunError usage
- lxd: RunError functions usage
- cgo: ensure that lxd wrappers donât conflict with libc provided wrapper
- doc/storage/zfs: include link to related YouTube video
- doc/authentication: clarify what to specify for admin password
- lxc/remote: the admin password prompt also accepts a token
- i18n: Update translation templates
- lxd/instance/drivers: Adds instance type to instance-created lifecycle event context.
- doc/storage/zfs: {remove_snapshots,use_refquota,reserve_space} are bools
- lxd/storage/drivers: use SI units
- lxd/main_init_interactive: use SI units
- lxd/storage/drivers/utils: Support CentOS 7 in loopDeviceSetup
- test: Increase storage pool delete timeout to 20s
- lxd/storage/storage: Adds UsedBy function
- lxd: Use storagePools.UsedBy function
- doc/migration: clean up âlive migrationâ documentation
- lxd/db/instances: Use stable sorting in GetInstanceSnapshotsWithName
- lxd/instance/drivers: Use stable sorting
- lxd/instances/get: Use stable sorting in doInstancesGet
- lxd/resources/cpu: Use stable sorting in GetCPU
- shared/api/instance: Adds GetParentAndSnapshotName function
- shared/api/storage/pool/volume: Adds URL function to StorageVolume
- lxd/storage/volumes: Fix volume get project resolution in storagePoolVolumeGet
- lxd/project/project: Update StorageVolumeProjectFromRecord and StorageVolumeProject
- lxd/db/storage/volumes: Rework GetStoragePoolVolumes to be more efficient
- lxd/db/storage/volumes: Removes duplicate zero length check in GetStorageVolumeNodes
- lxd/storage/volumes: Updates storagePoolVolumesGet to use tx.GetStoragePoolVolumes
- doc: use HTTPS for links to CRIU site and inotify man
- lxd/storage/volumes: Update storage-pools/{name}/volumes/{type} handler to use storagePoolVolumesGet
- lxd/storage/volumes: Remove unused storagePoolVolumesTypeGet
- lxd/storage/volumes: Fix golint error in storagePoolVolumesTypePost
- lxd/db/storage/volumes: Adds memberSpecific support to GetStoragePoolVolumes
- lxd/storage/volumes: Adds target member support to storagePoolVolumesGet
- lxd/db/images: Clarifies argument name in GetImagesFingerprints
- lxd/db/images: Adds GetProjectsUsingImage function
- lxd/storage/storage: Reworks UsedBy to use tx.GetStoragePoolVolumes
- lxd/storage/backend/lxd: UsedBy usage in IsUsed
- lxd/storage/pools: storagePools.UsedBy usage in storagePoolsGet
- api: network_bgp_holdtime
- doc: Add bgp.peers.NAME.holdtime
- lxd/bgp: Add configurable hold time
- lxd/network: Add configurable BGP hold time
- lxd/storage/pools: storagePools.UsedBy usage in storagePoolGet
- lxd/db/storage/pools: Removes unused GetStoragePoolUsedBy function
- shared/api/storage/pool/volume: Adds target awareness to URL
- lxd/storage/volumes/utils: Removes unused supportedVolumeTypesInstances var
- lxd/bgp: Only set HoldTime if set by the user
- lxd-user: Fix use with clusters
- shared/instance: Removes InstanceGetParentAndSnapshotName
- lxd: api.GetParentAndSnapshotName usage
- lxc: api.GetParentAndSnapshotName
- lxd/db/storage/volumes: Adds support for StorageVolumeFilter to GetStoragePoolVolumes
- lxd/storage/volumes: Updates storagePoolVolumesGet to use tx.GetStoragePoolVolumes filtering
- lxd/db/storage/volumes: Updates GetStoragePoolVolumes to return []StorageVolume
- lxd/storage/storage: Updates UsedBy to use updated GetStoragePoolVolumes
- lxd/storage/volumes: Updates storagePoolVolumesGet to use updated GetStoragePoolVolumes
- lxd/storage/volumes: Updates storagePoolVolumesGet to avoid unnecessary conversions
- lxd/storage/volumes/utils: Updates storagePoolVolumeUsedByGet to add target param
- lxd/db/storage/volumes: Adds GetStoragePoolVolume function
- lxd/storage/volumes/utils: Updates storagePoolVolumeUsedByGet to accept a db.StorageVolume
- lxd/storage/volumes: Updates storagePoolVolumeUsedByGet usage
- lxd/storage/volumes: Fix image in use detection in storagePoolVolumeDelete
- lxd/projects: Ensure default project has features.networks
- api: Adds storage_volumes_all_projects extension
- client: Adds all-projects functions for storage volumes
- shared/api: Add Project field to StorageVolume
- doc/rest-api: Refresh swagger YAML
- lxc/storage/volume: Adds --all-projects flag to lxc storage volume list
- lxd/instances/get: Replace mentions of cluster node with member
- lxd/db/storage/volumes: Removes Project field from StorageVolume
- shared/api/storage/pool/volume: Remove projectName from URL function
- lxd: Unify all-projects handling
- lxd/events: Improve error handling in eventsSocket
- lxd/storage/storage: Update UsedBy with updated URL function usage
- lxd/storage/volumes: Adds all-projects support to storagePoolVolumesGet
- i18n: Update translation templates
- lxd/db/storage/volumes: Updates GetStoragePoolVolumes to accept variadic filters
- lxd/storage/storage: tx.GetStoragePoolVolumes usage
- lxd/storage/volumes: tx.GetStoragePoolVolumes usage
- lxd/network: Fix BGP without hold time
- grafana: Only use instant queries on piechart graphs
- lxd/instance/instance/utils: Updates MoveTemporaryName to generate missing volatile.uuid
- lxd/instance/post: instance.MoveTemporaryName usage
- lxd/db/cluster: Adds remote storage aware unique index to storage_volumes
- lxd/network/driver/bridge: Include error from n.populateAutoConfig
- lxd/network/openvswitch/ovn: Lower case DNS names
- lxd/storage/pools: Donât use project param when deleting images before pool deletion
- lxd/db/storage/volumes: Removes unused GetStoragePoolVolumesNames function
- lxd/db/generate/db/method: Remove URI generation
- go: Update go-dqlite
- lxd/db/transaction: Move QueryScan to query package
- lxd/db/storage/volumes: Update usages of QueryScan
- lxd/db/generate/db/lex: Use QueryScan rowFunc in generated code
- lxd/db/generate/db/method: Remove unnecessary stmt preparations
- Update generated code
- lxd/db/cluster/stmt: Remove prepare helper
- metrics: new metric: lxd_memory_OOM_kills_total
- Makefile: Moves shellcheck version call into static-analysis target.
- doc/storage/ceph: remove YouTube link from content that is reused
- lxd-generate: Allow GetOne filter to include a âtypeâ field.
- doc: Split storage_configure into storage_configure_pool and storage_configure_volume
- doc: Split storage_list into storage_view_pools and storage_view_volumes
- doc: Split storage_resize into storage_resize_pool and storage_resize_volume
- doc: Rename storage_move to storage_move_volume
- doc: Rename storage_backup to storage_backup_volume
- doc: Rename storage_add_volume to storage_create_volume
- doc: Fix storage references
- doc: Reworks storage sub menu
- doc/migration: move current migration topic
- api: metrics_memory_oom_total
- doc: fix display of expandable sections
- doc/migration: Add instructions for lxd-migrate
- doc/migration: move the migration section
- doc/migration: updates to the instance migration documentation
- api: Adds storage_buckets extension
- shared/api: Adds storage pool bucket API types
- lxd/db/cluster: Adds storage buckets tables
- lxd/db/cluster/projects: Adds âfeatures.storage.bucketsâ to ProjectFeaturesDefaults
- lxd/project/project: Adds StorageBucketProjectFromRecord and StorageBucketProject functions
- lxd/project: Update cmdProjectList with features.storage.buckets support
- lxd-user/lxd: Enable features.storage.buckets in projects
- lxd/api/project: Add features.storage.buckets project setting
- doc/projects: Adds features.storage.buckets setting
- lxd/storage/drivers/driver/types: Adds Buckets field to Info
- client/lxd/storage/buckets: Client functions for bucket management
- lxc/storage/bucket: CLI commands for bucket management
- shared/api/event/lifecycle: Add bucket constants
- lxd/lifecycle/storage/bucket: Add lifecycle helper and types
- lxd/storage/pool/interface: Add bucket management definitions
- lxd/storage/drivers/bucket: Adds bucket type
- lxd/storage/drivers/bucket: Add S3Credentials type
- lxd/db/storage/buckets: Adds storage bucket management functions
- lxd/storage/backend/mock: Add storage management functions
- lxd/storage/backend/lxd: Add bucket management functions
- lxd/storage/drivers: Adds bucket management functions
- lxd/storage/buckets: Adds storage pool bucket management API endpoints
- doc/rest-api: Refresh swagger YAML
- gomod: Adds minio client and depenencies
- lxd/storage/drivers/driver/cephobject: Adds cephobject storage pool driver type
- lxd/storage/storage: Adds buckets to storage pool UsedBy output
- i18n: Update translation templates
- test: Document LXD_CEPH_CEPHFS option
- test: Adds cephobject tests
- doc: Adds cephobject documentation
- lxd/network/driver_ovn: Fixes impossibility to set MTU for a pair of veths connecting uplink and ovs-system bridges
- lxd/storage/drivers/driver/cephobject: Fix detection of missing lxd-admin radosgw user
- lxd: Replace SelectObjects callback with QueryScan rowFunc
- lxd/db/generate/db/method: Remove old destFunc
- lxd/db/cluster/stmt: Add StmtString and remove panics
- lxd/db/generate/db/method: Handle Stmt helper errors
- lxd/db/cluster/mapper: Update generated code
- lxd/db/cluster/nodes/cluster/groups.mapper: Add NodeClusterGroup generation
- lxd/db/cluster/update: Add ID to nodes_cluster_groups table
- lxd/instances/post: Use lxd-generate for cluster_groups
- lxd/db/storage/volumes: Rename QueryScan to Scan
- lxd/db/warnings: Remove unnecessary statement prepares
- lxd/node/config: Removes most inefficient âconvenienceâ functions
- lxd/daemon: Donât load the local daemon config repeatedly in init
- lxd/endpoints/endpoints: Use single-line contextual logging for socket bind & close
- lxd/firewall/drivers/drivers/xtables: Use xtables locking in NetworkApplyACLRules
- lxd/firewall/drivers/drivers/xtables: Simplify args list in iptablesAdd
- lxd/firewall/drivers/drivers/xtables: Use long form xtables arguments in iptablesClear
- lxd/storage/drivers/driver/cephobject/buckets: Create admin radosgw-admin user if missing in CreateBucket
- i18n: Update translations from weblate
- gomod: Update dependencies
- lxd/db/generate/db/method: Fix lxd-generate typo
Try it for yourself
This new LXD release is already available for you to try on our demo service.
Downloads
The release tarballs can be found on our download page.
Binary builds are also available for:
- Linux: snap install lxd
- MacOS: brew install lxc
- Windows: choco install lxc