LXD 6.5 has been released

Introduction

The LXD team would like to announce the release of LXD 6.5!

This is the fifth feature release in the 6.x series.

It includes many new features and improvements.

Thank you to everyone who contributed to this release!

New features and highlights

Control the virtiofs I/O thread pool size for VM directory disks

When adding a virtiofs disk device to a VM (one that shares a host directory with the guest) it is now possible to specify the thread pool size that the virtiofsd process (that LXD starts) will use. This can be useful for improving the I/O throughput for directory based shares into a guest when there are multiple concurrent I/O operations.

E.g.

lxc config device add my-vm my-disk \
    source=/a/host/directory path=/path/in/guest \
    io.threads=64 # Increases from the default of no thread pool.

Documentation: Type: disk - io.threads
API extension: disk_io_threads_virtiofsd

Support for OIDC authentication client secret

Added support for the oidc.client.secret configuration key. If set, the LXD server will use this value in the OpenID Connect (OIDC) authorization code flow, which is used by LXD UI.

This allows using OIDC authentication with Identity Providers that require a client secret (such as Google).

Documentation: Server configuration - oidc.client.secret
API extension: oidc_client_secret

PCI hotplug (from Incus)

Added support for hotplugging pci devices.

E.g.

# Get address of device on LXD host
lspci
...
03:00.1 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
...

# Add it to LXD VM
lxc config device add v1 my-device pci address=03:00.1
lxc exec v1 -- lspci
...
06:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
...

API extension: pci_hotplug

Removal of instance devices via PATCH API request

The PATCH /1.0/instances/{name} endpoint now allows removing an instance device by setting its value to null in the devices map.

API extension: device_patch_removal

VM compatibility for QEMU >= 9.1(non-snap) (from Incus)

It is now possible to use LXD VMs with QEMU version >= 9.1.
At this time the LXD snap is bundling the Ubuntu Noble QEMU 8.2.2, however it means that non-snap users can now use a newer QEMU. This also lays the ground work for moving to a newer QEMU version in the LXD snap for the next LTS release.

Show info for macvlan type networks

The lxc network info <network> command now returns information about the parent interface of a macvlan type network, whereas previously an error was returned.

Server image and backup volume improvements

When using the storage.backups_volume and storage.images_volume settings previously LXD would update an internal symlink from the LXD_DIR/{backups,images} to point to the respective mount path of the custom volume specified.

This is now no longer necessary and instead LXD directly accesses the relevant custom volume mount path. The LXD_DIR/{backups,images} directories are now only used when custom volume server storage is not specified.

Additionally it is now possible to use the same volume for the storage.images_volume and storage.backups_volume settings.

VM directory disk device hotplug and hotunplug improvements

It is now possible to hotplug a directory disk device whilst the guest OS is booting and the lxd-agent will still detect it and mount it when it starts because the agent-mounts file in the exported config drive is now updated when disk devices are hotplugged.

Additionally when a directory disk device is removed from a running VM the removal devlxd event is now handled by the lxd-agent and causes the directory to be unmounted in the guest too.

Removal of CRIU from the LXD snap

CRIU has been removed from the LXD snap as part of the first phase of removing CRIU support entirely from LXD.

This means that containers will no longer support being statefully stopped, snapshotted or migrated.

This feature has not been functioning well for sometime due to the very specific requirements it placed on the guest container OS and has been deemed too niche to retain.

Dark mode for LXD-UI

The UI will adjust the to system theme automatically. Users can force a dark or light mode in the settings.

Storage buckets in LXD-UI

  • Added support for creating and listing of storage buckets.
  • Added support for management of storage bucket keys.

Networking in LXD-UI

  • Added support for management of network types macvlan and sriov.
  • Introduced new network details page for displaying active IP leases.
  • Introduced new IPAM page under networks, which unifies IP address management.
  • Added an option to download ACL logs.
  • The network bridge configuration has a new setting for bridge.external_interfaces.
  • Added the mac address in the instance detail page and instance list side panel.

Server hardware in LXD-UI

  • Surfacing information about server hardware

Clustering in LXD-UI

  • Added support for configuring cluster member evacuation and restoration modes.
  • Additionally, error and success state handling has been improved for both actions.
  • New distinct pages for cluster members and groups
  • New cluster member detail pages with hardware details
  • Edit cluster member details.

Export and import of storage volumes

  • Added LXD UI option to export custom storage volumes, enabling manual backups.
  • Added option to import custom storage volumes, enabling restore of backups.

Snap packaging dependency updates

  • criu: Removed - no longer supported.
  • dqlite: Bump to v1.18.2
  • lxd-ui: Bump to 0.18
  • nvidia-container-toolkit: Bump to v1.17.7
  • qemu: Bump to import/1%8.2.2+ds-0ubuntu1.8
  • zfs: Bump to zfs-2.3.3 and zfs-2.2.8
  • go: Bump to 1.24.4

Complete changelog

Here is a complete list of all changes in this release:

