Introduction
The LXD team is very excited to announce the release of LXD 5.6!
This is another busy LXD release, coming with improvements all around, whether you’re using LXD to run some containers, virtual machines or are using clustering and projects.
Enjoy!
New features and highlights
Grafana Loki support
LXD can now stream its log messages and lifecycle events over to a central Grafana Loki server. This initial implementation supports basic HTTP authentication and has some flexibility around what fields are sent as labels.
Specification: [LXD] Stream lifecycle and log events to Loki
Documentation: Server configuration - LXD documentation
Object storage on local storage pools
Following the initial implementation of storage buckets in LXD 5.5 with Ceph, this release now expands that feature to work with all of our other storage drivers.
This is based on the great work from the MinIO project which lets us offer an S3 compatible API directly from a local storage driver.
Specification: [LXD] Object storage (S3 API)
Documentation: How to manage storage buckets and keys - LXD documentation
Infiniband support for virtual machines
Still continuing our work to get our virtual machines be at parity with our containers, we have now added support for Infiniband to LXD VMs.
This works effectively the same way as containers by using the infiniband
device type, both physical
and sriov
is supported. Unlike with containers, for SR-IOV to function in this case, you will need to make sure that IOMMU is enabled on the system and that you have a number of SR-IOV virtual functions left "unprobed` by the Mellanox driver.
Documentation: Instance configuration - LXD documentation
Restricted network access in projects
Still growing the number of configuration options and restrictions available on LXD projects, we have now introduced a new restricted.networks.access
which takes a comma delimited list of managed networks.
When set, such a restricted project will only allow the use and even listing of those networks. This is particularly useful in environments that aren’t using ovn
for networking but where one network per project is indeed used for isolation.
Documentation: Project configuration - LXD documentation
instance-ready
lifecycle event
LXD 5.5 introduced the new READY
instance state which can be triggered through the /dev/lxd guest API. Now LXD 5.6 introduces a new instance-ready
lifecycle event which is emitted whenever an instance reaches that ready state.
Metric for total effective CPUs
Lastly, a new metric has been added to LXD’s metrics API.
lxd_cpu_effective_total
will report the total number of CPUs that are available to the insance. This can be useful to accurately calculate CPU percentage usage.
Complete changelog
Here is a complete list of all changes in this release:
Full commit list
- Doc: Fix typo in howto/storage_backup
- gomod: Update dependencies
- Makefile: Pin xgettext-go to working version
- doc: backquote true and NO_PROXY in doc/server.md
- doc: backquote mac in doc/api-extensions.md
- doc: backquote instance types in events.md
- doc: backqoute cloud-init in doc/cloud-init.md
- Doc: replace Pongo with Pongo2 in doc/image-handling.md
- doc: Capitalize fuse to FUSE in doc/instances.md
- doc: Capitalize candid in doc/api-extensions.md
- doc: Use more backquotes in documents
- doc: Capitalize MAC filtering in doc/instances.md
- doc: Improve uses of backquotes in documents
- Doc: update using backquotes by review suggestions
- lxd/instance/drivers: Adds storage pool to instance-created lifecycle context.
- doc: Correct typo in cephobject.radosgw.endpoint*
- lxd: Correct typo in cephobject.radosgw.endpoint*
- test: Correct typo in cephobject.radosgw.endpoint*
- lxd/db/cluster/update: Adds patch to correct typo in cephobject.radosgsw.endpoint*
- doc: Note AIO requirement
- lxd/db/generate/db/stmt: Add braces around WHERE clause
- lxd/db/cluster/devices: Add Filter structs to Config/Devices
- lxd/db/generate/db/parse: Generate queries with multiple filters
- lxd/db/cluster/mapper: Update generated code
- lxd/instance/instancetype/instance/type: Add instancetype.Filter
- lxd: Remove usage of empty filter structs
- doc/storage: small cleanup to the storage bucket documentation
- doc/storage: group the pool/volume/bucket information
- doc: remove FAQ about live migration
- api: Adds storage_buckets_create_credentials extension
- lxd-generate: Catch ‘type’ and change to ‘entityType’.
- lxd/db/cluster/schema: Apply schema patch version for bucket config typo fix
- doc/migration: add link to lxd-migrate tutorial on Discourse
- doc/upgrading: clarify database updates
- doc/storage/btrfs: add YouTube link
- doc/storage/lvm: add YouTube link
- client: Update CreateStoragePoolBucket to return create-time admin key
- lxc/storage/bucket: Display generated admin key in cmdStorageBucketCreate
- lxd/storage/buckets: Generate admin key on bucket creation
- test: Update storage buckets tests to check for initial credentials
- i18n: Update translation templates
- doc/rest-api: Refresh swagger YAML
- doc/storage: make navigation titles more consistent
- lxd/storage/buckets: Handle missing URL in storagePoolBucketsGet
- api: metric: lxd_cpu_seconds_total: fix help text, floats
- lxd/db/generate/db/method: Fix external package support
- lxd/db/generate/db/stmt: Add joinon tag
- lxd/db/generate/db/stmt: Don’t allow joins and leftjoins at the same time
- lxd/db/generate/db/stmt: Use joinon tag for ID query generation
- lxd-generate: Adds method to get table and column from join config.
- lxd-generate: Use join table in order by clause.
- lxd-generate: Use join table config in create statement subselect.
- lxd-generate: Use join table config in update statement subselect.
- lxd-generate: Updates whereClause to use join config.
- lxd/db/generate: Use joinTable
- lxd: Change project rename response to operation in swagger.
- doc: Regenerate swagger.
- lxd/storage/buckets: Detect missing bucket URL in storagePoolBucketGet
- lxd/storage/utils: Improve errors
- lxd/storage/utils: Return explicit nil on error in VolumeDBGet
- lxd/storage/utils: Prevent using VolumeDBCreate to create bucket volume records
- lxd/storage/drivers/volume: Adds VolumeTypeBucket type
- lxd/storage/drivers/interface: Use Volume type for bucket functions
- lxd/storage/drivers/driver/common: Updates bucket functions to accept Volume type
- lxd/storage/drivers/driver/cephobject/buckets: Use consistent minio s3 client context names
- lxd/storage/drivers/driver/cephobject: Improved comments
- lxd/storage/drivers/driver/cephobject/buckets: Updates to use Volume type for bucket config
- lxd/storage/utils: Adds BucketDBCreate and BucketDBDelete functions
- lxd/storage/backend/lxd: Switch to using Volume for buckets
- lxd/storage/backend/lxd: Removes unused GetBucket
- lxd/storage/drivers/bucket: Removes unused Bucket type
- doc/requirements: correct statement about AIO
- lxd/cgroup: Add GetEffecticeCPUs
- lxd/metrics: Add lxd_cpu_effective_total
- api: metrics_cpu_effective_total
- lxd/db/storage/buckets: Allow cross-pool bucket listing in GetStoragePoolBuckets
- lxd/storage/buckets: tx.GetStoragePoolBuckets usage
- lxd/storage/storage: tx.GetStoragePoolBuckets usage
- lxd/storage/drivers/driver/zfs: Adds ensureInitialDatasets function
- lxd/storage/drivers/driver/cephobject/buckets: Ensure context cancel is run after revert.Fail
- doc: improve systemd-resolved integration by adding stop command
- doc: resolvectl status doesn’t require sudo
- doc: remove sentence about disk support for VMs
- doc/network: add note that static leases require MAC as identifier
- doc/storage/volumes: add
--all-projects
to documentation - lxd/apparmor: Deref compress commands
- shared/api/event/lifecycle: Add instance ready constant
- lxd/lifecycle: Add InstanceReady lifecycle event
- lxd/devlxd: Send InstanceReady lifecycle event
- doc/events: Add instance-ready lifecycle event
- test: Test InstanceReady lifecycle event
- doc: add configuration and script for markdownlint
- doc: add a target for running markdownlint
- doc: add an action to run markdownlint on the docs
- doc: fix markdown errors for MD022
- doc: fix markdown errors for MD004-MD007
- doc: fix markdown errors for MD034
- doc: fix markdown errors for MD032
- doc: fix markdown errors for MD012
- doc: fix markdown errors for MD031
- doc: fix markdown errors for MD027
- doc: do not use emphasis
- doc: fix markdown errors for MD026
- doc: fix markdown errors for MD038
- doc: fix markdown errors for MD010
- doc: fix markdown errors for MD038
- doc: fix markdown errors for MD002
- lxd/device: Support physical infiniband for VMs
- doc: add related links to the start page
- test: Add 60s timeout to lxc commands
- test: Add clean up of storage buckets in kill_lxd
- scripts/empty-lxd.sh: Add emptying of storage buckets
- test: Allow automatic removal of loop devices in deconfigure_loop_device
- lxd/db/networks: Removes unused NetworkNodes function
- lxd/db/storage/pools: Removes unused StoragePoolNodes function
- lxd/instance/drivers/driver/lxc: Removes profiles argument from lxcLoad
- lxd/instance/drivers/driver/common: Removes profiles argument from expandConfig
- lxd/instance/drivers/driver/qemu: Removes profiles argument from qemuLoad
- lxd/instance: Removes profiles argument from load
- lxd: instance.Load usage
- lxd/profiles/utils: instance.Load usage in doProfileUpdateInstance
- lxd-agent/server: Log original error during write error in createCmd
- lxd/daemon: Log original error during write error in createCmd
- lxd/operations/websocket: Don’t return close errors in Render
- lxd/instance/drivers: Change common.Project from string to api.Project type
- lxd/instance: Updates instance load functions to accept api.Project
- lxd/device/disk: instance.Load usage
- lxd/project/permissions: Update AllowSnapshotCreation to accept api.Project
- lxd/instance: instance.Load and project.AllowSnapshotCreation usage
- lxd/instance/snapshot: project.AllowSnapshotCreation usage
- lxd/instances: instance.Load usage
- lxd/storage/backend/lxd: instance.Load usage
- lxd/storage/utils: Updates VolumeUsedByProfileDevices to pass api.Project to callback function
- lxd/storage/volumes/utils: storagePools.VolumeUsedByProfileDevices and instance.Load usage
- lxd/profiles/utils: Updates profile management functions to load projects
- lxd/profiles/utils: Fix incorrect handling of error in doProfileUpdate
- lxd/storage/volumes/snapshot: project.AllowSnapshotCreation usage
- lxd/storage/volumes: instance.Load usage
- lxd/project/project: Updates ProfileProject to return effective api.Project info
- lxd/profiles: project.ProfileProject usage
- lxd/project/project: Updates NetworkProject to return requested project’s info
- lxd/networks: NetworkProject usage
- lxd/project/project: Align StorageBucketProject with StorageVolumeProject return values
- lxd/storage/buckets: project.StorageBucketProject usage
- lxd/instance: Change Project() to return api.Project
- lxd/instance: inst.Project() usage
- lxd/device/disk: inst.Project() usage
- lxd/device/proxy: inst.Proxy() usage
- lxd/device: inst.Project() usage
- lxd/backup: inst.Project() usage
- lxd/seccomp: inst.Project() usage
- lxd/maas: inst.Project() usage
- lxd/lifecycle: inst.Project() usage
- lxd/network: inst.Project() usage
- lxd/storage/backend/lxd: inst.Project() usage
- lxd/apparmor: inst.Project() usage
- lxd: inst.Project() usage
- lxc-to-lxd: Handle linux32 and linux64 arch personalities
- doc/network/bgp: add some clarifications to the BGP docs
- doc/metrics: add a list of provided metrics
- lxd/instance/drivers/driver/qemu: Adds support for multi-queue macvlan NICs in VMs
- lxd/backup: Add Profiles field do Config struct
- lxd/storage: Add profiles to backup data
- lxd/db/generate/db/parse: Add ParseStmt
- lxd/db/generate/db/stmt: Parse ‘objects’ directive result to create ‘objects-by’
- lxd/db/cluster/instance/profiles: Add ‘objects’ directive for instance_profiles and certificate_projects
- lxd/db/generate/README: Add lxd-generate README
- lxd/db/cluster/mapper: Update generated code
- doc/migration: Document lxc-to-lxd tool
- api: Adds projects_networks_restricted_access extension
- doc/projects: Documents restricted.networks.access
- lxd/api/project: Adds restricted.networks.access
- lxd/project/project: Adds NetworkAllowed function
- lxd/network: Uses project.NetworkAllowed to check access to networks
- lxd/networks: Prevent creation of managed networks not accessible by project
- doc/storage/dir: add link to the YouTube video
- lxd/project/permissions: Updates checkRestrictions to check NICs against restricted.networks.access setting
- test: Updates project restrictions tests to check for restricted.networks.access setting
- lxd/apparmor: allow rw access to /sys/fs/bpf
- api: Adds storage_buckets_local extension
- shared/util: Adds HTTPSStorageBucketsDefaultPort constant
- lxd/endpoints: StorageBucketsServer listener
- lxd/api/1.0: Updates doApi10UpdateTriggers to handle core.storage_buckets_address
- scripts/bash/lxd-client: Adds core.storage_buckets_address
- lxd/node/config: Adds core.storage_buckets_address support
- lxd/storage/s3/types: Add S3 types
- lxd/storage/s3/headers: Adds AuthorizationHeaderAccessKey function
- lxd/storage/s3/policy: Adds policy generator
- lxd/storage/s3/miniod: Adds miniod package
- gomod: Adds GitHub - minio/madmin-go: The MinIO Admin Go Client SDK provides APIs to manage MinIO services
- lxd/db/storage/buckets: Adds GetStoragePoolLocalBucket function
- lxd/db/storage/buckets: Adds GetStoragePoolLocalBucketByAccessKey function
- lxd/db/storage/buckets: Uses GetStoragePoolLocalBucketByAccessKey in CreateStoragePoolBucketKey and UpdateStoragePoolBucketKey
- lxd/storage/pool/interface: Adds ActivateBucket
- lxd/storage/pool/interface: Adds GetBucketURL definition
- lxd/storage/backend/mock: Adds ActivateBucket
- lxd/storage/backend/mock: Adds GetBucketURL
- lxd/storage/backend/lxd: Implements local bucket support
- lxd/storage/drivers: Renames BucketURL to GetBucketURL for consistency
- lxd/storage/drivers/driver/dir: Add bucket support
- lxd/storage/drivers/driver/lvm: Add bucket support
- lxd/storage/drivers/driver/btrfs: Add bucket support
- lxd/storage/drivers/driver/zfs: Add bucket support
- lxd/storage/buckets: Use pool.GetBucketURL()
- lxd/api: Adds storageBucketsServer
- lxd/daemon: Initialise StorageBucketsServer listener in init
- lxd/daemon: Shutdown minio processes during Stop
- doc: Updates docs for local storage bucket support
- test: Update storage buckets tests
- lxd/db/generate/db/mapping: Add field-to-sql clause conversion helpers
- lxd/db/generate/db/stmt: Rework statement generation
- lxd/db/cluster/nodes: Generate ID statement for nodes
- lxd/db/cluster/snapshots: Remove ‘via’ tag and replace with ‘joinon’ tag
- lxd/db/cluster/mapper: Update generated code
- lxd/db/generate/db/stmt: Expect full database package path in arguments
- lxd/db/generate/db/stmt: Fallback to database package for parsing existing variables
- lxd/db/generate/README: Update lxd-generate README
- lxd/network/driver/bridge: Consider a dnsmasq start failure as a network start failure
- lxd/warnings: Fix
lxc warning show
- doc: move live migration content
- doc: cosmetic changes
- lxc/config/default: Change DefaultConfig to a function
- lxc/config: DefaultConfig usage
- test: Add tests to check for
lxc warning show
functionality - doc/migration: clarify how to enable live migration for VMs
- GetAllXattr: handle overlay filtering
- lxd/db: Remove GetLocalStoragePoolVolumes and storagePoolVolumesGet functions
- lxd/db/storage/pools: Removes GetStoragePoolVolume
- lxd/storage/utils: Updates VolumeDBGet to return *db.StorageVolume and use tx.GetStoragePoolVolume
- lxd/storage/backend/lxd: Replace b.state.DB.Cluster.GetLocalStoragePoolVolume with VolumeDBGet usage
- lxd/api/internal: Replace d.db.Cluster.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
- lxd/cluster/connect: Replace s.DB.Cluster.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
- lxd/daemon/storage: Replace s.DB.Cluster.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
- lxd/db/storage/volume/snapshots: Replace c.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
- lxd/db/storage/volumes: Replace c.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
- lxd/device/disk: Replace d.state.DB.Cluster.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
- lxd/storage/pool/load: Replace state.DB.Cluster.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
- lxd/storage/volumes: Replace d.db.Cluster.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
- lxd/storage/volumes/backup: Replace d.db.Cluster.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
- lxd/storage/volumes/snapshot: Replace d.db.Cluster.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
- lxd/storage/volumes/state: Replace d.db.Cluster.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
- lxd/db/storage/volumes: Removes inefficient storagePoolVolumeGetType and associated functions
- lxd/db: Removes storageVolumeIDsGet and storagePoolVolumeReplicateIfCeph
- lxd/db/generate/db/mapping: Use ‘join’ tag to deduce column name
- lxd/db/generate/db/mapping: Override joined column name with ‘joinon’ tag
- lxd/storage/s3/miniod: Use a sub-directory for minio on storage volume
- shared/subprocess/proc: Adds context support
- shared/subprocess/manager: Removes redundant error return value from NewProcessWithFds
- lxd/archive/archive: subprocess usage
- lxd/device: subprocess usage
- lxd/instance/drivers/driver/qemu: subprocess usage
- lxd/network/driver/bridge: subprocess usage
- lxd/apparmor/archive: Use non-deferenced outputPath to derive profile name in archiveProfile
- gomod: Updates dependencies
- shared/logger/log: Don’t modify the global logrus standard logger
- shared/util/linux: Update GetAllXattr implementation using github.com/pkg/xattr
- gomod: Adds github.com/pkg/xattr
- shared/idmap/idmapset/linux: Improve errors in doUidshiftIntoContainer
- shared/idmap/idmapset/linux: Go vet fixes in doUidshiftIntoContainer
- lxd: Fix calls to inst.Project().Name when used in fmt.Sprintf and related functions
- Makefile: Fix shellcheck version detection
- Makefile: Use same pinned version of golangci-lint as github workflows
- lxd/db/generate/db/method: Use QueryRowContext for one-row queries
- lxd/db/cluster/mapper: Update generated code
- lxd/db/query/objects: Include context in db query helpers
- lxd/db/generate/db/method: Pass context to query helpers
- lxd/db/cluster/mapper: Update generated code
- lxd: Pass transaction ctx through to query helpers
- lxd/test: Update tests
- lxd/db/db: Include context in node Transaction
- lxd: Update node.Transaction usages
- lxd: Pass node transaction ctx to query helpers
- lxd/db/schema/schema: Add context to schema updates
- lxd/firewall/drivers/drivers/nftables: Pass rules via stdin rather than as command arguments
- lxd/networks: Don’t log all networks initialized if they weren’t yet
- gomod: go mod tidy
- lxd/networks: Start deferred networks depending on physical interfaces before logical ones
- lxd/storage/backend/lxd: Log pool names in Mount and Unmount
- lxd/db/query/retry: Don’t log not found errors in Retry
- lxd/network/openvswitch/ovn: Check that the chassis is a member of the correct chassis group in ChassisGroupChassisDelete
- lxd/db/images: Adds project support to UpdateImageLastUseDate
- lxd/db/images: Adds project and custom last used date support to SetImageCachedAndLastUseDate
- lxd/db/images: Make CreateImage project argument and explicit string type
- lxd/images: d.db.Cluster.SetImageCachedAndLastUseDate usage
- lxd/daemon/images: d.db.Cluster.SetImageCachedAndLastUseDate usage
- lxd/daemon/images: Ensure cached property is maintained when using existing image from another project
- lxd/instance: s.DB.Cluster.UpdateImageLastUseDate usage
- test/README: Use backticks for test env var options
- test/README: Clarify options which enable tests
- test/README: Removes unused LXD_SKIP_STATIC
- test: Adds LXD_SKIP_TESTS env var option
- lxd/db: Replace usage of QueryRow with QueryRowContext
- lxd/db: Add context arg to more tx methods
- lxd/db: Replace tx.Query with tx.QueryContext
- lxd: Pass transaction ctx to QueryContext
- lxd/patches: Use context.TODO for db patch calls to query helpers
- lxd/test: Update tests
- lxd/db/generate/db/method: Remove superfluous error check for GetID
- lxd/db/cluster/mapper: Update generated code
- lxd/device: Support sr-iov infiniband for VMs
- doc/instances: Add VM to supported instance types for infiniband devices
- build(deps): bump actions/checkout from 2 to 3
- build(deps): bump actions/setup-go from 2 to 3
- doc/performance: create new pages
- doc/performance: move content from production setup
- shared/osarch: Improve 32bit arm handling
- shared/validate/validate: Add IsX509Certificate validator
- shared/validate/validate: Remove List validators
- lxd/network/driver/physical: Update usages
- lxd/network/driver/physical: Fix ipv4.routes validation
- lxd/storage/drivers/driver/dir/volumes: Don’t allow creating a volume that already exists on disk
- lxd/storage/backend/lxd: Delete local volume if bucket creation fails
- lxd/storage/drivers/volume: Create bucket local storage volumes using same permissions as custom volumes
- lxd/storage/s3/miniod/miniod: Run MinIO as LXD’s unprivilged user
- lxd/storage/backend/lxd: miniod.EnsureRunning usage
- doc: update footer to display correctly
- test: Adds LXD_REQUIRED_TESTS support
- test: Updates test_storage_buckets to check for minio command
- lxd/device/device/common: Fix project name in device logger
- doc/security: edit information about name leakage
- doc/performance: clean up information about txqueuelen
- doc/performance: clean up page about production setup server settings
- doc/performance: move production setup page
- doc/metrics: make part of the Metrics documentation reusable
- doc/performance: update the performance tuning information
- doc/spellcheck: add benchmarking to wordlist
- Drop
replace
directive in go.mod - Update gomod
- client: Handle nil args in CopyImage
- doc/performance: add how-to guide for benchmarking
- doc/lxc-to-lxd: update installation command
- doc/storage: add information about special custom volumes
- doc/storage: add link to YouTube video about storage volumes
- doc/storage: add links between storage documentation
- doc/instance API: add link to YouTube video
- lxd/events: Add simpleListenerConnection
- lxd/cluster/config: Add Loki config keys
- lxd/events: Remove closed listeners
- lxd/events: Add internal listener
- lxd/daemon: Add internal event listener to Daemon
- Update gomod
- lxd/loki: Support Loki server
- lxd: Support Loki server
- doc/server: Add Loki config
- api: Add loki API extension
- i18n: Update translations from weblate
- gomod: Update dependencies
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