Full commit list
  • feat(csp) harden content security policy for the ui serving to include only an allowed list of domains
  • shared/api: Add missing struct tags (musttag)
  • lxd/storage/s3: Add missting struct tags (musttag)
  • lxd/network: Add missing struct tags (musttag)
  • lxd/cluster: Add missing struct tags (musttag)
  • lxd: Add missing struct tags (musttag)
  • doc/support: LXD 4.0 is out of standard support
  • doc/support: LXD 5.0 now entered the extended support phase
  • doc: update howto/instances_routed_nic_vm.md
  • test/suites/backup: tell tar to stop scanning archive after finding the file we wanted
  • test/suites/image: tell tar to stop scanning archive after finding the file we wanted
  • github: provide pkg-config path to lxc.pc for TiCS run
  • test/deps/import-busybox: stop adding inittab
  • test/suites/clustering: improve grep patterns for checking dqlite segments
  • lxd/cluster/gateway: stop checking for remnants of LXD pre 4.0
  • dependabot: only track security updates for 5.0 gomod
  • lxc/network_zone: Fix typo in help description
  • i18n: Update translation templates.
  • github: Update TICS viewerURL
  • lxd: Add target request forwarding to storagePoolVolumeTypeStateGet
  • doc/howto/instances_create: provide direct link to all instance-types to not rely on autoindex
  • lxd/instance_instance_types: simplify downloadParse now that only the all-in-one optimised YAML is fetched
  • github: allow manually triggering documentation-linkcheck
  • test/mini-oidc/storage: use stdlib log/slog
  • lxd/cloudinit: Fix other formats of cloud-init user configuration options
  • lxc/action: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxc/info: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxc/list: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd-migrate/main_migrate: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/api_devlxd: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/api_internal: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/apparmor/instance: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/archive/archive: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/cgroup/abstraction: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/cgroup/file: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/cgroup/init: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/db/generate/db/method: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/db/networks: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/device/disk: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/device/nic_ipvlan: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/device/nic_routed: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/dnsmasq/dnsmasq: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/firewall/drivers/drivers_xtables: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/idmap/parse_linux: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/instance/drivers/driver_lxc: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/instance/instance_utils: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/instance_instance_types: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/ip/route: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/network/driver_bridge: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/network/driver_common: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/network/network_utils: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/network/openvswitch/ovn: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/network/openvswitch/ovs: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/network/zone/load: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/network/zone/zone: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/project/permissions: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/resources/cpu: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/resources/network: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/storage/connectors/connector_iscsi: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/storage/connectors/connector_nvme: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/storage/drivers/driver_btrfs_utils: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/storage/drivers/driver_btrfs_volumes: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/storage/drivers/driver_lvm_patches: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/storage/drivers/driver_zfs: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/storage/drivers/driver_zfs_utils: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/storage/drivers/utils_ceph: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxd/sys/os: use strings.SplitSeq() instead of strings.Split() (modernize)
  • shared/cmd/format: use strings.SplitSeq() instead of strings.Split() (modernize)
  • shared/proxy: use strings.SplitSeq() instead of strings.Split() (modernize)
  • shared/simplestreams/products: use strings.SplitSeq() instead of strings.Split() (modernize)
  • shared/util: use strings.SplitSeq() instead of strings.Split() (modernize)
  • shared/validate/validate: use strings.SplitSeq() instead of strings.Split() (modernize)
  • lxc/cluster: use maps operations where applicable (modernize)
  • lxc/config/default: use maps operations where applicable (modernize)
  • lxc/config_device: use maps operations where applicable (modernize)
  • lxc/copy: use maps operations where applicable (modernize)
  • lxc/move: use maps operations where applicable (modernize)
  • lxc/network: use maps operations where applicable (modernize)
  • lxc/network_acl: use maps operations where applicable (modernize)
  • lxc/network_forward: use maps operations where applicable (modernize)
  • lxc/network_load_balancer: use maps operations where applicable (modernize)
  • lxc/network_peer: use maps operations where applicable (modernize)
  • lxc/network_zone: use maps operations where applicable (modernize)
  • lxc/profile: use maps operations where applicable (modernize)
  • lxc/project: use maps operations where applicable (modernize)
  • lxc/storage: use maps operations where applicable (modernize)
  • lxc/storage_bucket: use maps operations where applicable (modernize)
  • lxc/storage_volume: use maps operations where applicable (modernize)
  • lxc/utils: use maps operations where applicable (modernize)
  • lxd-agent/exec: use maps operations where applicable (modernize)
  • lxd/api_1.0: use maps operations where applicable (modernize)
  • lxd/bgp/server: use maps operations where applicable (modernize)
  • lxd/cgroup/init: use maps operations where applicable (modernize)
  • lxd/cluster/config/config: use maps operations where applicable (modernize)
  • lxd/daemon_config: use maps operations where applicable (modernize)
  • lxd/db/cluster/permissions: use maps operations where applicable (modernize)
  • lxd/device/config/devices: use maps operations where applicable (modernize)
  • lxd/images: use maps operations where applicable (modernize)
  • lxd/init: use maps operations where applicable (modernize)
  • lxd/instance/instancetype/instance_utils: use maps operations where applicable (modernize)
  • lxd/instance_post: use maps operations where applicable (modernize)
  • lxd/loki/loki: use maps operations where applicable (modernize)
  • lxd/network/driver_bridge: use maps operations where applicable (modernize)
  • lxd/network/driver_common: use maps operations where applicable (modernize)
  • lxd/network/driver_ovn: use maps operations where applicable (modernize)
  • lxd/network/driver_physical: use maps operations where applicable (modernize)
  • lxd/networks: use maps operations where applicable (modernize)
  • lxd/node/config: use maps operations where applicable (modernize)
  • lxd/operations/operations: use maps operations where applicable (modernize)
  • lxd/resources/pci_vpd: use maps operations where applicable (modernize)
  • lxd/storage/backend_lxd: use maps operations where applicable (modernize)
  • lxd/storage/drivers/driver_common: use maps operations where applicable (modernize)
  • lxd/storage/drivers/driver_zfs_volumes: use maps operations where applicable (modernize)
  • lxd/storage/drivers/volume: use maps operations where applicable (modernize)
  • lxd/storage_pools: use maps operations where applicable (modernize)
  • lxd/util/config: use maps operations where applicable (modernize)
  • shared/util: use maps operations where applicable (modernize)
  • lxc/file: use min() or max() where applicable (modernize)
  • lxc/list: use min() or max() where applicable (modernize)
  • lxd/instance/drivers/driver_lxc: use min() or max() where applicable (modernize)
  • lxd/instance/drivers/driver_qemu: use min() or max() where applicable (modernize)
  • lxd/instances_get: use min() or max() where applicable (modernize)
  • lxd/loki/loki: use min() or max() where applicable (modernize)
  • lxd/main_init_interactive: use min() or max() where applicable (modernize)
  • lxd/migrate_storage_volumes: use min() or max() where applicable (modernize)
  • shared/ioprogress/tracker: use min() or max() where applicable (modernize)
  • lxc/list: use simpler for ... range loops where applicable (modernize)
  • lxc/list_test: use simpler for ... range loops where applicable (modernize)
  • lxc/network_acl: use simpler for ... range loops where applicable (modernize)
  • lxc/utils: use simpler for ... range loops where applicable (modernize)
  • lxc/utils_properties: use simpler for ... range loops where applicable (modernize)
  • lxd-agent/events: use simpler for ... range loops where applicable (modernize)
  • lxd-agent/exec: use simpler for ... range loops where applicable (modernize)
  • lxd-agent/main_agent: use simpler for ... range loops where applicable (modernize)
  • lxd-agent/state: use simpler for ... range loops where applicable (modernize)
  • lxd-benchmark/benchmark/batch: use simpler for ... range loops where applicable (modernize)
  • lxd-migrate/main_migrate: use simpler for ... range loops where applicable (modernize)
  • lxd/acme/acme: use simpler for ... range loops where applicable (modernize)
  • lxd/api_internal: use simpler for ... range loops where applicable (modernize)
  • lxd/api_metrics: use simpler for ... range loops where applicable (modernize)
  • lxd/apparmor/qemuimg_test: use simpler for ... range loops where applicable (modernize)
  • lxd/certificates: use simpler for ... range loops where applicable (modernize)
  • lxd/cgroup/init: use simpler for ... range loops where applicable (modernize)
  • lxd/cluster/gateway: use simpler for ... range loops where applicable (modernize)
  • lxd/cluster/membership: use simpler for ... range loops where applicable (modernize)
  • lxd/cluster/notify_test: use simpler for ... range loops where applicable (modernize)
  • lxd/db/cluster/update: use simpler for ... range loops where applicable (modernize)
  • lxd/db/db: use simpler for ... range loops where applicable (modernize)
  • lxd/db/generate/db/method: use simpler for ... range loops where applicable (modernize)
  • lxd/db/query/expr: use simpler for ... range loops where applicable (modernize)
  • lxd/db/query/retry: use simpler for ... range loops where applicable (modernize)
  • lxd/device/gpu_sriov: use simpler for ... range loops where applicable (modernize)
  • lxd/device/infiniband_sriov: use simpler for ... range loops where applicable (modernize)
  • lxd/device/pci/pci: use simpler for ... range loops where applicable (modernize)
  • lxd/device/proxy: use simpler for ... range loops where applicable (modernize)
  • lxd/device/tpm: use simpler for ... range loops where applicable (modernize)
  • lxd/dnsmasq/dnsmasq: use simpler for ... range loops where applicable (modernize)
  • lxd/endpoints/cluster: use simpler for ... range loops where applicable (modernize)
  • lxd/endpoints/metrics: use simpler for ... range loops where applicable (modernize)
  • lxd/endpoints/network: use simpler for ... range loops where applicable (modernize)
  • lxd/endpoints/object: use simpler for ... range loops where applicable (modernize)
  • lxd/endpoints/pprof: use simpler for ... range loops where applicable (modernize)
  • lxd/endpoints/vsock: use simpler for ... range loops where applicable (modernize)
  • lxd/images: use simpler for ... range loops where applicable (modernize)
  • lxd/instance/drivers/driver_lxc: use simpler for ... range loops where applicable (modernize)
  • lxd/instance/drivers/driver_qemu: use simpler for ... range loops where applicable (modernize)
  • lxd/instance_exec: use simpler for ... range loops where applicable (modernize)
  • lxd/instance_instance_types: use simpler for ... range loops where applicable (modernize)
  • lxd/instance_test: use simpler for ... range loops where applicable (modernize)
  • lxd/instances: use simpler for ... range loops where applicable (modernize)
  • lxd/instances_get: use simpler for ... range loops where applicable (modernize)
  • lxd/instances_post: use simpler for ... range loops where applicable (modernize)
  • lxd/loki/loki: use simpler for ... range loops where applicable (modernize)
  • lxd/lxd-metadata/lxd_metadata: use simpler for ... range loops where applicable (modernize)
  • lxd/metrics/metrics: use simpler for ... range loops where applicable (modernize)
  • lxd/network/driver_ovn: use simpler for ... range loops where applicable (modernize)
  • lxd/network/network_utils: use simpler for ... range loops where applicable (modernize)
  • lxd/network/openvswitch/ovs: use simpler for ... range loops where applicable (modernize)
  • lxd/resources/cpu: use simpler for ... range loops where applicable (modernize)
  • lxd/scriptlet/starlark: use simpler for ... range loops where applicable (modernize)
  • lxd/storage/connectors/connector_iscsi: use simpler for ... range loops where applicable (modernize)
  • lxd/storage/connectors/connector_nvme: use simpler for ... range loops where applicable (modernize)
  • lxd/storage/drivers/driver_lvm_utils: use simpler for ... range loops where applicable (modernize)
  • lxd/storage/drivers/utils: use simpler for ... range loops where applicable (modernize)
  • lxd/vsock/vsock: use simpler for ... range loops where applicable (modernize)
  • shared/cmd/table: use simpler for ... range loops where applicable (modernize)
  • shared/dnsutil/dnsutil: use simpler for ... range loops where applicable (modernize)
  • shared/filter/value: use simpler for ... range loops where applicable (modernize)
  • shared/util: use simpler for ... range loops where applicable (modernize)
  • shared/util_linux: use simpler for ... range loops where applicable (modernize)
  • shared/util_test: use simpler for ... range loops where applicable (modernize)
  • shared/validate/validate: use simpler for ... range loops where applicable (modernize)
  • lxc/list: use slices operations where applicable (modernize)
  • lxc/main_aliases: use slices operations where applicable (modernize)
  • lxc/network_zone: use slices operations where applicable (modernize)
  • lxd/cluster/events: use slices operations where applicable (modernize)
  • lxd/db/images: use slices operations where applicable (modernize)
  • lxd/device/device_utils_instance: use slices operations where applicable (modernize)
  • lxd/device/device_utils_unix: use slices operations where applicable (modernize)
  • lxd/device/nic_bridged: use slices operations where applicable (modernize)
  • lxd/devices: use slices operations where applicable (modernize)
  • lxd/endpoints/listeners/fancytls: use slices operations where applicable (modernize)
  • lxd/events/events: use slices operations where applicable (modernize)
  • lxd/firewall/drivers/drivers_xtables: use slices operations where applicable (modernize)
  • lxd/idmap/idmapset_linux: use slices operations where applicable (modernize)
  • lxd/images: use slices operations where applicable (modernize)
  • lxd/instance/drivers/driver_lxc: use slices operations where applicable (modernize)
  • lxd/instance/drivers/driver_qemu: use slices operations where applicable (modernize)
  • lxd/instance/operationlock/operationlock: use slices operations where applicable (modernize)
  • lxd/lxd-metadata/lxd_metadata: use slices operations where applicable (modernize)
  • lxd/network/driver_bridge: use slices operations where applicable (modernize)
  • lxd/network/driver_ovn: use slices operations where applicable (modernize)
  • lxd/network/openvswitch/ovs: use slices operations where applicable (modernize)
  • lxd/networks_utils: use slices operations where applicable (modernize)
  • lxd/storage/backend_lxd: use slices operations where applicable (modernize)
  • lxd/storage/drivers/driver_common: use slices operations where applicable (modernize)
  • lxd/storage/drivers/driver_zfs_volumes: use slices operations where applicable (modernize)
  • lxd/storage/drivers/utils: use slices operations where applicable (modernize)
  • lxd/storage/pool_load: use slices operations where applicable (modernize)
  • lxd/util/config: use slices operations where applicable (modernize)
  • lxd/util/net: use slices operations where applicable (modernize)
  • shared/api/error: use slices operations where applicable (modernize)
  • shared/osarch/architectures: use slices operations where applicable (modernize)
  • shared/util: use slices operations where applicable (modernize)
  • shared/validate/validate: use slices operations where applicable (modernize)
  • lxc/utils_properties: replace interface{} by any type (modernize)
  • lxd/ip/vdpa: replace interface{} by any type (modernize)
  • lxd/instance/drivers/driver_lxc: replace []byte(fmt.Sprintf...) by fmt.Appendf(nil, ...) (modernize)
  • lxd/cluster/upgrade_test: replace []byte(fmt.Sprintf...) by fmt.Appendf(nil, ...) (modernize)
  • lxd/storage/s3/policy: replace []byte(fmt.Sprintf...) by fmt.Appendf(nil, ...) (modernize)
  • lxd/storage/memorypipe/memory_pipe_test: replace context.WithCancel with t.Context (modernize)
  • lxc/cluster: s/FieldByJsonTag/FieldByJSONTag/g (revive)
  • lxc/config: s/FieldByJsonTag/FieldByJSONTag/g (revive)
  • lxc/network: s/FieldByJsonTag/FieldByJSONTag/g (revive)
  • lxc/network_acl: s/FieldByJsonTag/FieldByJSONTag/g (revive)
  • lxc/network_forward: s/FieldByJsonTag/FieldByJSONTag/g (revive)
  • lxc/network_load_balancer: s/FieldByJsonTag/FieldByJSONTag/g (revive)
  • lxc/network_peer: s/FieldByJsonTag/FieldByJSONTag/g (revive)
  • lxc/network_zone: s/FieldByJsonTag/FieldByJSONTag/g (revive)
  • lxc/profile: s/FieldByJsonTag/FieldByJSONTag/g (revive)
  • lxc/project: s/FieldByJsonTag/FieldByJSONTag/g (revive)
  • lxc/storage: s/FieldByJsonTag/FieldByJSONTag/g (revive)
  • lxc/storage_bucket: s/FieldByJsonTag/FieldByJSONTag/g (revive)
  • lxc/storage_volume: s/FieldByJsonTag/FieldByJSONTag/g (revive)
  • lxc/utils_properties: s/FieldByJsonTag/FieldByJSONTag/g (revive)
  • lxc/utils_properties_test: s/FieldByJsonTag/FieldByJSONTag/g (revive)
  • lxc/utils_properties: verify type casting operation for error
  • shared/filter/value: verify type casting operation for error
  • lxd/endpoints/network: ignore prealloc hint
  • lxd/cgroup/file: add comments to exported functions (revive)
  • lxd/scriptlet/starlark: add comments to exported functions (revive)
  • shared/proxy: add comments to exported functions (revive)
  • shared/osarch/architectures: add comments to exported functions (revive)
  • lxd/ip/vdpa: fix comment for exported struct (revive)
  • shared/osarch/architectures: avoid _ in variable names (revive)
  • shared/osarch/architectures: silence revive for arch constants being all in caps
  • shared/osarch/architectures: silence revive about ID in ArchitectureId not being capitalized properly
  • build(deps): bump redhat-plumbers-in-action/differential-shellcheck
  • build(deps): bump github.com/NVIDIA/nvidia-container-toolkit
  • github: fix copy-n-paste error in step name in tests workflow
  • lxc: Prevent panic when overwriting the progress renderer
  • lxd/images: Simplify client struct setup and reduce var scope in distributeImage
  • lxd/images: Move per-member image distribute code into local function in distributeImage
  • lxd/images: Simplify skipping image distribution
  • lxd/images: Simplify detecting early cancellation in distributeImage
  • test: Use full image fingerprint in test_clustering_image_refresh
  • lxd/daemon/images: Improve logging in ImageDownload
  • lxd/images: Improve logging in distributeImage
  • lxd/images: Improve logging in autoUpdateImage
  • test: Update test_clustering_image_refresh with checks for correct image file distribution
  • lxd/network/driver/macvlan: Add State() function
  • test: Output test stages in test_container_devices_nic_macvlan
  • test: Check that lxc network info succeeds for macvlan network
  • lxd/cloudinit: Fix parsing of invalid cloud-init yaml
  • lxd/cloudinit: Fix behavior when vendor-data parsing fails and when user-data are not provided.
  • github: fix conditional around optionally skipping unit tests
  • github: Don’t modify go modules during go test
  • Makefile: Don’t modify go modules during go test
  • dependabot: disable schedule to only deal with security updates for 5.0 gomod
  • test/lint/shellcheck.sh: new wrapper around shellcheck
  • Makefile: shellcheck is now run through a lint script
  • Makefile: Pin dqlite to last known good version
  • test/suites/auth: use gen_cert_and_key helper to generate ecdsa certs instead of (slow) rsa4096
  • test/suites/auth: use cert_fingerprint helper to get cert fingerprints
  • lxd/db/query/retry: Detect extended busy codes from sqlite3 in IsRetriableError
  • lxd/db/db: Replaces EnterExclusive and ExitExclusive with RunExclusive
  • lxd/cluster/membership: Switch Bootstrap over to RunExclusive
  • lxd/cluster/membership: Switch Join over to RunExclusive
  • lxd/cluster/membership: Switch Assign over to RunExclusive
  • test: Fan network name can be too long when prefix + “fan” is used
  • lxd/images: Improve logging and remove unnecessary tmp vars in autoUpdateImages
  • lxd/images: Reduce unnecessary transactions by doing more in earlier transaction in autoUpdateImages
  • lxd/images: Reduce repeat queries by accepting slice of db.NodeInfo in distributeImage
  • lxd/images: Update imageRefresh to pass db.NodeInfo slice to distributeImage
  • lxd/images: Use passed context in autoUpdateImagesTask before any mutation has been made
  • lxd/images: Removes unnecessary err var in autoUpdateImages
  • lxd/images: Support retrying image record deletion in autoUpdateImages
  • github: add golangci/golangci-lint-action v8
  • github: add a note that golangci-lint also requires non-shallow clone
  • github: stop exporting github.event.before var
  • Makefile: use latest golangci-lint when installing locally
  • test/lint/golangci: skip if golangci/golangci-lint-action already ran
  • test/lint/shellcheck: only skip when doing PR tests
  • lxd/db/node: node ID is a int64
  • lxd/db/node: rename GetNodeWithID to getNodeByID for consistency
  • lxd/db/node: update comment to match func name
  • lxd/instance_console: avoid unused operation param in connect funcs
  • lxd/instance_file: avoid unused request param in instanceFileGet()
  • lxd/backup: avoid unused state param in volumeBackupWriteIndex()
  • lxd/instance_post: avoid unused request and stateful params in instancePostClusteringMigrateWithRemoteStorage
  • lxd/main_init_interactive: drop unused instance server param in askClustering()
  • lxd/main_init_interactive: drop unused instance server param in askMAAS()
  • lxd/main_init_interactive: drop unused instance server param in askDaemon()
  • lxd/images: accumulate node IDs while building the node list
  • lxd/storage/drivers/cephfs: Add getMountOptions func
  • lxd/storage/drivers/cephfs: Use getMountOptions func for common options
  • lxd/storage/drivers: Add optimistic context to TryMount
  • lxd/storage/drivers: Pass context to TryMount
  • doc: Update storage docs - Backup Volumes [WD-22293]
  • test: Check network info shows correct MTU for macvlan net
  • lxd/storage: Silent the static analysis tool on unsatized user input on backup rename
  • lxd/daemon: Fix typo in comment
  • lxd/daemon_images: Remove unnecessary Sprintf() call
  • lxd/state: Add functions for images and backups storage
  • lxd/daemon: Use dedicated functions for images and backups storage rather than generic shared.VarPath()
  • lxd/api/1.0: Rename arguments of func doAPI10UpdateTriggers()
  • lxd/daemon: Don’t create symlinks for backups and images storage
  • lxd/daemon: Do not create {images,backups} directories if storage.{images,backups} config is set
  • lxd/patches: Remove backups and images symlinks
  • test/suites/serverconfig: Fix test after removal of symlinks for images and backups storage
  • test/suites/serverconfig: Add tests for unsetting of storage.{backups,images}_volume
  • test/suites/clustering: Add tests for image replication with dedicated image storage
  • devlxd-client: Adds cloud-init support
  • test/suites/cloud-init: Add tests for cloud-config
  • lxd/db/db: Rework RunExclusive to use context with timeout internally
  • test/suites/exec: factor out exec_container_{,non}interactive() funcs
  • test/suites/concurrent: simplify and speed up test
  • test/suites/concurrent: simplify how CPUs are counted
  • test/suites/concurrent: drop LXD_CONCURRENT variable
  • test/suites/exec: drop LXD_CONCURRENT variable
  • test/README: drop LXD_CONCURRENT variable
  • github: remove now defunct LXD_CONCURRENT variable
  • lxd/request: Add request source address context key
  • lxd/daemon: Always set request source address to context
  • lxd/request: Helper func to check request context
  • lxd/cluster/connect: Make Connect accept request context instead of the request
  • lxd: Update usage of cluster.Connect
  • lxd: Make operationsGetByType accept request context instead of the request
  • lxd: Update usage of operationsGetByType
  • lxd/request: Make CreateRequestor accept context instead of the request
  • lxd: Update usage of request.CreateRequestor
  • lxd/operations: Make SetRequestor accept context instead of a request
  • lxd: Update usage of operation.SetRequestor
  • lxd/response: Remove unused request input param from ForwardResponse
  • lxd: Remove unused request input response.ForwardResponse
  • lxd: Make operationCancel accept context instead of the request
  • lxd: Update usage of operationCancel
  • lxd/operations: Make OperationCreate accept context instead of a request
  • lxd: Update usage of operation.OperationCreate
  • lxd/project/limits/permission: Make CheckTarget accept context instead of a request
  • lxd: Update usage of limits.CheckTarget
  • lxd/cluster/connect: Make ConnectIfInstanceIsRemote accept context instead of a request
  • lxd: Update usage of cluster.ConnectIfInstanceIsRemote
  • lxd: Make request forwarders accept context instead of a request
  • lxd: Update usage of request forwarders
  • lxd/project: Make FilterUsedBy accept context instead of a request
  • lxd: Update usage of project.FilterUsedBy
  • lxd/api_cluster: Make changeMemberRole accept context instead of a request
  • lxd: Update usage of changeMemberRole
  • lxd/api_cluster: Make rebalanceMemberRoles accept context instead of a request
  • lxd: Update usage of rebalanceMemberRoles
  • lxd: Make instanceImageTransfer accept context instead of a request
  • lxd: Update usage of instanceImageTransfer
  • lxd: Make ensureImageIsLocallyAvailable accept context instead of a request
  • lxd: Make instanceRebuildFromImage accept context instead of a request
  • lxd/daemon_images: Make ImageDownload accept context instead of a request
  • lxd: Update usage of ImageDownload
  • lxd: Make ensureDownloadedImageFitWithinBudget accept context instead of a request
  • lxd: Make imgPostInstanceInfo accept projectName instead of a request
  • lxd: Make imgPostURLInfo accept context instead of a request
  • lxd: Make imgPostRemoteInfo accept context instead of a request
  • lxd/instances_post: Make createFromImage accept context instead of a request
  • lxd/instances_post: Make createFromNone accept context instead of a request
  • lxd/instances_post: Make createFromMigration accept context instead of a request
  • lxd/instances_post: Make createFromConversion accept context instead of a request
  • lxd/instances_post: Make clusterCopyContainerInternal accept context instead of a request
  • lxd/instances_post: Make createFromCopy accept context instead of a request
  • lxd/instance_post: Make instancePostClusteringMigrate accept context instead of a request
  • lxd: Make migrateInstance accept context instead of a request
  • lxd/images: Ensure context is never parsed from nil request
  • doc/howto: Add how-to for Ubuntu Pro guest attachment.
  • doc: Add ubuntu pro how-to to instance toc tree.
  • lxd/instance/instancetype: Update ubuntu pro config description.
  • doc: Update metadata
  • build(deps): bump golang.org/x/crypto from 0.38.0 to 0.39.0
  • build(deps): bump github/codeql-action from 3.28.18 to 3.28.19
  • build(deps): bump github.com/pkg/xattr from 0.4.10 to 0.4.11
  • build(deps): bump github.com/canonical/go-dqlite/v3 from 3.0.0 to 3.0.1
  • build(deps): bump golang.org/x/tools from 0.33.0 to 0.34.0
  • test/main: do not create TEST_DIR in pwd
  • test/main: allow TEST_DIR to be have the other’s sticky bit on
  • test/main: add special test-shell fake test
  • test/main: deactivate all traps when entering cleanup()
  • Makefile: rework make deps and make env targets
  • Makefile: add make test-shell target
  • doc/lxd-test.yaml: profile to use for building and testing LXD
  • CONTRIBUTING: add section on dev environment setup
  • doc/contributing: fix typo
  • lxd/request: Add context key that indicates devLXD over vsock
  • lxd/api_vsock: Rename variable indicating vsock usage
  • lxd/api_devlxd: Rename variable indicating vsock usage
  • lxd/devlxd: Indicate vsock usage in request context
  • lxd/response: Determine DevLXD response format based on vsock usage
  • lxd/response: Remove rawResponse param from devLXD response funcs
  • lxd/devlxd: Adjust devLXD responses
  • client/connection: DevLXD connect over vsock (for VMs)
  • client/devlxd: Handle responses from devLXD over vsock
  • client/devlxd_config: Add function to retrieve config key URL paths
  • lxd-agent/devlxd: Helper function to init devLXD client
  • lxd-agent/devlxd: Use devLXD client in APIGet handler
  • lxd-agent/devlxd: Use devLXD client in APIPatch handler
  • lxd-agent/devlxd: Use devLXD client in ConfigGet handler
  • lxd-agent/devlxd: Use devLXD client in ConfigKeyGet handler
  • lxd-agent/devlxd: Use devLXD client in MetadataGet handler
  • lxd-agent/devlxd: Use devLXD client in DevicesGet handler
  • lxd-agent/devlxd: Remove old helper func to get vsock client
  • lxd-agent/devlxd: Use devLXD client in UbuntuPro handlers
  • github: switch to 24.04 runners for code tests job
  • github: switch to 24.04 runners for system tests job
  • github: switch to 24.04 runners for TiCS job
  • github: stop purging LXD snap in system tests
  • test/suites/clustering: update string searched in udhcpc output
  • lxd/api_cluster: Reject invalid ClusterMemberStatePost.Mode in evacuateInstances
  • shared/api: Include valid modes in ClusterMemberStatePost.Mode comment
  • doc/rest-api: Refresh swagger YAML
  • Revert “github: stop purging LXD snap in system tests”
  • Revert “github: switch to 24.04 runners for system tests job”
  • Revert “github: switch to 24.04 runners for code tests job”
  • CONTRIBUTING: add an examples to the make test-shell session
  • test/main: only report disk usage on failure
  • test/main: reduce verbosity of test-shell closure
  • doc: add bash-completion to lxd-test profile
  • test/main: use custom bashrc for test-shell
  • test/test-shell.bashrc: add custom bashrc for lxc completion
  • test/main: switch to the test dir if needed
  • test/main: consistently use /home/sdeziel/git/lxd
  • lxd/api_1.0: Update context
  • lxd/api_cluster: Update context
  • lxd/api_internal: Update context
  • lxd/daemon: Update context
  • lxd/api_project: Update context
  • lxd/certificates: Update context
  • lxd/network: Update context
  • lxd/profiles: Update context
  • lxd/storage: Update context
  • lxd/warnings: Update context
  • lxd/instance: Update context
  • lxd/api_cluster: Remove unused *http.Request parameter from evacuateMigrateFunc function type
  • lxc/remote/add: Fixed runtime error (index out of range [0] with length 0)
  • test/suites/lxd-benchmark: new test script for lxd-benchmark
  • test/main: run lxd-benchmark basic tests in standalone group
  • lxd/storage: Fix comment
  • lxd/backup/config: Fix error messages
  • lxd/backup: Move type constants into config package
  • lxd/backup: Update package location for types
  • lxd/backup/config: Narrow down root volume lookup
  • client/devlxd: Add protocol field indicating vsock connection
  • client/connection: Determine vsock usage when connecting to devLXD
  • client/devlxd: Simplify vsock check
  • client/devlxd_config: Ensure retrieved config value is unescaped
  • client/devlxd_metadata: Ensure retrieved metadata is unescaped
  • github: use actions/setup-python to cache pip dependencies
  • github: do not wrap bash in script for colored output (enabled by default)
  • Makefile: Add make update-fmt
  • doc: Update CONTRIBUTING.md with formatting instructions
  • test/suites/auth: test for emptiness using shell comparison
  • test/lint/bad-grep: check test scripts for `grep` misuse
  • test/suites/auth: avoid grep -q and use more precise patterns where possible
  • test/suites/basic: avoid grep -v verdict when checking for instances
  • test/suites/migration: replace grep -Fv by shell comparison
  • test/suites/container_devices_nic_bridged_filtering: avoid grep -v verdict when checking for volatile NIC cleanup
  • test/suites/container_devices_nic_macvlan: avoid grep -v verdict when checking for volatile NIC cleanup
  • test/suites/container_devices_nic_sriov: avoid grep -v verdict when checking for volatile NIC cleanup
  • test/suites/container_devices_infiniband_physical: avoid grep -v verdict when checking for volatile NIC cleanup
  • test/suites/container_devices_infiniband_sriov: avoid grep -v verdict when checking for volatile NIC cleanup
  • test/suites/serverconfig: simplify check for only TLS auth by default
  • test/suites/serverconfig: avoid grep -v verdict when checking untrusted server access
  • test/suites/waitready: replace grep -q by full line checks
  • lxd/request: Remove unused context key Access
  • lxd/request: Introduce request context info
  • lxd: Set request info
  • lxd/request: Add SourceAddress to request info
  • lxd: Use SourceAddress from context info
  • lxd/request: Remove unused CtxRequestSourceAddress context key
  • lxd/request: Add auth information to request info
  • lxd: Use auth info from request info
  • lxd/request: Remove unused auth context key constants
  • lxd/request: Add connection to request info
  • lxd: Use connection from request info
  • lxd/request: Remove unused connection context key constant
  • lxd/request: Add effective project name to request info
  • lxd: Use effective project name from request info
  • lxd/request: Remove unused effective project name context key constant
  • lxd/request: Rename GetCtxValue to GetContextValue
  • lxd: Rename occurances of GetCtxValue
  • lxd/request: Rename SetCtxValue to SetContextValue
  • lxd: Rename occurances of SetCtxValue
  • lxd/patches: Move {backups,images} into {backups,images} sub-directory if storage.{backups,images}_volume is set
  • lxd/daemon: Store {backups,images} in designated sub-directory if storage.{images,backups}_volume is set
  • lxd/daemon: Allow using the same volume as storage for backups and images at the same time
  • test/suites/serverconfig: Fix test after move of images and backup on external configured volume
  • test/suites/serverconfig: Add test for shared volume for storage.backups_volume and storage.images.volume
  • test/suites/clustering: Fix test after move of images and backup on external configured volume.
  • lxd/device: Remove unix socket file from host filesystem
  • lxd/device: Only remove unix socket file when bind=host
  • doc/installing: add btrfs-progs to packages needed for tests (for mkfs.btrfs)
  • doc/installing: add dosfstools to packages needed for tests (for mkfs.fat)
  • doc/installing: add e2fsprogs to packages needed for tests (for mkfs.ext4)
  • doc/installing: add xfsprogs to packages needed for tests (for mkfs.xfs)
  • doc/lxd-test: add missing tools for mkfs.${FS}
  • doc/lxd-test: do not install recommended packages
  • doc/lxd-test: disable unwanted services
  • test/main: explaining why errors from test-shell are ignored
  • test/main: set default backend after sourcing includes snippets
  • test/main: install tooling for storage driver (LXD_BACKEND) on-demand
  • github: stop unconditionally installing storage driver tooling in actions/install-lxd-runtimedeps
  • github: add e2fsprogs to actions/install-lxd-runtimedeps
  • github: add dosfstools to actions/install-lxd-runtimedeps
  • test/suites/migration: hard fail if a mkfs binary is missing
  • test/suites/storage_driver_zfs: hard fail if a mkfs binary is missing
  • tests: Add is_backend_available helper function
  • lxd/storage: Add reverter pattern inside UpdateCustomVolume
  • lxd/storage: Add missing revert statement to CreateCustomVolumeSnapshot
  • lxd/storage: Add reverter pattern inside RenameCustomVolumeSnapshot
  • lxd/storage: Add reverter pattern inside UpdateCustomVolumeSnapshot
  • test/suites/concurrent: ignore PIDs that vanished
  • github: add option to install optional dependencies in actions/install-lxd-runtimedeps
  • github: the LXD-UI tests also need the optional runtime deps
  • test/suites/basic: use empty instances where possible
  • test/suites/basic: avoid lxc rm
  • test/suites/basic: use shell comparisons
  • test/suites/basic: use shell comparisons
  • test/suites/basic: use cheaper lxc list
  • test/suites/clustering: use empty instances and cheaper lxc list
  • test/suites/concurrent: use cheaper lxc list
  • test/suites/container_move: use cheaper lxc list and shell comparisons
  • test/suites/exec: use cheaper lxc list and shell comparisons
  • test/suites/metrics: use cheaper lxc list
  • test/suites/projects: use cheaper lxc list and shell comparisons
  • test/suites/snapshots: rework test_snap_fail
  • test/suites/snapshots: use cheaper lxc list
  • doc/lxd-test: add nftables to runtime deps
  • doc/lxd-test: add iputils-ping to test deps
  • doc/lxd-test: add netcat-openbsd to test deps
  • doc/installing: add nftables to runtime deps with a note that iptables also works
  • doc/installing: iptables or nftables is required at runtime as well
  • doc/installing: add iputils-ping to test deps
  • doc/installing: add netcat-openbsd to test deps
  • test/main: check for ping and nc commands
  • test/deps/import-busybox: don’t hardcode path to busybox binary
  • test/includes/setup: don’t hardcode path to busybox binary
  • test/main: don’t hardcode path to busybox binary
  • test/deps/import-busybox: replace find_on_path by shutil.which()
  • test/deps/import-busybox: early exit in setup_alias()
  • test/deps/import-busybox: add --save-image that skips loading into LXD
  • test/includes/setup: log when importing LXD_TEST_IMAGE from disk
  • test/main: cache busybox testimage for reuse if multuple tests are to be run
  • test/main: make it possible to disable LXD_TMPFS
  • test/perf: make it possible to disable LXD_TMPFS
  • test/main: stop tracing earlier in cleanup()
  • test/suites/auth: use --empty image where applicable
  • test/suites/auth: use smaller images:busybox/1.36.1 instead of images:alpine/3.21
  • test/suites/container_devices_nic_bridged_filtering: replace grep -e by grep -F
  • test/suites/database: use cheaper mv operations
  • test/suites/database: use smaller tmpfs and replace dd by faster fallocate
  • test/suites/database: use --empty instance in out of disk DB test
  • test/suites/remote: remove dependency on colrm command
  • test/suites/tls_restrictions: test for emptiness using shell comparison
  • test/suites/migration: use small volumes
  • doc: add vGPU acronym for virtual GPU
  • build(deps): bump github/codeql-action from 3.28.19 to 3.29.0
  • build(deps): bump github.com/minio/minio-go/v7 from 7.0.92 to 7.0.93
  • build(deps): bump github.com/openfga/openfga from 1.8.13 to 1.8.15
  • build(deps): bump github.com/zitadel/oidc/v3 from 3.38.1 to 3.39.0
  • Revert “Makefile: Pin dqlite to last known good version”
  • lxd/device/device/utils/disk: Switch to modern --shared-dir virtiofsd flag to avoid path parsing bug in rust implementation
  • lxd/device/device/utils/disk: Switch to modern --xattr virtiofsd flag
  • lxd/device/device/utils/disk: Use explicit --cache auto virtiofsd flag
  • lxd/device/device/utils/disk: Enable --allow-direct-io virtiofsd flag
  • shared/validate: Adds IsUint16 function
  • api: Adds disk_io_threads_virtiofsd extension
  • lxd/device/device/utils/disk: Support specifying --thread-pool-size virtiofsd flag in DiskVMVirtiofsdStart
  • lxd/instance/drivers/driver/qemu: Use default thread pool size of 0 for virtiofsd config drive share
  • lxd/device/disk: Adds io.threads option for controlling virtiofsd thread pool size
  • doc: Update metadata
  • lxd/project/limits/permissions: Allow multiple checks per device type in checkInstanceRestrictions
  • lxd/project/limits/permissions: Forbid use of disk io.threads option in restricted project without restricted.virtual-machines.lowlevel allowed
  • doc/requirements: Document the requirement for virtiofsd rust version
  • lxd/cluster/connect: Add headers only if value is not empty
  • doc/ref/releases-snap: add new reference page about releases and snap
  • doc/howto/support: update support section of README.md and support howto
  • doc/installing: improve install instructions and focus on snap install
  • doc/howto/snap: improve manage snap how-to
  • doc/howto: move support and manage snaps how-tos out from getting started
  • doc: update lint exceptions
  • test/suites/basic: check --version and --help for all binaries
  • test/suites/basic: use cheaper lxc list
  • test/suites/basic: use long flag for --ephemeral instance
  • test/suites/basic: test bulk deletion of ephemeral instances
  • test/suites/basic: use cheaper lxc list
  • test/suites/basic: move trust cleanup at the end
  • test/main: call new test_basic_version
  • github: preserve LXD_TMPFS var for system-tests
  • test/main: bump LXD_TMPFS size for standalone on lvm
  • github: stop reclaiming disk space for system-tests
  • github: stop reclaiming disk space for TiCS run
  • github: purge LXD snap before running system-tests
  • github: purge LXD snap before TiCS run
  • lxd-agent: Add RSS metrics calculation
  • doc: add sphinx-sitemap to generate sitemap for SEO
  • doc: css to hide rtd versions flyout when printing
  • lxd/instance/drivers/driver/qemu: Check if disk is remote when migrating with an extra disk
  • lxd/instance/drivers/driver/qemu: Fix shared storage volume setup on cluster members
  • shared/api: Prefix UbuntuPro[Setting,GuestTokenResponse] structs with DevLXD
  • lxd/ubuntupro: Use new DevLXD structs
  • client/devlxd: Use new DevLXD structs
  • test/suites/lxd-benchmark: test report generation
  • test/suites/lxd-benchmark: test launch command
  • test/suites/migration: add the FS used on ZFS in block-mode to the pool names
  • test/suites/migration: only umount /sys/kernel/debug if criu is detected
  • test/suites/migration: compare creation dates by looking the properties
  • test/suites/backup: use --empty instance to check snap with hyphens
  • test/suites/backup: use --empty instance in UUID test
  • test/suites/clustering: use cheaper lxc list
  • test/suites/clustering: use --empty instances where possible
  • test/suites/clustering: replace import-busybox by ensure_import_testimage
  • test/suites/clustering: simplify instance state checking
  • test/suites/concurrent: use cheaper lxc list to replace lxc info
  • test/suites/config: use --empty instance in test_property()
  • test/suites/config: use --empty instance in test_property()
  • test/suites/config: simplify _ensure_removed()
  • test/suites/config: simplify _ensure_fs_umounted()
  • test/suites/config: simplify test_config_profiles()
  • test/suites/config: use --empty instance in test_config_edit()
  • test/suites/config: in test_property() use expiry dates far in the future
  • test/suites/config: use a small volume in test_property()
  • test/suites/config: use cheaper lxc config get --property
  • test/suites/config: in test_property(), [Ccheck if toggling the ephemeral cleans the instance on stop
  • test/suites/exec: sleep less in test_exec_exit_code()
  • test/suites/network_ovn: avoid using images:alpine/edge for tests
  • test/suites/storage_snapshots: use smaller volumes
  • test/suites/storage: use smaller volumes
  • test/suites/storage: use cheaper lxc list and shell comparisons
  • test/suites/storage: re-import testimage only if it was deleted
  • test/suites/storage: use smaller storage pools
  • test/suites/storage: use --empty instances where possible
  • test/suites/storage: replace lxc rm by lxc delete
  • test/suites/storage: use smaller root disk where possible
  • test/suites/storage: use smaller volumes
  • test/suites/shutdown: don’t needlessly import testimage
  • test/main: use noatime on tmpfs
  • test/main: start tracing later
  • test/main: report when cleanup() is called even if tracing is disabled
  • test/main: replace cat to read small files by bash inline reading
  • test/includes/clustering: replace cat to read small files by bash inline reading
  • test/includes/lxd: replace cat to read small files by bash inline reading
  • test/includes/oidc: replace cat to read small files by bash inline reading
  • test/includes/storage: replace cat to read small files by bash inline reading
  • test/suites/auth: replace cat to read small files by bash inline reading
  • test/suites/backup: replace cat to read small files by bash inline reading
  • test/suites/basic: replace cat to read small files by bash inline reading
  • test/suites/clustering: replace cat to read small files by bash inline reading
  • lxd/device: Add PostMigrateSend
  • lxd/instance: Add PostMigrateSend
  • lxd/migrate_instance: Add call to PostMigrateSend
  • lxd/instance_post: Update instancePostClusteringMigrate comment
  • tests/clustering: Add check for post-migration dnsmasq cleanup on source instance
  • doc/howto/storage/volumes: Disks have options not properties
  • doc/howto/storage/volumes: Cover VM io.* options in the storage-configure-IO section
  • Revert “test/main: use noatime on tmpfs
  • test: move is_backend_available() to test/includes/storage
  • test: move storage driver tools installation to test/includes/setup
  • scripts/empty-lxd: s/container/instance/
  • test/includes/lxd: s/container/instance/
  • test/includes/lxd: alpha-sort check_empty_table calls
  • test/includes/check: add runsMinimumKernel() helper
  • test/includes/check: make check_dependencies() usable in shell comparisons
  • test/includes/setup: add install_instance_drivers() helper
  • test/suites/basic: ascertain that VMs are supported if they are to be tested
  • test/suites/container_devices_disk: skip idmapped mount tests if on tmpfs with an old kernel
  • test/suites/vm: new test script for VM tests
  • test/suites/vm: avoid using old/incompatible virtiofsd
  • test/suites/vm: skip tests when on tmpfs with an old kernel
  • test/main: install VM tooling on demand (LXD_VM_TESTS=1)
  • test/main: run test_vm_empty in standalone group
  • test/README: document LXD_VM_TESTS
  • doc/lxd-test: enable LXD_VM_TESTS
  • github: optionally install QEMU packages in actions/install-lxd-runtimedeps
  • github: preserve LXD_VM_TESTS var for system-tests
  • github: give more time to the kernel to pick up new partitions created in actions/setup-microceph
  • test/includes/storage: mark lvm as unavailable on -kvm kernels
  • test/suites/container_devices_disk: don’t use force to delete foo
  • test/suites/container_devices_disk: combine stop/start into restart
  • test/suites/container_devices_disk_restricted: avoid using subshells
  • test/suites/container_devices_nic_bridged_acl: simplify profile creation
  • test/suites/container_devices_nic_bridged_acl: combine init+start into launch
  • test/suites/container_devices_nic_bridged_acl: use shell comparisons
  • test/suites/container_devices_nic_bridged_acl: simplify detection of DHCPv6 support
  • test/suites/container_devices_nic_bridged_filtering: simplify detection of DHCPv6 support
  • test/suites/container_devices_nic_bridged: simplify detection of DHCPv6 support
  • test/suites/container_devices_nic_bridged_filtering: don’t stop before forced deletion
  • test/suites/container_devices_nic_bridged_filtering: simplify profile creation
  • test/suites/container_devices_nic_macvlan: simplify profile creation
  • test/suites/container_devices_nic_bridged: simplify profile creation
  • test/suites/container_devices_nic_bridged_vlan: simplify profile creation
  • test/suites/container_devices_nic_p2p: skip on -kvm kernels
  • test/suites/container_devices_nic_bridged: skip on -kvm kernels
  • test/suites/migration: skip on -kvm kernels with dir
  • test/suites/template: skip on -kvm kernels with dir
  • test/suites/template: turn some comments into echo
  • test/suites/template: use simpler grep
  • doc/installing: add s3cmd to test deps
  • doc/installing: add openvswitch-switch to test deps
  • test/main: s3cmd is required by some tests
  • doc/lxd-test: add s3cmd package
  • doc/lxd-test: disable networkd-dispatcher.service
  • doc/lxd-test: disable needrestart
  • doc/lxd-test: add openvswitch-switch to test deps
  • doc/lxd-test: the VMs are not ephemeral
  • CONTRIBUTING: workaround problems with deleting an old lxd-test profile if in use
  • test/suites/idmap: don’t skip the test if there are not enough UIDs/GIDs
  • doc/lxd-test: allocate enough UIDs/GIDs for idmap test
  • test/main: output test duration in blue text
  • gitignore: add busybox image cache
  • test/suites/idmap: skip when run from virtiofs dir
  • Makefile: don’t hard-code make invocations
  • Makefile: do not build doc on make dist on GH PRs
  • lxd/daemon: Rename UnixSocket to GetUnixSocket
  • lxd/sys: Move GetUnixSocket
  • doc/custom_conf: rename variable used by sitemap to avoid conflict
  • doc/howto/snap: use lxd instead of lxd.daemon for services mgmt
  • lxd/device/disk: Clarify io.threads description
  • doc: Update metadata
  • lxd/instances_post: Use correct project on cross-project copy
  • build(deps): bump github.com/minio/minio-go/v7 from 7.0.93 to 7.0.94
  • build(deps): bump github.com/go-chi/chi/v5 from 5.2.1 to 5.2.2
  • build(deps): bump github.com/openfga/openfga from 1.8.15 to 1.8.16
  • shared: Add context parameter to GetRemoteCertificate
  • lxd-migrate: Pass context to GetRemoteCertificate
  • lxd: Pass context to GetRemoteCertificate
  • lxc/remote: Pass context to GetRemoteCertificate
  • api: Adds oidc_client_secret extension
  • lxd/cluster/config: Add oidc.client.secret
  • lxd/auth/oidc: Add client secret for the authorization code flow
  • lxd/daemon: Use oidc.client.secret for oidc verifier
  • lxd/api_1.0: Use oidc.client.secret for oidc verifier
  • lxd/patches: Update expected return values in OIDCServer() call
  • doc: Update metadata
  • doc: Add warnings regarding the use of OIDC client secret
  • test/suites/basic: avoid && false pattern when expecting failures
  • test/extras/stresstest: avoid && false pattern when expecting failures
  • test/suites/backup: use tmp dir created under ``
  • test/suites/projects: use tmp dir created under ``
  • test/suites/storage: use tmp dir created under ``
  • test/suites/storage: cleanup temporary dir
  • test/suites/storage: do not fail due to existing pool
  • test/suites/storage: use tmp file created under ``
  • test/suites/storage: cleanup temporary file
  • test/suites/storage_driver_dir: consistently use `` for temp file and dir
  • test/suites/storage_driver_dir: replace dd by fallocate and fix comment
  • test/suites/basic: don’t use same image alias prefix
  • doc/lxd-test: disable services individually
  • github: simplify and improve actions/reclaim-memory
  • github: speed up actions/disable-docker
  • github: be more verbose when pkill’ing something in actions/reclaim-memory
  • github: tweak conditions for uploading shellcheck’s SARIF
  • test/suites/completions: avoid disabling shellcheck SC2164
  • Revert “dependabot: disable schedule to only deal with security updates for 5.0 gomod
  • lxd: Only run PostMigrateSend when migrating instances
  • github: Add LXD_OIDC_CLIENT_SECRET env var to ui-e2e-tests
  • Makefile: bump Go min to 1.24.4
  • doc/requirements: bump Go min to 1.24.4
  • gomod: Update dependencies
  • lxd: Metadata endpoint returns JSON, not YAML.
  • doc/rest-api: Refresh swagger YAML
  • test: Add test for container migration with attached local volume
  • test/includes/setup: fix how virtiofsd is detected
  • test/suites/snapshots: improve snapshots.pattern tests
  • shared/util: block some pongo2 functions in templates
  • shared/util: don’t leak output from failed pongo2 template execution
  • tests: Snapshot can be copied to localhost remote with bridged NIC device
  • lxd/device/filters: Add new filter type and utils
  • lxd/device/filters: Add common disk device filters
  • lxd/device/filters: Add common NIC device filters
  • lxd/device/filters: Add test coverage
  • lxd/device/config: Add Filters function on Devices list
  • lxd/device/config: Add test coverage for device filtering
  • lxd/device: Use filters when iterating over disks
  • lxd/instance/drivers/lxc: Use filters when iterating over disks
  • lxd/instance/drivers/qemu: Use filters when iterating over disks
  • lxd/device/config: Use filters when iterating over disks
  • lxd-agent/events: Use filters when iterating over disks
  • test/godeps/lxd-agent: Add filters
  • lxd/instance/instancetype: Remove device specific IsRootDiskDevice filter
  • lxd/device: Update usage of IsRootDisk filter
  • lxd/instance/instancetype: Update usage of IsRootDisk filter
  • lxd/storage: Update usage of IsRootDisk filter
  • lxd/db/cluster: Add (IdentityType).ActiveType method
  • lxd/db/cluster: Extend ActivateTLSIdentity to support multiple identity types
  • lxd/db/cluster: Include identity type in ActivateTLSIdentity error messages
  • lxd: Extract createCertificateAddToken function from createIdentityTLSPending
  • lxd/db/cluster: Include identity type in PendingTLSMetadata error message
  • lxd: Use createCertificateAddToken in certificatesPost
  • test: Add test for VM migration with attached local volume
  • test/suites/migration: use shell comparison to count snapshots
  • test/suites/snapshots: use shell comparison to count snapshots
  • test/suites/vm: turn some comments into echos
  • test/suites/vm: test limits.memory more thoroughly
  • test/suites/vm: test snapshots
  • test/suites/vm: test invalid snap and instance names
  • test/main: find the path to lxc binary once
  • test/includes/lxc: use ${_LXC} as provided by test/main
  • Revert “lxd: Only run PostMigrateSend when migrating instances”
  • Revert “lxd/instance: Add PostMigrateSend
  • Revert “lxd/migrate_instance: Add call to PostMigrateSend
  • lxd/device: Add clusterMoveSourceName parameter to PostMigrateSend
  • lxd/device: Add clusterMoveSourceName parameter to PostMigrateSend for bridged NIC devices
  • lxd/instance: Add postMigrateSendCommon
  • lxd/instance/drivers: Add call to postMigrateSendCommon in (lxc/qemu).MigrateSend
  • lxd/instance/drivers: Don’t return post-migration errors
  • lxd/network/driver_bridge: Tell dnsmasq to use MAC instead of client-id for IP assignements.
  • lxd/network/network_bridge: Refactor dnsmasq handling out of setup()
  • lxd/instance: Allow VM limits.memory config key to be set to a percentage value
  • lxd/instance: Fix live update of VM limits.memory config key
  • tests/vm: Launch VM with limits.memory set to % of host memory
  • test/suites/basic: test too small containers
  • test/suites/basic: test invalid container and snapshot names
  • test/suites/vm: apply instance filter when listing snapshots
  • lxd/api: White space in restServer
  • lxd/operations: Remove references to removed waitForOperations function
  • lxd/daemon: Add support for validating Content-Type if supplied, or if non-zero Content-Length supplied
  • lxd/images: Allow binary image upload content types for imagesPost
  • lxd/instances: Allow binary instance upload content types for instancesPost
  • lxd/storage/volumes: Allow binary image upload content types for storageVolumesPost
  • lxd/instances: Allow binary template upload content type for instanceMetadataTemplatesPost
  • test/deps/import-busybox: Use content type application/json when creating image alias
  • test/extra/stresstest: Send curl content type as application/json when sending data
  • test/suites/clustering: Send curl content type as application/json when sending data
  • test/suites/auth: Send curl content type as application/json when sending data
  • test/suites/basic: Send curl content type as application/json when sending data
  • test/suites/remote: Send curl content type as application/json when sending data
  • test/suites/tls/restrictions: Send curl content type as application/json when sending data
  • test/suites/snapshots: Send curl content type as application/json when sending data
  • lxc/query: Don’t send empty request if --data flag not specified
  • doc/howto/images/copy: Updates image import examples to send Content-Type
  • doc/howto/images/manpage: Don’t specify Content-Type on GET
  • doc/howto/instances/access/files: Use --data-binary for curl example
  • doc/howto/instances/backup: Use --data-binary flag in curl example
  • doc/rest-api: Refresh swagger YAML
  • lxd/operations: Add CheckRequestor method.
  • lxd: Check requestor for exec and console websockets.
  • lxd/auth/drivers: Add comment to explain metrics entitlement.
  • build(deps): bump github/codeql-action from 3.29.0 to 3.29.1
  • lxd/instance/drivers: drop unneeded test code
  • lxd/daemon: Validate browser fetch metadata if supplied to reject non-same-origin requests
  • test/suites/serverconfig: Check fetch metadata header is validated
  • test/suites/serverconfig: Add content type tests
  • build(deps): bump github.com/go-jose/go-jose/v4 from 4.1.0 to 4.1.1
  • test/suites/completions: use --empty instance where possible
  • test/README: remove whitespace inside backticks
  • test/README: add recommendations
  • test/lint/no-oneline-assign-and-test: add || false fallback
  • test/suites/container_devices_tpm: add || false fallback
  • test/suites/container_devices_proxy: add || false fallback
  • test/suites/metrics: add || false fallback
  • test/suites/remote: properly test for absence of alias
  • test/suites/storage_driver_zfs: add || false fallback
  • test/suites/container_move: add || false fallback
  • test/suites/container_devices_nic_bridged: add || false fallback
  • test/suites/projects: add || false fallback
  • test/suites/container_devices_gpu: add || false fallback
  • test/suites/container_devices_nic_bridged_vlan: add || false fallback
  • test/suites/image: rework how images are checked during expiry
  • test/suites/migration: drop uneeded space
  • test/suites/container_devices_unix: add || false fallback
  • test/suites/container_devices_nic_ipvlan: add || false fallback
  • test/suites/serverconfig: add || false fallback
  • test/lint/test-tests: add check for missing || false fallbacks
  • test/suites/container_devices_unix: skip broken fanotify tests
  • test/suites/metrics: turn comments into echo
  • test/suites/metrics: fix test for restricted cert fetching all accessible metrics by default
  • test/suites/metrics: fix test for restricted cert inability to access other projects
  • test/suites/vm: use ==> in echo’s
  • test/suites/metrics: sleep less
  • test/suites/metrics: use --empty containers where possible
  • test/suites/clustering: use -n -i0.1 -W1 for ping checks
  • test/suites/container_devices_nic_bridged: use -n -i0.1 -W1 for ping checks
  • test/suites/container_devices_nic_bridged_acl: use -n -i0.1 -W1 for ping checks
  • test/suites/container_devices_nic_bridged_filtering: use -n -i0.1 -W1 for ping checks
  • test/suites/container_devices_nic_bridged_vlan: use -n -i0.1 -W1 for ping checks
  • test/suites/container_devices_nic_ipvlan: use -n -i0.1 -W1 for ping checks
  • test/suites/container_devices_nic_macvlan: use -n -i0.1 -W1 for ping checks
  • test/suites/container_devices_nic_p2p: use -n -i0.1 -W1 for ping checks
  • test/suites/container_devices_nic_routed: use -n -i0.1 -W1 for ping checks
  • test/suites/container_devices_nic_macvlan: use wait_for_dad()
  • test/includes/net: speedup DAD
  • test/suites/container_devices_nic_ipvlan: use wait_for_dad()
  • doc/metrics: metrics for all accessible projects are returned by default
  • test/suites: Use testimage for auth checks.
  • doc/metrics: improve wording for project parameter
  • doc/howto/snap: remove unnecessary step to remove hold to refresh
  • doc/howto/storage_volumes: add migration.stateful restriction for local volumes
  • doc: ignore anchor when checking maas link
  • test/suites/container_devices_nic_bridged: use shell comparisons where possible
  • test/suites/container_devices_nic_bridged: disable DAD
  • test/suites/container_devices_nic_routed: use shell comparisons where possible
  • test/suites/container_devices_nic_sriov: skip early if not supported
  • test/suites/container_devices_infiniband_physical: skip early if not supported
  • test/suites/container_devices_infiniband_sriov: skip early if not supported
  • test/suites/container_devices_nic_ipvlan: take LXC network_ipvlan feature for granted
  • test/suites/container_devices_nic_routed: take LXC network_veth_router feature for granted
  • test/suites/container_devices_tpm: swtpm is a hard requirement
  • test/suites/container_syscall_interception: simplify container setup
  • test/suites/container_syscall_interception: use lxc file push --quiet
  • Revert “tests: syscall_interception: disable if seccomp filtering is active”
  • test/suites/storage_volume_attach: don’t skip test if not enough UIDs/GIDs, fail instead
  • test/suites/storage_volume_attach: use shell comparisons where possible
  • test/suites/container_devices_nic_bridged_filtering: skip early if not supported
  • test/suites/container_devices_nic_bridged_filtering: use safer grep patterns
  • test/suites/container_devices_nic_bridged_vlan: use shell comparisons where possible
  • test/suites/container_devices_nic_ipvlan: use shell comparisons where possible
  • test/suites/container_devices_nic_macvlan: use shell comparisons where possible
  • test/suites/container_devices_nic_p2p: use shell comparisons where possible
  • test/suites/container_devices_nic_physical: use shell comparisons where possible
  • test/suites/container_devices_nic_routed: use safer grep patterns
  • test/suites/container_devices_nic_sriov: use safer grep patterns
  • test/suites/container_devices_proxy: use shorter sleep
  • test/suites/clustering: use --quiet when adding cluster join tokens
  • test/suites/clustering: drop unneeded tail -n 1
  • test/suites/clustering: use shorter sleep around join token expiry
  • test/suites/container_devices_nic_ipvlan: wait for DAD of the 2 containers
  • test/suites/container_devices_nic_macvlan: wait for DAD of the 2 containers
  • test/suites/container_devices_nic_bridged: give more time for DAD to complete
  • test/suites/container_devices_nic_p2p: remove unneeded waiting for DAD
  • test/suites/container_devices_nic_routed: give more time for DAD to complete
  • test/suites/container_devices_nic_macvlan: take LXC network_phys_macvlan_mtu feature for granted
  • test/suites/container_devices_nic_physical: take LXC network_phys_macvlan_mtu feature for granted
  • test/suites/storage_driver_zfs: simplify instance’s PID extraction
  • test/suites/clustering: simplify instance’s PID extraction
  • test/suites/basic: simplify instance’s PID extraction
  • test/suites/storage_driver_btrfs: skip early if not supported
  • test/suites/storage_driver_dir: skip early if not supported
  • test/suites/storage_driver_ceph: skip early if not supported
  • test/suites/storage_driver_cephfs: skip early if not supported
  • test/suites/storage_driver_pure: skip early if not supported
  • test/suites/storage_driver_zfs: skip early if not supported
  • lxd/network/ovn: Only fetch active chassis if present
  • lxd/network/openvswitch: Add check for empty logical router port binding
  • lxd/auth/drivers: Add methods to perform auth checks ignoring effective project.
  • lxd/auth: Add methods on interface to perform auth checks ignoring effective project.
  • lxd/auth: Update comments replacing old context key with request.Info.
  • lxd: Update comments replacing old context key with request.Info.
  • lxd: Check network allocation used-by URLs.
  • test/suites: Add auth tests for network allocations.
  • lxd: Consistently use state in network allocations handler.
  • driver_qemu: informative error message for QEMU version
  • lxd/main/activateifneeded: Don’t query /1.0 when requesting LXD start
  • lxd/main/activateifneeded: Store local DB inside daemon struct
  • lxd/main/activateifneeded: Don’t call d.State() causing unnecessary instance driver status checks
  • lxd/main/activateifneeded: Infer instance running status from DB
  • test/main: export MAIN_DIR var
  • test/includes/lxd: fix call to deps/panic-checker
  • test/suites/lxd_user: stop importing the unneeded testimage
  • test/suites/lxd_user: augment test coverage a bit
  • client/lxd: avoid unneeded format variant of logger
  • lxd-agent/devlxd: avoid unneeded format variant of logger
  • lxd/api_internal: avoid unneeded format variant of logger
  • lxd/cgroup/init: avoid unneeded format variant of logger
  • lxd/cluster/gateway: avoid unneeded format variant of logger
  • lxd/cluster/upgrade: avoid unneeded format variant of logger
  • lxd/daemon: avoid unneeded format variant of logger
  • lxd/db/cluster/open: avoid unneeded format variant of logger
  • lxd/db/db: avoid unneeded format variant of logger
  • lxd/db/node/open: avoid unneeded format variant of logger
  • lxd/device/device_utils_network: avoid unneeded format variant of logger
  • lxd/endpoints/cluster: avoid unneeded format variant of logger
  • lxd/endpoints/endpoints: avoid unneeded format variant of logger
  • lxd/endpoints/metrics: avoid unneeded format variant of logger
  • lxd/endpoints/network: avoid unneeded format variant of logger
  • lxd/endpoints/object: avoid unneeded format variant of logger
  • lxd/endpoints/pprof: avoid unneeded format variant of logger
  • lxd/endpoints/socket: avoid unneeded format variant of logger
  • lxd/idmap/shift_linux: avoid unneeded format variant of logger
  • lxd/images: avoid unneeded format variant of logger
  • lxd/instance/drivers/qmp/monitor: avoid unneeded format variant of logger
  • lxd/instance_console: avoid unneeded format variant of logger
  • lxd/main_activateifneeded: avoid unneeded format variant of logger
  • lxd/migrate_storage_volumes: avoid unneeded format variant of logger
  • lxd/networks: avoid unneeded format variant of logger
  • lxd/patches: avoid unneeded format variant of logger
  • lxd/seccomp/seccomp: avoid unneeded format variant of logger
  • lxd/sys/apparmor: avoid unneeded format variant of logger
  • lxd/util/net: avoid unneeded format variant of logger
  • test/lint/unneeded-format-variant: new check
  • lxd/storage/backend: Skip UpateCustomVolume early in case there aren’t any changes
  • lxd/storage/backend: Skip UpdateCustomVolumeSnapshot early in case there aren’t any changes
  • lxd/daemon: Check for cross-site rather than invalid cross-origin Sec-Fetch-Site header value
  • test/suites/serverconfig: Update Sec-Fetch-Site tests
  • lxd/daemon: Define forbidden Sec-Sec-Fetch-Site values
  • test/suites/container_devices_unix: do not completely skip tests with fanotify
  • lxd/storage: Allow appending custom vols to backup config file
  • lxd/storage: Include the pool for custom volumes in the backup file
  • lxd/storage: Allow setting custom volumes when generating instance backup config
  • lxd/storage: Add custom volumes parameter when generating instance backup config
  • lxd/storage: Add backupConfigCache struct with getters
  • lxd/storage: Add and implement GenerateInstanceCustomVolumeBackupConfig
  • lxd/instance/drivers: Update invocations of UpdateInstanceBackupFile and GenerateInstanceBackupConfig
  • lxd: Update invocations of GenerateInstanceBackupConfig
  • lxd/storage: Update invocations of UpdateInstanceBackupFile and GenerateInstanceBackupConfig
  • lxd/instance: Load all custom storage volumes for UpdateInstanceBackupFile
  • lxd/storage: Implement UpdateCustomVolumeBackupFiles
  • lxd/storage: Update instances backup file if one of their custom storage volumes get updated
  • lxd/storage: Update instance backup file if custom volume got snapshotted
  • lxd/storage: Update instance backup file if custom volume snapshot got renamed
  • lxd/storage: Update instance backup file if custom volume snapshot got updated
  • lxd/storage: Update instance backup file if custom volume snapshot got deleted
  • test/suites/backup: Test pool count in backup_metadata for instances and custom vols
  • test/suites/backup: Test the on disk backup file in backup_metadata
  • test/suites/snapshots: Check the restore ins’t blocked by not anymore existing custom vols
  • test/suites/backup: Check a custom volume only ever appears once in the backup config
  • test: split DEBUG into client, server and shell variables
  • test/main: start tracing after importing all the script snippets
  • test/main: streamline variable exports
  • test/includes/lxd: skip deletion of default profile
  • test/includes: move is_uuid_v4() to clustering
  • test/suites/projects: set config keys at creation time
  • test: Omit escape sequences from prompt length in inspect subshell.
  • lxd/storage: Add more context to errors returning from GenerateCustomVolumeBackupConfig
  • lxd: Add more context to errors returning from GenerateCustomVolumeBackupConfig
  • golangci: Disable var-naming linter on lxd/util
  • lxd/storage/drivers/driver/zfs: Remove loop file on pool setup failure
  • lxd/storage/drivers/utils: Adds ValidVolumeName and ValidPoolName functions
  • lxd/storage/utils: Removes ValidVolumeName function
  • lxd/storage/backend/lxd: Switch ValidateName to use drivers.ValidPoolName
  • lxd/storage/backend/lxd: Switch to drivers.ValidVolumeName with better error context
  • lxd/storage/volumes: Switch to storageDrivers.ValidVolumeName
  • lxd/storage/volumes/snapshot: Switch to storageDrivers.ValidVolumeName with better error context
  • lxd/storage/drivers/driver/lvm: Validate lvm.vg_name with ValidPoolName
  • lxd/storage/drivers/driver/lvm: Validate lvm.thinpool_name with ValidVolumeName
  • lxd/daemon/storage: Switch daemonStorageSplitVolume to use storageDrivers.{ValidPoolName,ValidVolumeName}
  • lxd/storage/drivers/utils: Update ValidPoolName to reject names start with a hyphen
  • lxd/storage/drivers/utils: Reject pools and volumes called “…”
  • test/suites/storage: Add storage pool name validation checks
  • test/suites/remote: don’t report progress on init/image copy/publish
  • lxd/request: Add function to get both project parameters.
  • lxd: Centralize handling of project query parameters.
  • lxd/db/cluster: Add function to get all project configs.
  • lxd: Use correct project config when getting networks from all projects.
  • lxd: Only use the effective project if set.
  • lxd: Explicitly get unmanaged networks for all projects requests.
  • test/suites: Test project restrictions with multiple identity types.
  • test/suites: Lint fixes (shellcheck: SC2248)
  • test/includes: Add OVN utils.
  • test/suites: Update OVN tests to use utils.
  • test: Clean up northbound database after tests.
  • test/suites: Add comment for storage pool used-by URL tests.
  • test/suites: Move entitlement enrichment tests down.
  • test/suites: Add tests for project specific networks.
  • lxd/api_cluster: use maps.Copy() (modernize)
  • lxd/api_1.0: use maps.Copy() (modernize)
  • lxd/network/driver_common: use modern loop (modernize)
  • lxd/network/utils: use modern loop (modernize)
  • lxd/network/openvswitch/ovn: use strings.FieldsSeq() (modernize)
  • lxc/config/remote: use strings.CutPrefix() (modernize)
  • lxd/instance/drivers/common: use strings.CutPrefix() (modernize)
  • lxd/network/openvswitch/ovn: use strings.CutPrefix() (modernize)
  • lxd/resources/gpu: use strings.CutPrefix() (modernize)
  • lxd/storage/drivers/zfs_volumes: use strings.CutPrefix() (modernize)
  • lxd/instance/drivers/common: use strings.CutPrefix() (modernize)
  • lxd/network/openvswitch/ovn: use strings.CutPrefix() (modernize)
  • test/mini-oidc/storage: use strings.CutPrefix() (modernize)
  • shared/util: use strings.CutPrefix() (modernize)
  • lxd/storage/s3/headers: add unit test for AuthorizationHeaderAccessKey()
  • lxd/storage/s3/headers: use strings.CutPrefix() (modernize)
  • lxd/instance/drivers/lxc: remove local var copy (modernize)
  • lxd/instance/drivers/qemu: remove local var copy (modernize)
  • lxd/instances_get: remove local var copy (modernize)
  • lxd/instances_post: remove local var copy (modernize)
  • lxd/storage/drivers/utils: add addNoRecoveryMountOption() helper
  • lxd/storage/drivers/utils_test: add test for addNoRecoveryMountOption()
  • lxd/storage/drivers/zfs_volumes: mount ro snapshots with norecovery for all FSes
  • lxd/storage/drivers/lvm_volumes: mount ro snapshots with norecovery for all FSes
  • lxd/storage/drivers/ceph_volumes: add comment for XFS being mounted with nouui
  • lxd/storage/drivers/ceph_volumes: mount ro snapshots with norecovery for all FSes
  • lxd/storage/filesystem/fs: convert stat.Mnt_id outside of the loop
  • Revert “golangci: Disable var-naming linter on lxd/util
  • golangci: Ignore package name errors by text.
  • build(deps): bump github.com/openfga/openfga from 1.8.16 to 1.9.0
  • build(deps): bump github.com/pkg/xattr from 0.4.11 to 0.4.12
  • build(deps): bump github.com/zitadel/oidc/v3 from 3.39.0 to 3.39.1
  • build(deps): bump github/codeql-action from 3.29.1 to 3.29.2
  • lxd/cluster/heartbeat: Take lock heartbeat before checking g.Cluster status
  • lxd/daemon: Take g.HeartbeatLock before setting g.Cluster to nil
  • lxd/instances: Allow content-type octet-stream for POST /instances/{name}/files
  • client: Set content-type header to octet-stream in CreateInstanceFile
  • lxd/storage/drivers/utils: replace slow fmt.Sprintf()
  • lxd/storage/drivers/utils_test: add tests for ValidPoolName() and ValidVolumeName()
  • lxd/api: Adds isBrowserClient function that detects Mozilla prefixed user-agent header
  • lxd/daemon: Only enforce content-type headers for browser clients
  • test/suites/serverconfig: Update content-type checks with Mozilla and non-Mozilla user agent
  • test/suites/serverconfig: Adds ui redirection test
  • lxd/api: Add missing error condition check
  • lxd/storage/drivers/zfs_volumes: only assemble the udev link to the zvol once
  • lxd/storage/drivers/zfs_volumes: Make sure the zvol is a block device
  • lxd/storage/drivers/zfs_volumes: optimize check for symlink+blockdev in getVolumeDiskPathFromDataset()
  • fix: fix slice init length
  • lxd/storage/drivers/utils: use btrfstune -m instead of the much slower -u variant
  • lxd/storage/drivers/zfs_utils: only use dpkg-query as a last resort to get ZFS version
  • lxd/storage/drivers/zfs: datasets are not strictly like Unix paths
  • lxd/storage/drivers/zfs_utils: append() more at the time
  • lxd/storage/drivers/zfs_utils: use safer strings.Cut()
  • lxd/storage/drivers/zfs_volumes: use safer strings.Cut()
  • lxd/storage/drivers/zfs_volumes: streamline snapshot name handling for cleanup
  • lxd/storage/drivers/zfs_volumes: set the volmode=dev during zfs clone
  • lxd/storage/drivers/zfs_volumes: clear all quotas in one go in SetVolumeQuota()
  • lxd/storage/drivers/zfs_volumes: log a warning if setting volmode=none fails
  • lxd/storage/drivers/zfs_volumes: don’t check if FS can be shrunk in the caller
  • lxd/storage/drivers/zfs_volumes: early return in deactivateVolume()
  • lxd/storage/drivers/zfs_volumes: return volumeDiskPath if any in activateVolume()
  • lxd/storage/drivers/zfs_volumes: consistently deactivate volume if it was activated
  • lxd/storage/drivers/zfs_volumes: activate volume, mkfs then deactivate in CreateVolume()
  • doc: linkcheck ignore sourceforge domain
  • doc: Adding network ipam UI information
  • lxd/storage/drivers/utils: Reject pool names starting with a dot
  • test/suites/storage: Test for rejected pool names starting with a dot
  • tests/clustering: Use correct target project argument
  • tests/clustering: Fix typo
  • lxd/response: Use generic status text when nil error is used.
  • lxd/response: Update smart response to use err field.
  • lxd/db/openfga: Use generic status error for consistency.
  • lxd: Use generic status error for consistency.
  • test/suites: Update suites to expect generic error messages.
  • lxd/seccomp/seccomp: Remove debug leftover
  • lxd/instance/drivers/load: Simplify error message
  • lxd/instance/instance/utils: Simplify and make error message more consistent
  • lxd/api/devlxd: Adds loadContainerFromLXCMonitorPID and reworks devlxdFindContainerForPID
  • lxd/daemon: Switch to more precise loadContainerFromLXCMonitorPID for seccomp handler
  • lxd/db/cluster/projects: Optimize GetProjectConfig()
  • lxd/auth/drivers: Update project_manager entitlement description.
  • lxd/auth: Update auth
  • doc: Update metadata
  • doc: Adding Network ACL UI Information
  • doc/howto: rename ubuntu_pro_guest_attach.md to instances_ubuntu_pro_attach.md
  • doc/howto/instances_pro_attach: use sudo to set lxd_guest_attach
  • doc/howto/instances_pro_attach: use backtick code fences
  • howto/instances_ubuntu_pro_attach: improve documentation
  • doc/api-extensions: link to how-to for attaching instances to ubuntu pro
  • lxd/storage/drivers/dir: Remove quotas after removing volume from storage
  • test: Add test for XFS project quotas with dir storage driver
  • doc: pin canonical-sphinx-extensions version
  • Revert “shared/util: don’t leak output from failed pongo2 template execution”
  • shared/util: don’t leak output from failed pongo2 template execution
  • shared/util: explicitly return nil error on success
  • shared/util: introduce recursion limit to RenderTemplate()
  • shared/util_test: add tests for RenderTemplate()
  • shared/util_test: extend coverage for GetExpiry()
  • README: Fix broken link
  • lxd/instances/qemu: Handle deprecation of runas
  • lxd: Reorganise checks in images GET handler.
  • lxd: Add function to validate fingerprint prefixes.
  • lxd: Validate image fingerprint prefix on trusted API calls.
  • lxd: Validate image fingerprint prefix on untrusted API calls.
  • test/suites: Update test to use 12 characters of fingerprint.
  • build(deps): bump golang.org/x/term from 0.32.0 to 0.33.0
  • shared/util: export a suggested recursion limit for rendering templates
  • lxd/instance/instance_utils: use suggested recursion limit for rendering templates
  • lxd/storage/utils: use suggested recursion limit for rendering templates
  • build(deps): bump github.com/go-acme/lego/v4 from 4.23.1 to 4.24.0
  • build(deps): bump golang.org/x/sync from 0.15.0 to 0.16.0
  • build(deps): bump golang.org/x/tools from 0.34.0 to 0.35.0
  • build(deps): bump github.com/miekg/dns from 1.1.66 to 1.1.67
  • tests/clustering_move: Add test for moving instance to a new project
  • lxd: Change all calls to SetupContextInfo to GetContextInfo.
  • lxd/request: Never get existing Info when setting up request context.
  • lxd/project/limits: Update calls to SetupRequestInfo.
  • lxd: Update calls to SetupRequestInfo.
  • Revert “lxd: Use connection from request info”
  • Revert “lxd/request: Add connection to request info”
  • Revert “lxd/request: Remove unused connection context key constant”
  • test/lxd-client: Add test LXD client
  • test: Test container file creation using strings.Reader
  • gitignore: Add test lxd-client to gitignore
  • lxc/network: Allow listing allocations in non-default projects via project switch.
  • i18n: Update translation templates.
  • i18n: Update translations.
  • test/suites: Test current project works for network allocation list.
  • api: Adds pci_hotplug extension
  • lxd/device/pci: Allow hotplug
  • lxd/instance/qmp: Add CheckPCIDevice
  • lxd/instance/drivers/driver/qemu: Use monitor.CheckPCIDevice
  • lxd/instance/drivers/driver/qemu: Tweak comments on deviceStart
  • lxd/instance/drivers/driver/qemu: Add hotplug support for generic PCI
  • lxd/instance/drivers/driver/qemu: Double number of hotplug slots
  • lxd/instance/drivers/driver/qemu: Rework PCI hotplug
  • lxd/instance/drivers/driver/qemu: Remove unused qemuPCIDeviceIDStart constant
  • lxd/instance/drivers/driver/qemu: Wait for PCIe devices added at start to be ready
  • test/suites: Add tests for public image handling.
  • test/suites: Ignore lint error (shellcheck: 2153).
  • lxd/db/cluster: Add directive to get image by project and fingerprint.
  • lxd/db/cluster: Run make update-schema.
  • lxd: Handle DevLXD image export directly in DevLXD handler.
  • lxd/instance_logs: Perform stricter path validation
  • gomod: Update dependencies
  • lxd/auth/oidc: Allow different cluster members to begin and end UI auth flow.
  • lxd/auth/oidc: Remove config expiry logic.
  • test/godeps: Runs make update-godeps.
  • lxd/api/dev/lxd: Add getLXCMonitorContainer function and switch to it in devlxdFindContainerForPID
  • lxd/daemon: Switch to getLXCMonitorContainer in seccomp listener
  • lxd/api/devlxd: Remove unused loadContainerFromLXCMonitorPID function
  • api: Add API extension for device removal via patch
  • lxd/instance: Allow device removal through PATCH
  • test: Test device removal through instance patch
  • workflows/test: Run tiobe on self-hosted runners
  • lxd/auth/oidc: The login_id cookie must have SameSite=Lax.
  • shared/util: rework pongo2 template recursion for efficiency
  • lxd/instance/instance_utils: shared.RenderTemplate() no longer needs a recursion limit param
  • lxd/storage/utils: shared.RenderTemplate() no longer needs a recursion limit param
  • shared/util_test: update test cases
  • lxd/storage/drivers/lvm_utils: use strings.SplitN() in lvmVersionIsAtLeast()
  • lxd-migrate/transfer: minimize calls to rsync.AtLeast()
  • lxd/rsync: use strings.SplitN()
  • lxd/rsync: append() more at the time
  • lxc/storage_volume: append() more at once
  • lxd/devlxd: append() more at once
  • shared/version/platform_linux: append() more at once
  • lxd/firewall/drivers/xtables: simplify version detection
  • lxd/firewall/drivers/nftables: avoid off-by-one when parsing nft --version
  • lxd/dnsmasq: avoid off-by-one when parsing dnsmasq --version
  • lxd/network/driver_bridge: cache path to dnsmasq.hosts
  • lxd/network/driver_bridge: cache path to network directory
  • lxd/network/driver_bridge: cache path to forkdns dir
  • lxd/network/driver_bridge: do not build slices only to expand them
  • lxd/apparmor: cache joined FS paths
  • lxd/apparmor: avoid deprecated os.{IsExist,IsNotExist}()
  • lxd/apparmor: simplify hasProfile() with early exit
  • lxd/sys/apparmor: strings.Split() cannot return a 0 len slice
  • lxd/sys/apparmor: detect and save version at init() time
  • lxd/apparmor: use Apparmor version from system info
  • lxd/sys/os: add AppArmorCacheLoc and AppArmorCacheDir strings
  • lxd/sys/apparmor: save cache loc and cache dir to system info
  • lxd/apparmor: use AppArmorCacheLoc in runApparmor()
  • lxd/apparmor: use AppArmorCacheDir from system info
  • lxd/apparmor: no need to check if Apparmor is available in parseProfile() as runApparmor() does it
  • test/includes/lxd: use long arg for Apparmor cache location
  • lxd/apparmor: Defend against path traversal attacks
  • lxd/apparmor/archive: cache ArchiveProfileFilename() result
  • lxd/apparmor/archive: Defend against path traversal attacks
  • Revert “tests: Run Tiobe TICS on self-hosted runners”
  • lxd/instance/drivers/driver/qemu: Move drive qemu device setup in addDriveConfig
  • Revert “lxd/instance/drivers/driver/qemu: Wait for PCIe devices added at start to be ready”
  • lxd/instance/drivers/driver/qemu/bus: Adds busAllocator function signature
  • lxd/instance/drivers/driver/qemu: Reworks getPCIHotplug to implement busAllocator
  • lxd/instance/drivers/driver/qemu: Update uses of getPCIHotplug()
  • lxd/instance/drivers/driver/qemu: Simplify busName detection and remove duplication in addDriveConfig
  • lxd/instance/drivers/driver/qemu: Update addDriveConfig to accept a busAllocator argument
  • lxd/instance/drivers/driver/qemu: Update addDriveConfig usage
  • lxd/instance/drivers/driver/qemu: Update addDriveDirConfig to use a busAllocater that uses per-LXD device multi-function groups
  • test/suites: Use jq directly for entitlement assertions.
  • test/suites: Standardise jq usage for access entitlements in arrays.
  • test/suites: Test entitlement reporting for multiple storage pools.
  • test/suites: Test entitlement reporting for multiple projects.
  • test/suites: Test entitlement reporting for multiple instances.
  • test/suites: Test entitlement reporting for multiple volumes.
  • test/suites: Entitlements should be reported when not explicitly set.
  • test/suites: Generate test certificates in test directory.
  • lxd: Fix entity type in access entitlement enrichment call.
  • lxd/network: Add Evacuate and Restore funcs to network interface
  • lxd/network/driver_bridge: Remove or setup BGP config on evacuate/restore
  • lxd/network/driver_bridge: During start setup BGP only if not evacuated
  • lxd/network/driver_physical: Remove or setup BGP config on evacuate/restore
  • lxd/network/driver_physical: During start setup BGP only if not evacuated
  • lxd/network/driver_ovn: Move chassis related setup code into helper
  • lxd/network/driver_ovn: Remove or setup BGP config and chassis on evacuate/restore
  • lxd/network/driver_ovn: Fix error message
  • lxd/network/driver_ovn: Simplify error return
  • lxd/network/driver_ovn: During start setup BGP only if not evacuated
  • lxd/networks: Allow passing information about network’s restore state in networkStartup
  • lxd/networks: Invoke network restore when requested
  • lxd/daemon: Always start networks on init
  • lxd: Update invocations of networkStartup
  • lxd/networks: Rename loadAndInitNetworks to loadAndStartupNetworks
  • lxd/networks: Rename initNetworks to startNetworks
  • lxd/networks: Update final network start message
  • lxd/networks: Rename networkingStop to networkStop
  • lxd/networks: Allow networkStop to be used for network evacuation
  • lxd: Update invocations of networkStop
  • test/suites: Add new clustering_waitready
  • build(deps): bump redhat-plumbers-in-action/differential-shellcheck
  • build(deps): bump github.com/minio/minio-go/v7 from 7.0.94 to 7.0.95
  • shared/util: Handle panics in the pongo2 package
  • doc/howto/storage_buckets: move youtube link to relatedlinks side panel
  • doc/howto/storage_buckets: restructure document and add reference targets
  • doc/howto/storage_buckets: update intro and view sections
  • doc/howto/storage_buckets: add general and distributed storage requirements
  • doc/howto/storage_buckets: consistently use hyphens in variable names
  • doc/howto/storage_buckets: update sections on creating storage buckets
  • doc/howto/storage_buckets: use backtick code fences consistently
  • doc/howto/storage_pools: add info about ceph-based pool requirements
  • doc/howto/storage_pools: use more specific variable names for remote/distributed storage pool creation examples
  • doc/howto/storage_pools: add syntax example for creating a cephobject pool in cluster
  • doc/explanation/storage: improve storage bucket section
  • doc: update custom wordlist spelling exceptions
  • lxd/instance/instancetype: Update the boot.autostart description
  • doc: Update metadata
  • lxd/instance/drivers/driver/qemu: Adds generateAgentMountsFile function
  • lxd/instance/drivers/driver/qemu: Stop generating the agent-mounts.json file in addDriveDirConfig and generateQemuConfigFile
  • lxd/instance/drivers/driver/qemu: Re-generate agent mount config after devices update
  • lxd/instance/drivers/driver/qemu: Lower sleep time for iteration in getPCIHotplug
  • lxd/instance/drivers/driver/qemu: Improve comment in getPCIHotplug
  • lxd/instance/drivers/driver/qemu: Improve cache mode option extraction in addDriveConfig
  • lxd/instance/drivers/driver/qemu: Simplify multifunction mode selection in addDriveConfig
  • lxd: Run pre-checks before evacuating or restoring a cluster member
  • lxd/networks: Add comment to clarify storage ready canceller
  • lxd/storage: Cancel storage ready canceller early
  • test/suites/clustering_waitready: Check that cluster restore is blocked
  • test/suites/clustering_waitready: Check that cluster evacuate is blocked
  • test/suites/deps: run ldd on the actual lxc binary
  • test/suites/waitready: Use dummy link dev instead of bridge
  • test/suites/waitready: Use lxc interface instead of sql queries
  • test/suites/clustering_waitready: Use dummy link dev instead of bridge
  • test/suites/clustering_waitready: Use lxc interface instead of sql queries
  • lxd/auth/oidc: Remove context.Context from Auth signature.
  • lxd/auth/oidc: Simplify Auth logic.
  • lxd/auth/oidc: Factor common session logic.
  • lxd/auth/oidc: Always delete the login_id cookie on callback.
  • doc: update grafana base url to encounter ui prefix, that we expect in the future
  • lxd/instance/drivers/driver/common: Avoid fmt.Sprintf in deviceVolatileGetFunc
  • lxd/instance/drivers/driver/qemu: Move SEV configuration after internal device setup in generateQemuConfigFile
  • lxd/instance/drivers/driver/qemu: Rename busFunctionGroup9p to busFunctionGroupConfig
  • lxd/instance/drivers/driver/qemu: Move PCI logic into addNetDevConfig and accept busAllocator
  • lxd/instance/drivers/driver/qemu: Simplify security.csm device allocation logic in generateQemuConfigFile
  • lxd-agent: Add device event action constants to API
  • lxd/instance/drivers/common: Use lxd-agent constants in devicesUpdate() func
  • lxd-agent: Refactor eventsProcess function
  • lxd-agent: Unmount target path after disk device is removed
  • doc: linkcheck ignore ceph.io
  • doc/reference/storage_powerflex: Add limitation note about SDC and Ubuntu Noble Numbat images
  • lxd/sys/os: mention that AppArmorVersion is nil if AppArmorAvailable is false
  • lxd/sys/apparmor: do not try to get the cache dir if Apparmor is not available
  • build(deps): bump github.com/zitadel/oidc/v3 from 3.41.0 to 3.42.0
  • build(deps): bump github.com/go-acme/lego/v4 from 4.24.0 to 4.25.1
  • build(deps): bump github.com/mattn/go-sqlite3 from 1.14.28 to 1.14.29
  • build(deps): bump github/codeql-action from 3.29.2 to 3.29.4
  • Revert “lxd/instance/drivers/driver/qemu: Remove unused qemuPCIDeviceIDStart constant”
  • lxd/instance/drivers/driver/qemu: Add debug logging and fix infinite wait when device is busy in deviceDetachBlockDevice
  • lxd/instance/drivers/driver/qemu/bus: Updates busAllocator to accept deviceName and multifunction arguments
  • lxd/instance/drivers/driver/qemu: Adds busAllocatePCIeHotplug function
  • lxd/instance/drivers/driver/qemu: Switch to d.busAllocatePCIeHotplug
  • lxd/instance/drivers/driver/qemu: Removes unused getPCIHotplug function
  • lxd/instance/drivers/driver/qemu: Standardise bus allocation during qemu config generation
  • github: ask dependabot to stop updating github.com/olekukonko/tablewriter
  • lxd/daemon: Simplify daemonStorageMove()
  • lxd/daemon_storage: Simplify daemonStorage(VolumesUn)mount
  • test: run concurrent tests after incremental_copy
  • test/suites/{remote,projects}: Clean up leftover images
  • lxd/rsync: Introduce CopyFile() to rsync single file
  • lxd/api_project: Rename import
  • github: only run tests workflow on a schedule for the main repo
  • github: only run codeql workflow on the main repo
  • doc: Adding Storage Buckets UI documentation
  • lxd/db/query: Add ScanValue method and interfaces.
  • lxd/db/cluster: Use ScanValue method for AuthMethod.
  • lxd/db/cluster: Use ScanValue method for IdentityType.
  • lxd/db/cluster: Use ScanValue method for EntityType.
  • lxd/daemon: Rename local variables
  • lxd/daemon: Introduce functions for custom volume mount and unmount
  • gomod: Update google.golang.org/grpc
  • lxd/sys/apparmor: don’t return any cache dir on error in appArmorGetCacheDir()
  • lxd/apparmor: don’t return error if the profiles path does not exist
  • lxd/apparmor: avoid shadowing supported variable in parserSupports()
  • lxd/network/openvswitch/ovn: Allow associating load balancers with switches in LoadBalancerApply()
  • lxd/network/driver/ovn: Associate load balancers and forwards with internal switch
  • test: Extend ovn network tests
  • lxd/cluster/config: Remove ClusterTx from Config.
  • lxd: Update calls to Config.{Patch/Replace} to pass a transaction.
  • Release LXD 6.5

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
6 Likes

LXD 6.5 is currently available in the 6/candidate snap channel for consideration, and will be moved to the 6/stable channel soon.

See our video for new features in LXD-UI with LXD 6.5 on YouTube.

3 Likes