News¶
Incus 7.3 has been released¶
Jul 31, 2026
The Incus team is pleased to announce the release of Incus 7.3!
Another busy release for us, both on the feature front with quite a lot of exciting new features as well as on the performance, bugfix and securty front.
As usual, you can try Incus for yourself online: Linux Containers - Incus - Try it online
Security fixes¶
This release fixes 13 security issues:
- CVE-2026-62867 (critical) - Argument injection through storage volume
block.create_options - CVE-2026-62940 (critical) - Project restriction bypass via instance migration config override
- CVE-2026-62941 (critical) - Project restriction bypass via cross-project instance copy
- CVE-2026-63125 (critical) - Arbitrary file write on host via
backup.yamlsymlink in crafted image - CVE-2026-63343 (critical) - Arbitrary file read+write on host via
metadata.yamlsymlink in crafted image - GHSA-26gp-p5fw-3r2h (critical) - Arbitrary file write on host via path traversal in instance backup import
- GHSA-67qw-68v3-36h6 (critical) - Arbitrary file write on host via path traversal in custom volume import
- GHSA-7fj9-65v4-rp7h (critical) - Arbitrary file write on host via image-planted symlinks and
oci.dns.*newline injection - GHSA-p2v3-6wvc-cv3p (critical) - Arbitrary file write on host via image fingerprint path traversal
- GHSA-4qxq-p5hm-3q3p (high) - Arbitrary file read+write on host via VM template path traversal
- GHSA-m3j6-p3v3-qmjv (high) - Container configuration newline injection through
nvidia.driver.capabilities - CVE-2026-62313 (medium) - Project isolation restriction bypass by omitting
security.idmap.isolated - GHSA-6v6x-387m-rj4w (medium) - Project restriction bypass on network address sets
Note that some of the above don't yet have CVE assigned. This is due to Github having a 3-4 weeks backlog on CVE assignments right now. We have requested CVEs for all the issues above and they will be automatically added to the relevant GHSA once allocated.
New features¶
GPU sharing for virtual machines through DRM native context¶
A new native-context GPU type is now available for virtual machines.
This makes use of virglrenderer and the virtio-gpu type to provide GPU 3D acceleration.
Unlike full GPU passthrough, this can be used by multiple virtual machines in parallel.
Currently, only Linux appears to have drivers fully supporting this, so Windows guests remain unaccelerated.
This can be enabled with:
stgraber@vorash:~$ incus config device add v1 gpu0 gpu gputype=native-context
Documentation: https://linuxcontainers.org/incus/docs/main/reference/devices_gpu/
UEFI variable management for virtual machines¶
Incus now allows direct NVRAM interactions for virtual machines.
This is exposed through the CLI as incus low-level nvram and allows for both read and write access to the NVRAM.
Most UEFI NVRAM configuration keys can be parsed and updated, allowing for modification of the boot devices, boot order and more. Write operation require a stopped VM. A follow-up will focus specifically on UEFI Secure Boot key provisioning.
Additionally, a new rebuild-nvram repair action was added to incus low-level repair, making it easy to reset a virtual machine's UEFI NVRAM to a clean state.
stgraber@vorash:~$ incus launch images:debian/13 v1 --vm
Launching v1
stgraber@vorash:~$ incus low-level nvram get v1 Boot0000
binary: CQEAACwAQgBvAG8AdABNAGEAbgBhAGcAZQByAE0AZQBuAHUAQQBwAHAAAAAEBxQAyb24fOv4NE+q6j7kr2UWoQQGFADcW8Lu8meVTbHV+BsgOdEdf/8EAA==
data:
active: true
category: app
description: BootManagerMenuApp
force_reconnect: false
hidden: true
paths:
- - Fv(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(eec25bdc-67f2-4d95-b1d5-f81b2039d11d)
attributes:
- NON_VOLATILE
- BOOTSERVICE_ACCESS
- RUNTIME_ACCESS
Instance port forwarding¶
A new incus port-forward command makes it easy to access a TCP service running inside of an instance.
The CLI tool runs a local TCP listener and forwards every connection made to it to the given address and port inside of the instance or on a network attached to that instance.
stgraber@vorash:~$ incus port-forward my-nginx 80 8080
stgraber@vorash:~$ incus port-forward my-nginx 10.0.3.1:443 0.0.0.0:8443
Reworked authorization configuration¶
The authorization configuration has moved to a new authorization.* namespace, with the former openfga.* server configuration keys now being authorization.openfga.api.url, authorization.openfga.api.token and authorization.openfga.store.id. Existing values are automatically migrated on upgrade.
This now allows us to support multiple authorization drivers in parallel and chose the provider based on the request type. This is done through a new set of keys:
authorization.client.default: driver for clients without a more specific class routeauthorization.client.unix: driver for local (unixsocket) clientsauthorization.client.tls: driver for unrestricted TLS clientsauthorization.client.tls-restricted: driver for restricted (project-scoped) TLS clientsauthorization.client.oidc: driver for OIDC-authenticated clients
Each key accepts one of allow, deny, openfga or scriptlet, with tls additionally available for restricted TLS clients.
Documentation: https://linuxcontainers.org/incus/docs/main/authorization/
Introducing incus low-level¶
The incus debug command has been renamed to incus low-level.
As part of that, it also gained a few new sub-commands:
bitmap(dirty bitmap management for VMs)nvram(as mentioned above)repair(repair actions for instances)
BGP unnumbered support¶
Incus now supports unnumbered BGP for its peering with external routers.
This is done through a new bgp.peers.NAME.interface configuration key which is used as an alternative to bgp.peers.NAME.address.
When set, the BGP session is established over the given interface using BGP unnumbered. The peer's IPv6 link-local address is discovered automatically and IPv4 routes are exchanged using the extended next-hop capability.
Documentation: https://linuxcontainers.org/incus/docs/main/howto/network_bgp/
Control of nested virtualization¶
The security.nesting instance configuration key now also applies to virtual machines.
Unlike containers, this defaults to true to retain our previous default behavior.
When set to false, the svm and vmx CPU flags will get disabled for the guest VM.
A matching restricted.virtual-machines.nesting project configuration key was also added. When set to block, all virtual machines in the project must have security.nesting set to false.
Documentation: https://linuxcontainers.org/incus/docs/main/reference/projects/
Listing instances across all remotes¶
The incus list command gained an --all-remotes flag, showing the instances from all configured remotes in a single view with an extra remote column.
stgraber@vorash:~$ incus list --all-remotes --all-projects
+------------+---------+-------------+---------+-------------------------+--------------------------------------------------+-----------------+-----------+----------+
| REMOTE | PROJECT | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | LOCATION |
+------------+---------+-------------+---------+-------------------------+--------------------------------------------------+-----------------+-----------+----------+
| local | default | c1 | RUNNING | 10.80.1.4 (eth0) | fd42:8b9f:58e4:b6ac:1266:6aff:fe2d:7101 (eth0) | CONTAINER | 0 | none |
+------------+---------+-------------+---------+-------------------------+--------------------------------------------------+-----------------+-----------+----------+
| local | default | incus-os | STOPPED | | | VIRTUAL-MACHINE | 0 | none |
+------------+---------+-------------+---------+-------------------------+--------------------------------------------------+-----------------+-----------+----------+
| local | default | my-nginx | STOPPED | | | CONTAINER (APP) | 0 | none |
+------------+---------+-------------+---------+-------------------------+--------------------------------------------------+-----------------+-----------+----------+
| local | default | v1 | STOPPED | | | VIRTUAL-MACHINE | 0 | none |
+------------+---------+-------------+---------+-------------------------+--------------------------------------------------+-----------------+-----------+----------+
| s-castiana | default | caddy-test | STOPPED | | | CONTAINER (APP) | 0 | none |
+------------+---------+-------------+---------+-------------------------+--------------------------------------------------+-----------------+-----------+----------+
| s-castiana | default | dev-os | STOPPED | | | VIRTUAL-MACHINE | 1 | none |
+------------+---------+-------------+---------+-------------------------+--------------------------------------------------+-----------------+-----------+----------+
| s-castiana | default | isolated-oc | STOPPED | | | VIRTUAL-MACHINE | 0 | none |
+------------+---------+-------------+---------+-------------------------+--------------------------------------------------+-----------------+-----------+----------+
| s-castiana | default | rhel10 | RUNNING | 10.10.10.225 (eth0) | 2602:fc62:ef:1010:1266:6aff:fe69:dd25 (eth0) | CONTAINER (APP) | 0 | none |
+------------+---------+-------------+---------+-------------------------+--------------------------------------------------+-----------------+-----------+----------+
| s-castiana | default | test | RUNNING | 10.226.131.1 (incusbr0) | fd42:10b9:5a70:b459::1 (incusbr0) | VIRTUAL-MACHINE | 0 | none |
| | | | | 10.10.10.73 (_venp5s0) | 2602:fc62:ef:1010:1266:6aff:fe11:9cfd (_venp5s0) | | | |
+------------+---------+-------------+---------+-------------------------+--------------------------------------------------+-----------------+-----------+----------+
| s-castiana | default | v1 | RUNNING | 10.10.10.80 (enp5s0) | 2602:fc62:ef:1010:1266:6aff:fe49:20ca (enp5s0) | VIRTUAL-MACHINE | 0 | none |
+------------+---------+-------------+---------+-------------------------+--------------------------------------------------+-----------------+-----------+----------+
| s-dakara | default | c1 | STOPPED | | | CONTAINER | 0 | none |
+------------+---------+-------------+---------+-------------------------+--------------------------------------------------+-----------------+-----------+----------+
| s-dakara | default | dev-os | STOPPED | | | VIRTUAL-MACHINE | 0 | none |
+------------+---------+-------------+---------+-------------------------+--------------------------------------------------+-----------------+-----------+----------+
| s-dakara | default | v1 | RUNNING | 172.17.250.222 (enp5s0) | 2602:fc62:c:250:1266:6aff:feb0:6588 (enp5s0) | VIRTUAL-MACHINE | 0 | none |
+------------+---------+-------------+---------+-------------------------+--------------------------------------------------+-----------------+-----------+----------+
| s-dakara | default | win2003 | STOPPED | | | VIRTUAL-MACHINE | 0 | none |
+------------+---------+-------------+---------+-------------------------+--------------------------------------------------+-----------------+-----------+----------+
| s-dakara | default | win2025 | STOPPED | | | VIRTUAL-MACHINE | 0 | none |
+------------+---------+-------------+---------+-------------------------+--------------------------------------------------+-----------------+-----------+----------+
Improved VM agent handling¶
The VM agent can now run in environments that lack virtio-vsock by instead reporting OS data through a serial link. This allows at least correct reporting of IP configuration and OS in environments that historically couldn't run the agent at all.
Network allocations improvements¶
The network allocations API now includes the network that each allocation belongs to.
On the CLI side, incus network list-allocations shows the new network column and gained a --summary flag for a more compact view.
stgraber@vorash:~$ incus network list-allocations
+-------------------------+---------------------------------------------+----------+----------+-----+-------------------+
| USED BY | ADDRESS | NETWORK | TYPE | NAT | MAC ADDRESS |
+-------------------------+---------------------------------------------+----------+----------+-----+-------------------+
| /1.0/instances/c1 | 10.80.1.4/32 | incusbr0 | instance | YES | 10:66:6a:2d:71:01 |
+-------------------------+---------------------------------------------+----------+----------+-----+-------------------+
| /1.0/instances/c1 | fd42:8b9f:58e4:b6ac:1266:6aff:fe2d:7101/128 | incusbr0 | instance | YES | 10:66:6a:2d:71:01 |
+-------------------------+---------------------------------------------+----------+----------+-----+-------------------+
| /1.0/instances/incus-os | fd42:8b9f:58e4:b6ac:1266:6aff:fef3:2d9/128 | incusbr0 | instance | YES | 10:66:6a:f3:02:d9 |
+-------------------------+---------------------------------------------+----------+----------+-----+-------------------+
| /1.0/instances/my-nginx | fd42:8b9f:58e4:b6ac:1266:6aff:fe61:8058/128 | incusbr0 | instance | YES | 10:66:6a:61:80:58 |
+-------------------------+---------------------------------------------+----------+----------+-----+-------------------+
| /1.0/instances/v1 | fd42:8b9f:58e4:b6ac:1266:6aff:fe3f:71f2/128 | incusbr0 | instance | YES | 10:66:6a:3f:71:f2 |
+-------------------------+---------------------------------------------+----------+----------+-----+-------------------+
| /1.0/networks/incusbr0 | 10.80.1.1/24 | incusbr0 | network | YES | |
+-------------------------+---------------------------------------------+----------+----------+-----+-------------------+
| /1.0/networks/incusbr0 | fd42:8b9f:58e4:b6ac::1/64 | incusbr0 | network | YES | |
+-------------------------+---------------------------------------------+----------+----------+-----+-------------------+
stgraber@vorash:~$ incus network list-allocations --summary
+----------+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| NETWORK | SUBNET | USED |
+----------+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| incusbr0 | 10.80.1.0/24 | 10.80.1.4 |
+----------+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| incusbr0 | fd42:8b9f:58e4:b6ac::/64 | fd42:8b9f:58e4:b6ac:1266:6aff:fe2d:7101, fd42:8b9f:58e4:b6ac:1266:6aff:fe3f:71f2, fd42:8b9f:58e4:b6ac:1266:6aff:fe61:8058, fd42:8b9f:58e4:b6ac:1266:6aff:fef3:2d9 |
+----------+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
I/O limits improvements¶
unix-block devices now support the limits.read and limits.write configuration keys, behaving like their disk device equivalents and accepting either a byte/s value or an IOPS value.
Additionally, it's now possible to set both a byte/s limit and an IOPS limit at the same time on disk and unix-block devices by using a comma separated list of values:
incus config device set my-vm data limits.read=30MiB,1000iops
Documentation: https://linuxcontainers.org/incus/docs/main/reference/devices_unix_block/
Storage pool metrics¶
The /1.0/metrics endpoint now includes storage pool usage data:
incus_storage_pool_size_bytes{pool="<pool>",driver="<driver>"}incus_storage_pool_used_bytes{pool="<pool>",driver="<driver>"}
Documentation: https://linuxcontainers.org/incus/docs/main/metrics/
ACME External Account Binding¶
The ACME integration now supports External Account Binding (EAB) through two new server configuration keys, acme.eab.kid and acme.eab.hmac.
This allows using ACME providers which require pre-established account credentials.
Documentation: https://linuxcontainers.org/incus/docs/main/authentication/
CPU cluster reporting in the resources API¶
The resources API now reports a cluster field for each CPU core.
This is useful in ARM big.LITTLE environments where core identifiers aren't unique per socket but instead per cluster of cores.
This is visible in incus info --resources and is also used to make the VM CPU topology validation cluster-aware.
Native Windows and macOS installers¶
Incus releases now come with native installers for the client tool, an MSI package for Windows and a PKG for macOS, built and published as part of the release process.
Worth noting that at this time neither of those are signed, so installation may be challenging.
Complete changelog¶
Here is a complete list of all changes in this release:
Full commit list
- cmd/incusd:
isolatedonrestricted.containers.privilegeprevents settingsecurity.privilegedtotrue - doc: regenerate configurable options index
- api: regenerate
/1.0/metadata/configurationoptions - incus/move: Apply --storage pool to dependent disks
- github: Build Windows and MacOS native installers.
- doc: fix
config setdeprectation warning - Translated using Weblate (Japanese)
- incusd/firewall: Fix double Wait in nftParseRuleset
- incusd/device: Allow static CIDR address on unmanaged bridge
- incusd/instance/qemu/qmp: Run guest memory dump detached
- incusd/instance/qemu/qmp: Add per-command timeout
- github: Add a build workflow
- build(deps): bump actions/download-artifact from 4 to 8
- build(deps): bump actions/upload-artifact from 4 to 7
- shared/logger: Add WarnOnErrorExcept helper
- incus: Avoid double-close warning on volume/bucket/instance import
- incusd/device: Reset VM disk I/O limits on unset
- incusd/devices: Allow /32 and /128 for OCI addresses
- incusd/operations: Fix nil deref race in Cancel
- cmd/generate-database/db: Manually specify uuid package
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- incusd/instance/qemu/qmp: Bump timeout for block commands
- incusd/instance/qemu/qmp: Bump timeout for slow synchronous commands
- incus/server/storage/driver/ceph: Wait, if image is already in the unpacking stage on another cluster member.
- incus: Avoid double-close warning on export and file pull
- doc/incus-cli: reword docs for configuration file path
- incusd/device/disk: Use resolved project for Ceph ISO RBD names
- incusd: Switch OCI network configuration to interfaces.json
- incusd/device: Mention "none" as valid NIC gateway value
- incusd: Support "none" gateways in OCI containers
- doc: Update configuration option metadata
- cmd/incus-agent: Implement Windows osLoadModules to check viosock service
- cmd/incus-agent: Only start agent http server if osLoadModules succeeds
- cmd/incus-agent: Write state data to ringbuffer if no http server present
- internal/server/instance/drivers/qmp: Bump ringbuffer size to 16K
- internal/server/instance/drivers/qmp: Record instance state retrieved from ringbuffer
- internal/server/instance/drivers: Treat degraded agent as offline, except when fetching state
- incusd/instance/qmp: Bump some more timeouts
- incusd: Use constant-time comparison for secrets
- incusd: Limit websocket control message size
- incusd/device: Use IsAPIName for device name validation
- incusd/storage/s3: Pin certificate for local S3 bucket transfers
- incusd/db/query: Use hex blob literal in database dumps
- incusd/instance/qemu: Use a shared memory backend on all architectures
- incusd/storage: Honor btrfs.compression on instances from optimized images
- test: Cover btrfs.compression on instances from optimized images
- incusd/storage/s3: Add GetBucketVersioning
- incus/server/storage/driver/backend: Wait, if image is already in the unpacking stage on another cluster member.
- incus/server/storage/driver/cephfs: Implement stub for IsImageCloneSourceReady function
- incus/server/storage/driver/common: Implement stub for IsImageCloneSourceReady function
- incus/server/storage/driver/linstor: Implement stub for IsImageCloneSourceReady function
- incus/server/storage/driver/lvm: Implement stub for IsImageCloneSourceReady function
- incus/server/storage/driver/truenas: Implement stub for IsImageCloneSourceReady function
- incusd/network/ovn: Add Enabled option to OVNSwitchPortOpts
- incusd/network/ovn: Add UpdateLogicalSwitchPortEnabled
- incusd/network/ovn: Add GetLogicalSwitchActivePorts
- incusd/network/ovn: Make SetLogicalSwitchQoSRules replace existing rules
- incusd/network/ovn: Extract instanceDevicePortOpts
- incusd/network/ovn: Only consider enabled switch ports as active
- incusd/network/ovn: Tweak instance port startup logic
- incusd/network/ovn: Keep instance ports until device removal
- incusd/network/ovn: Create instance ports on device add
- incusd/forknet: Wait up to 5s for initial DHCP configuration
- api: network_bgp_peer_interface
- incusd/bgp: Add support for unnumbered peers
- incusd/network: Add bgp.peers.NAME.interface
- doc: Update config
- doc/network/bgp: Document BGP unnumbered
- incusd/instance/qemu: Handle missing kvm64
- client: Only pass device overrides to sources supporting them
- incusd/instance/qemu: Serialize CPU pinning data in the CPU topology
- incusd/instance/qemu: Re-compute CPU pins on stateful start
- incusd/network/ovn: Fix NAT for network forward default targets
- incsd/device/config: Add DataFilePath field to MountEntryItem
- incusd/instance/drivers: Add support for raw-format block devices
- Translated using Weblate (Japanese)
- Translated using Weblate (Russian)
- Translated using Weblate (Swedish)
- incusd/instance: Allow security.nesting on VMs
- incusd/instance/qemu: Turn off svm and vmx when security.nesting is disabled
- api: projects_restricted_virtual_machines_nesting
- incusd/project: Add restricted.virtual-machines.nesting
- doc: Update config
- incus: Fix remote path handling on Windows
- incusd/forksyscall: Fix mknod emulation for relative paths
- internal/instance: Mention cgroup2 limitations
- doc: Update config
- incusd/auth: Move OpenFGA config to authorization.* namespace
- doc/authorization: Update for authorization config namespace
- doc: Update config
- api: authorization_config
- tests: Update OpenFGA tests for authorization config keys
- incusd/dev_incus: Fix race in ConnPidMapper access
- incusd/forksyscall: Check for path truncation in mknod emulation
- api: network_allocations_network extension
- shared/api: add Network field to NetworkAllocations
- incusd/network-allocations: populate network field
- doc/rest-api: Refresh swagger YAML
- incus/network: add --summary flag to list-allocations
- i18n: Update translation templates
- incusd/storage/ceph: Tolerate concurrently deleted RBD entities in zombie cleanup
- incusd/storage/ceph: Serialize volume deletion on the parent image
- incusd/storage/ceph: Tolerate concurrent-deletion handling for non-image parents and renames
- api: Add gpu_native_context extension
- incusd/device: Add native-context GPU device type
- incusd/instance/drivers: Support native-context GPU in QEMU
- incusd: Fix race between forkfile cleanup and respawn
- incusd/events: Don't warn on double connection close
- Translated using Weblate (Portuguese)
- incusd/apparmor: Fix alignment
- incusd/apparmor: Allow DRM render nodes for native-context GPU
- doc: Document the native-context GPU type
- doc: Update config
- incusd/linux: Add GrantPosixACLUser
- incusd/device: Grant render node access to native-context GPUs
- incusd/network/bridge: Don't NAT traffic between managed bridge networks
- incusd/storage/zfs: Clear volume quota during optimized refresh
- incusd/metrics: Add storage pool usage metric types
- incusd/metrics: Collect storage pool usage
- doc: Document storage pool metrics
- incusd/storage/zfs: Restore volume quota on refresh error
- api: Add instance_port_forward extension
- shared/api: Add InstancePortForwardPost
- client: Add GetInstancePortForwardConn
- incus-agent: Add port-forward API
- incusd/forknet: Add connect command
- incusd/instance: Add PortForwardConn
- incusd/auth: Add can_connect_tcp
- incusd/instances: Add port-forward API
- incus: Add port-forward command
- tests: Add port forward tests
- doc/rest-api: Refresh swagger YAML
- i18n: Update translation templates
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Tamil)
- Translated using Weblate (Dutch)
- Translated using Weblate (Dutch)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Greek)
- Translated using Weblate (Italian)
- Translated using Weblate (Italian)
- Translated using Weblate (Russian)
- Translated using Weblate (Russian)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (Georgian)
- Translated using Weblate (Georgian)
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- Translated using Weblate (Japanese)
- incusd/metrics: Rename incus_storage_pool_total_bytes to incus_storage_pool_size_bytes
- Translated using Weblate (Japanese)
- incusd/seccomp: Handle syscalls from non-leader threads
- incusd/instance/lxc: Stop the DHCP client from the stop hook
- shared/tls: Use first successful connection in RFC3493Dialer
- incusd/instances/common: Fix typo
- incusd/device: Handle CIDR values in NIC ipv4.address/ipv6.address
- incusd/network: Handle CIDR values in NIC ipv4.address/ipv6.address
- client: Only retry TLS dial on certificate verification errors
- incusd/network/ovn: Tolerate stop failures during network deletion
- incusd/device/nic_ovn: Guard cleanup against unavailable network
- incusd/networks: Run driver deletion for locally pending networks
- incusd: Honor target parameter in bitmap endpoints
- incusd/cluster: Resolve instance volumes by name in ConnectIfVolumeIsRemote
- incus/console: Escape spaces in SPICE console socket URI
- incus: Don't persist INCUS_REMOTE as the default remote
- incusd/storage/s3: Support conditional writes
- incusd/instance/qmp: Rework block job monitoring
- incusd/instance/qemu: Harden ephemeral snapshot teardown
- incusd/instance/qmp: Remove unused event channel logic
- client: Always set TLS ServerName on dial
- incusd/storage/btrfs: Restrict subvolume sources under the daemon dir
- incusd: Don't warn on double close of downloaded image files
- incus/cluster_group: Change group separator in assign subcommand
- incus/profile: Change profile separator in assign subcommand
- test: Fix assign separator
- i18n: Update translation templates
- incus/file: Fix progress reporting on stdin push
- incus/import: Fix progress reporting on stdin import
- incus/storage_bucket: Fix progress reporting on stdin import
- incus/storage_volume: Fix progress reporting on stdin import
- incus/storage_volume_file: Fix progress reporting on stdin push
- incusd/network/zone: Return a single SOA record on plain SOA queries
- incusd/storage: Fix races in connectOfflineNBD
- incusd/locking: Make unlock functions release only their own lock
- incusd/storage: Hold NBD operation lock for the whole session
- Translated using Weblate (Portuguese)
- build(deps): bump actions/setup-go from 6 to 7
- incusd/network/ovn: Detect stale database connections
- incusd/network/ovn: Remove NB client singleton
- incusd/storage: Use qcow2 virtual size as instance block size
- incusd/storage: Skip root disk size check on remote cluster move
- incusd/device: Make disk I/O limit parsing reusable
- api: Add unix_block_limits extension
- incusd/device: Add I/O limits for unix-block devices
- doc: Update config
- incusd/auth: Add allow/deny authorizers
- incusd/request: Add CtxUnixIsRoot
- incusd: Add support for multiple authorizers
- incusd: Set defaults for authorization.client.* keys
- tests: Add authorization router tests
- tests: Set authorization.client.* keys
- doc/authorization: Update for authorization client routing
- doc: Update config
- api: authorization_client_routing
- Translated using Weblate (Georgian)
- incusd/device: Require CIDR address when NIC gateway is set
- incusd/storage: Honor writable flag on offline NBD exports
- incusd/seccomp: Use namespace credentials for FUSE mounts
- incusd/dev_incus: Detect LXC monitors from cgroup v2
- incus: Rename debug subcommand to low-level and advertise it
- api: instance_nvram
- shared/api: Add InstanceNVRAMVariable struct
- shared/uefi: Add OVMF parsing primitives
- shared/uefi: Add various variable dissectors
- incusd/instance: Add GetNVRAM
- client: Add NVRAM getters
- incusd/instances: Add NVRAM API
- doc/rest-api: Refresh swagger YAML
- incus/low-level: Add nvram subcommand
- incusd/instance/qemu: Initialize NVRAM on first query
- golangci: Ignore GUID names and comments
- i18n: Update translation templates
- shared/uefi: Add some OVMF dumping primitives
- incusd/instance: Add SetNVRAM
- client: Add NVRAM variable deletion
- incusd/instances: Add NVRAM variable deletion
- doc/rest-api: Refresh swagger YAML
- incus/low-level: Add nvram unset subcommand
- i18n: Update translation templates
- api: Add disk_io_limits_combined extension
- incusd/device: Allow combining byte/s and IOPS limits
- doc/storage_volumes: Mention combined I/O limits
- doc: Update config
- Add storage note about loop devices on COW fs
- incusd/instance/lxc: Use project-qualified CRIU restore name
- incusd/instance/lxc: Clean devices after failed CRIU restore
- Translated using Weblate (Portuguese)
- incusd/storage: Fix instance copy for non-block volumes
- shared/ask: fix password prompt loop on Windows
- incusd/storage: Add support for '--refresh' for instances with dependent disks
- shared/ask: Fix newlines after functional blocks
- incusd/storage/drivers: Don't set received UUID on main btrfs volume
- incusd: Add cpus= argument to forkqemu
- incusd/instance/qemu: Confine QEMU startup to a single CPU type
- api: resources_cpu_cluster
- shared/api: Add Cluster to ResourcesCPUCore
- shared/resources: Fix CPU core grouping to handle core clusters
- incusd/instance/qemu: Make CPU topology validation cluster-aware
- incus/info: Show the CPU cluster of each core
- i18n: Update translation templates
- doc/rest-api: Refresh swagger YAML
- shared/ask: Fix static analysis
- incusd/instance/lxc: Fix OCI entrypoint escaping
- incusd/seccomp: Report FUSE mount helper failures
- incusd/storage/drivers: Fix volume activation of filesystem snapshots
- incusd/instance/qemu: Resize metadata image on disk size change
- incusd: Drop metadata image on instance copy and import
- incusd/storage: Strip unsafe symlinks in externally-supplied instance data
- incusd/storage/s3: Reject symlinks in bucket backups
- incusd/instance/qemu: Fix publish of qcow2-backed volumes
- incusd/auth: Fill missing local bucket location
- doc: Ignore bugzilla.opensuse.org in linkcheck
- Translated using Weblate (Portuguese)
- incusd/storage: Allow expected symlinks in instance metadata
- incusd/instance/qmp: Bump blockdev-add/del timeouts
- internal/filter: Prefer exact key match in ValueOf
- internal/filter: Only allow abbreviating the namespace in DotPrefixMatch
- internal/filter: Workaround spellcheck
- incus/network/allocations: Add a network column
- i18n: Update translation templates
- Translated using Weblate (Portuguese)
- incusd/cluster: Allow certificate updates with offline members on same-key renewals
- incusd/daemon: Sync cluster certificate from leader on startup
- incusd: Keep cluster listener when core.https_address changes
- incusd/firewall/nftables: Use a bridges set for cross-bridge NAT exclusions
- incusd/network/bridge: Drop the cross-bridge NAT rules refresh
- incusd/firewall: Remove unused SNATOpts.ExcludeInterfaces
- build(deps): bump KineticCafe/actions-dco from 3.1.0 to 3.2.0
- build(deps): bump actions/labeler from 6 to 7
- incusd/cgroup: Add swap accounting detection
- incusd/seccomp: Skip swap in sysinfo when swap accounting is unavailable
- incusd/instance/lxc: Handle missing swap accounting
- api: acme_eab
- shared/tls: Add EAB support to RunACMEChallenge
- incusd/cluster/config: Add acme.eab.kid and acme.eab.hmac
- incusd/acme: Pass EAB configuration to lego
- doc/authentication: Mention External Account Binding
- doc: Update config
- doc: Add EAB and HMAC to wordlist
- incusd/instance: Prevent root disk re-creation on running instances
- incusd/instance/qemu: Prevent root disk hot-unplug
- Translated using Weblate (Russian)
- Translated using Weblate (Swedish)
- incusd/instance-types: Use clouds.yaml for the list of clouds
- incusd/instance-types: Add support for root disk size
- incusd: Document HTTP 201 return code in Swagger specs
- incusd: Fix incorrect return codes in Swagger specs
- incusd/network_integrations: Return 201 with Location on rename
- incusd: Document HTTP 412 on instance and snapshot PUT/PATCH
- incusd/response: Add Conflict swagger response definition
- incusd: Document baseline error codes for endpoints using SmartError
- doc/rest-api: Refresh swagger YAML
- incusd/storage: Strip sub-path from dependent volume sources
- incusd/migration: Strip sub-path from dependent volume source overrides
- incusd/instance: Strip sub-path from dependent volume sources
- incusd: Strip sub-path from dependent volume sources
- incusd/storage: Allow unattached volumes in qcow2 migration
- incusd/instance/qmp: Add copy-before-write export helpers
- incusd/instance/qemu: Use copy-before-write overlays for NBD exports
- incusd/main_forkfile: Set SFTP max packet size to 128KiB
- incus-agent: Set SFTP max packet size to 128KiB
- internal/linux: detect initial user namespace by inode
- incus/launch: Link to the supported instance types
- doc/howto/instances_create: Update instance types link
- i18n: Update translation templates
- incusd/storage/ceph: Bound RBD unmap with a 30s timeout
- shared/archive: Add CompressionThreads
- incusd/images: Support reproducible pigz output
- shared/archive: Prefer pigz for decompression when available
- incusd/images: Prefer pigz for compression when available
- Update gomod
- client/oci: Use pgzip for image compression
- tests: Update godeps
- incusd/qemu: Use pgzip for state compression
- incus/list: Add --all-remotes
- tests: Add --all-remotes test
- i18n: Update translation templates
- client: Add ETag on NVRAM variable getter
- incusd/instances: Add ETag on NVRAM variable getter
- client: Add NVRAM variable update
- incusd/instances: Diverse fixes
- shared/api: Add InstanceNVRAMVariablePut struct
- shared/uefi: Add some OVMF formatting primitives
- incusd/instances: Add NVRAM variable update
- doc/rest-api: Refresh swagger YAML
- incus: Modify argument order in flag helpers
- incus/usage: Add MakeKV
- incus/usage: Add AsSingleton
- incus/low-level: Add nvram set subcommand
- incus/low-level: Add nvram edit subcommand
- api: instance_nvram (updated)
- i18n: Update translation templates
- incusd/firewall/nftables: Fix template race in applyNftConfig
- incusd: Fix repair endpoint swagger method
- client: Add RepairInstance
- incus/low-level: Add bitmaps subcommand
- incus/low-level: Add repair subcommand
- client: Add GetStorageVolumeBitmap
- incus/storage_volume: Add bitmap subcommand
- i18n: Update translation templates
- incusd/instance/qemu: Release operation lock on snapshot size failure
- incusd/operations: Remove operation from map on DB registration failure
- incusd: Fix goroutine leak when cluster instance list times out
- generate-database: Add ReferenceID filtering for reference tables
- incusd/db: Add ReferenceID filtering to Config and Device
- incusd/db/cluster: Update generated code
- incusd/db/cluster: Add referenced profile query helpers
- incusd/db: Only load referenced profiles when filling instances
- incusd/db/cluster: Scope profile queries in Instance.ToAPI
- incusd: Only load referenced profile data
- incusd/backup: Only load referenced profile data
- incusd/project: Scope config queries to project resources
- incusd/scriptlet: Scope instance device query
- incusd/db: Port instance config and device fill to generated queries
- incusd/instances: Add NVRAM rebuild as a repair action
- incusd/instance: Add ResetNVRAM
- api: instance_nvram (updated)
- incus/low-level: Add rebuild-nvram to the list of repair actions
- i18n: Update translation templates
- incusd/instances: Fix capitalization
- incusd/project: Restrict volume creation options in restricted projects
- internal/instance: Prevent line breaks in NVIDIA config values
- incusd/instance: Confine OCI network writes to instance root
- incusd/storage: Confine backup.yaml write to instance root
- incusd/instance: Confine metadata.yaml access to instance root
- incusd/instance/qemu: Confine template access to instance root
- incusd/images: Validate image fingerprint for all protocols
- incusd/storage: Validate volume name on ISO and backup import
- incusd/instances: Validate instance name on backup import
- incusd/instances: Re-check restrictions after copy config merge
- incusd/instance: Enforce project restrictions on migration overrides
- incusd/project: Enforce isolated restriction when idmap key omitted
- incusd: Expand network address set project for authorization
- incusd/instance: Fix NVIDIA require.cuda and require.driver handling
- incusd/instance: Confine exec-output access to its directory
- incusd: Fail closed on unknown authorization project expansion
- incusd/instance/qemu: Use os.Root for template output
- client: Make GetRawInstanceNVRAMGUIDVar return attributes
- incusd/response: Allow custom headers in devIncusResponse
- shared/uefi: Export dumpAttributes
- incusd/instances: Add headers to raw NVRAM variable response
- incus/low-level: Support more formats in NVRAM getter and setter
- i18n: Update translation templates
- Makefile: Bump to 1.25.12
- Update gomod
- Translated using Weblate (Georgian)
- Translated using Weblate (Georgian)
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Russian)
- Translated using Weblate (Russian)
- Translated using Weblate (Tamil)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (Greek)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (Dutch)
- Translated using Weblate (Dutch)
- Translated using Weblate (Italian)
- Translated using Weblate (Italian)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Portuguese)
- Release Incus 7.3
Documentation¶
The Incus documentation can be found at:
https://linuxcontainers.org/incus/docs/main/
Packages¶
There are no official Incus packages as Incus upstream only releases regular release tarballs. Below are some available options to get Incus up and running.
Installing the Incus server on Linux¶
Incus is available for most common Linux distributions. You'll find detailed installation instructions in our documentation.
https://linuxcontainers.org/incus/docs/main/installing/
Homebrew package for the Incus client¶
The client tool is available through HomeBrew for both Linux and MacOS.
https://formulae.brew.sh/formula/incus
Chocolatey package for the Incus client¶
The client tool is available through Chocolatey for Windows users.
https://community.chocolatey.org/packages/incus/7.3.0
Winget package for the Incus client¶
The client tool is also available through Winget for Windows users.
https://winstall.app/apps/LinuxContainers.Incus
Support¶
Monthly feature releases are only supported up until the next release comes out. Users needing a longer support length and less frequent changes should consider using Incus 7.0 LTS instead.
Community support is provided at: https://discuss.linuxcontainers.org
Commercial support is available through: https://zabbly.com/incus
Bugs can be reported at: https://github.com/lxc/incus/issues
Incus 7.2 has been released¶
Jun 26, 2026
The Incus team is pleased to announce the release of Incus 7.2!
It's another pretty busy release for us with a varied set of new features across the board as well as the usual set of performance improvements and bugfixes.
As usual, you can try Incus for yourself online: Linux Containers - Incus - Try it online
Security fixes¶
This release fixes 8 security issues:
- CVE-2026-48749 (critical) - Arbitrary file read+write on host via
rootfs/symlink in malicious image - CVE-2026-48750 (critical) - Arbitrary file write on host via
exec-outputsymlink in crafted image - CVE-2026-48751 (critical) - Restricted project bypass leading to arbitrary command execution
- CVE-2026-48752 (critical) - Arbitrary file read+write on host via
templates/symlink in malicious image - CVE-2026-48755 (critical) - Argument injection in backup compression algorithm leading to arbitrary file write and command execution
- CVE-2026-48769 (critical) - Arbitrary file write on client due to trusted image hash
- CVE-2026-55621 (high) - Project restriction bypass for custom volume copy across projects
- CVE-2026-55622 (high) - Project restriction bypass in instance copy across projects
New features¶
Per-instance SELinux integration¶
Incus now supports per-instance SELinux confinement for both containers and virtual machines, with automatic MCS (Multi-Category Security) level allocation to isolate instances from one another on the same host.
Four new instance configuration keys were introduced:
security.selinux.domain: Override the SELinux process domain.security.selinux.type: Override the SELinux file type used for the instance storage.security.selinux.level: Override the SELinux MCS level.security.selinux.label_rootfs: Control rootfs labeling behavior (auto,alwaysornever).
The computed context is persisted in the volatile.selinux.context key so that the allocated MCS range stays stable across restarts.
Documentation: https://linuxcontainers.org/incus/docs/main/reference/instance_options/#instance-options-security
New incus default CLI command¶
A new incus default command has been added to help control CLI default options.
stgraber@orilla:~$ incus default show
list_format: ""
console_type: ""
console_spice_command: ""
no_color: false
stgraber@orilla:~$ incus default set list_format=compact
stgraber@orilla:~$ incus storage list
NAME DRIVER DESCRIPTION USED BY STATE
default zfs 11 CREATED
stgraber@orilla:~$ incus default unset list_format
stgraber@orilla:~$ incus storage list
+---------+--------+-------------+---------+---------+
| NAME | DRIVER | DESCRIPTION | USED BY | STATE |
+---------+--------+-------------+---------+---------+
| default | zfs | | 11 | CREATED |
+---------+--------+-------------+---------+---------+
stgraber@orilla:~$
The documentation for those options has also been updated:
https://linuxcontainers.org/incus/docs/main/client-config/
Filtered server info by default¶
incus info now defaults to a filtered view of the server information.
This hides (replaces with SENSITIVE) all private keys, certificates and other tokens by default, requiring --show-sensitive to reveal them. It also makes the output shorter by hiding the full list of API extensions and instead just showing a count.
Keepalive timeout from the CLI¶
The incus remote command gained a set-keepalive subcommand to configure (or disable) the connection keepalive timeout.
stgraber@orilla:~$ incus remote set-keepalive my-remote 30
stgraber@orilla:~$ incus remote set-keepalive my-remote 0
The CLI keepalive feature is used to maintain a connection with the remote server, making subsequent interactions a fair bit faster. This is particularly useful on higher latency connections as well as in environments where a lot of incus commands are being run.
Better OS-specific handling of CLI configuration¶
The CLI now stores its configuration and cache data in the correct per-OS location.
Up until now, the CLI tool would always use ~/.config/incus/ and ~/.cache/incus/ regardless of operating system, leading to an unusual location on MacOS and Windows.
With Incus 7.2, MacOS now uses ~/Library/Application Support/incus/ whereas Windows uses %APPDATA%\incus. The CLI will automatically relocate its configuration on first use.
Standalone server certificate update¶
A new incus admin update-certificate command allows replacing the server certificate on standalone (non-clustered) systems.
This is the equivalent to incus cluster update-certificate but for standalone systems. It replaces directly modifying the files in /var/lib/incus/.
Static network configuration for OCI containers¶
OCI application containers can now have their network statically configured.
The NIC ipv4.address and ipv6.address keys accept a CIDR value to statically configure the address inside the container, and the new ipv4.gateway and ipv6.gateway keys set the default gateway. Setting either address to none prevents any configuration for that address family and stops the built-in DHCP client from running on it.
For DNS, the new oci.dns.nameservers, oci.dns.domain and oci.dns.search instance configuration keys set the initial content of the container's resolv.conf, which is then extended with anything received over DHCP.
All of those keys are only valid for OCI containers.
stgraber@orilla:~$ incus create docker:nginx my-nginx
Creating my-nginx
stgraber@orilla:~$ incus config set my-nginx oci.dns.nameservers=1.0.0.1,1.1.1.1 oci.dns.domain=stgraber.net
stgraber@orilla:~$ incus config device override my-nginx eth0 ipv4.address=10.10.10.2/24 ipv4.gateway=10.10.10.1
Device eth0 overridden for my-nginx
stgraber@orilla:~$ incus start my-nginx
stgraber@orilla:~$ incus list my-nginx
+----------+---------+-------------------+------------------------------------------------+-----------------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+----------+---------+-------------------+------------------------------------------------+-----------------+-----------+
| my-nginx | RUNNING | 10.10.10.2 (eth0) | fd42:8b9f:58e4:b6ac:1266:6aff:fecb:e324 (eth0) | CONTAINER (APP) | 0 |
+----------+---------+-------------------+------------------------------------------------+-----------------+-----------+
Per-instance BGP route advertisement¶
Managed bridge networks gained two new configuration keys, bgp.ipv4.instances and bgp.ipv6.instances.
When enabled, Incus advertises a /32 (IPv4) or /128 (IPv6) route over BGP for each running instance connected to the network, withdrawing the route again when the instance stops. This makes it easy to route directly to individual instances in a BGP environment.
As part of that, Incus has now grown the ability to learn instance IP addresses by monitoring ARP/NDP for a limited period of time on instance startup.
Documentation: https://linuxcontainers.org/incus/docs/main/reference/network_bridge/
Dynamic addresses in proxy NAT mode¶
Building on the new ability to detect instance IP addresses, proxy devices running in NAT mode can now use dynamic addresses and a wildcard listen address, removing the need to hardcode the instance address in the proxy device configuration.
stgraber@orilla:~$ incus launch docker:nginx my-nginx
Launching my-nginx
stgraber@orilla:~$ incus config device add my-nginx http-80 proxy listen=tcp:0.0.0.0:1234 connect=tcp:0.0.0.0:80 nat=true
Device http-80 added to my-nginx
stgraber@orilla:~$ incus list my-nginx
+----------+---------+--------------------+------------------------------------------------+-----------------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+----------+---------+--------------------+------------------------------------------------+-----------------+-----------+
| my-nginx | RUNNING | 10.80.1.162 (eth0) | fd42:8b9f:58e4:b6ac:1266:6aff:fe55:dbdb (eth0) | CONTAINER (APP) | 0 |
+----------+---------+--------------------+------------------------------------------------+-----------------+-----------+
stgraber@orilla:~$ ip -4 a show dev enp0s5
2: enp0s5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
altname enx001c42e6a809
inet 10.211.55.3/24 brd 10.211.55.255 scope global dynamic noprefixroute enp0s5
valid_lft 1031sec preferred_lft 1031sec
stgraber@orilla:~$ nc -v 10.211.55.3 1234
Connection to 10.211.55.3 1234 port [tcp/*] succeeded!
Expanded NBD access to VMs¶
A new GET /1.0/instances/{name}/nbd endpoint exposes all disks attached to a virtual machine over NBD, allowing concurrent access to every disk rather than a single volume at a time.
This is also wired up to a new incus debug nbd command which supports multiple concurrent client connections.
stgraber@orilla:~$ incus start v1
stgraber@orilla:~$ incus debug nbd v1
NBD listening on 127.0.0.1:36539
Those APIs are primarily meant for backup systems needing to easily and consistently access all of the drives on a VM. The NBD export also exposes the dirty bitmaps, allowing for easy incremental backups to be made.
Restoration can be done through the individual volume's NBD API when the instance is stopped.
Btrfs compression for storage volumes¶
A new btrfs.compression storage volume configuration key was added for the btrfs driver. It maps to the Btrfs compression property and takes the same values (for example zstd, lzo, zlib or none).
This can also be used to override compression settings from an existing btrfs filesystem, allowing for the Incus volumes to use a different compression algorithm as well as allowing turning off compression which then allows Incus to set the nocow flag on virtual machine disks.
Documentation: https://linuxcontainers.org/incus/docs/main/reference/storage_btrfs/
InfiniBand SR-IOV GUID configuration¶
infiniband devices using the sriov nictype now support two new configuration keys, node_guid and port_guid.
When set, the matching GUID of the allocated virtual function is changed to the provided value when the instance starts and restored to its original value when the instance stops.
Documentation: https://linuxcontainers.org/incus/docs/main/reference/devices_infiniband/
Websocket origin restriction¶
A new core.https_allowed_websocket_origin server configuration key was added.
It can be set to a comma-separated list of allowed origins or to the * wildcard, controlling which origins are accepted on websocket connections.
This is useful for cross-origin access as well as in some proxied environments.
Documentation: https://linuxcontainers.org/incus/docs/main/server_config/#server-options-core
Deferred function logging¶
A large, repository-wide change in this release adds logging for deferred cleanup calls.
As a result, users may notice a number of new WARNING level log entries (for example around closing files, sockets or response bodies). This is expected and does not indicate a regression; these errors were always occurring but were simply discarded before.
If you notice spurious/repetitive such messages, please let us know so they can be investigated or silenced.
Complete changelog¶
Here is a complete list of all changes in this release:
Full commit list
- Translated using Weblate (Greek)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Russian)
- Translated using Weblate (Russian)
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- Translated using Weblate (Italian)
- Translated using Weblate (Italian)
- Translated using Weblate (Tamil)
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Georgian)
- Translated using Weblate (Georgian)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Dutch)
- Translated using Weblate (Dutch)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese)
- doc/authorization: Fix markdownlint
- shared/tls: Add support for Lego v5
- incusd/instance/lxc: Fix environment quoting
- incusd/storage/zfs: Refuse refresh only when snapshots have no common base
- shared/tls: Detect Lego version/behavior based on help
- doc/cloud-init: Clarify VM behavior
- github: Remove pre-installed java
- incus: Make unset commands accept several keys
- i18n: Update translation templates
- server/network: fix comment alignment
- server/network: fix scope of node specific network configs
- doc: update generated metadata
- server/metadata: update generated metadata
- internal/server/instance/drivers: Add migration-compatible hv flags with migration.stateful=true
- cmd/generate-database/db: Add joinas db tag
- cmd/generate-database/lex: Fix pluralizations ending in y
- Translated using Weblate (Portuguese)
- incusd/storage: Fix qcow2 custom volume backups
- incusd/instance/qemu: Remove stale migrate.sock before qcow2 export
- incusd/response: Abort piped exports that fail mid-stream
- incusd/migration: Detect target migration errors
- incusd/instance/qemu: Tweak migration fallback for VMs
- incusd: Reject migration onto existing instance of different type
- incusd/migrate: Bump migration handshake timeouts to 2 minutes
- Remove lxd-to-incus
- shared/api: Remove legacy logic
- incusd/cluster: Remove legacy logic
- Update gomod
- incusd: Use partial device validation when recovering instances
- incusd/network/ovn: Don't require an active chassis when updating tunnels
- incusd/network: Clean up stale OVS ports on startup
- incusd/cluster: Honor cluster group during evacuation
- incusd/cluster: Honor restricted cluster groups during evacuation
- incusd/cluster: Improve evacuation and restoration progress reporting
- global: Clean latest gofumpt
- incusd: Replace gorilla/mux with http.ServeMux
- Update go.mod
- api: instance_nbd
- client: Add GetInstanceNBDConn
- incusd/instances: Add NBD API
- incusd/storage: Implement all-disks NBD function
- incusd/instance/qmp: Add block snapshot transaction and node size helpers
- incusd/instance: Implement ConnectNBDAllDisks
- incusd/instance/qemu: Use empty NBD export name for single-disk exports
- incusd/instance/qemu: Report disk usage on stopped instances
- incus/debug: Add NBD command
- i18n: Update translation templates
- doc/rest-api: Refresh swagger YAML
- incusd/instance/drivers/qmp: Add locking around event handlers
- incusd/instance/qemu: Fully cleanup the old monitor
- incusd/storage/drivers: Handle sgdisk return codes
- incusd/auth/oidc: Refactor cookie setting logic
- shared/api: Add Server.Filtered()
- incus/info: Add --show-sensitive
- i18n: Update translation templates
- incusd/auth/oidc: Set expiration on authentication cookies
- incusd/auth/oidc: Clear cookies on terminal refresh failure
- shared/logger: Add WarnOnError helper
- incusd/instancewriter: Log deferred errors with WarnOnError
- incus: Log deferred errors with WarnOnError
- incus-agent: Log deferred errors with WarnOnError
- internal/incusos: Log deferred errors with WarnOnError
- internal/linux: Log deferred errors with WarnOnError
- incusd/migration: Log deferred errors with WarnOnError
- internal/netutils: Log deferred errors with WarnOnError
- internal/rsync: Log deferred errors with WarnOnError
- incusd/backup: Log deferred errors with WarnOnError
- incusd/cgroup: Log deferred errors with WarnOnError
- incusd/cluster: Log deferred errors with WarnOnError
- incusd/device: Log deferred errors with WarnOnError
- incusd/device/pci: Log deferred errors with WarnOnError
- incusd/dnsmasq: Log deferred errors with WarnOnError
- incusd/firewall/drivers: Log deferred errors with WarnOnError
- incusd/instance/drivers: Log deferred errors with WarnOnError
- incusd/network: Log deferred errors with WarnOnError
- incusd/network/acl: Log deferred errors with WarnOnError
- incusd/response: Log deferred errors with WarnOnError
- incusd/seccomp: Log deferred errors with WarnOnError
- incusd/storage: Log deferred errors with WarnOnError
- incusd/storage/quota: Log deferred errors with WarnOnError
- incusd/storage/s3: Log deferred errors with WarnOnError
- incusd/storage/s3/local: Log deferred errors with WarnOnError
- incusd/util: Log deferred errors with WarnOnError
- internal/util: Log deferred errors with WarnOnError
- incusd: Log deferred errors with WarnOnError
- incusd/storage/drivers: Log deferred errors with WarnOnError
- client: Log deferred errors with WarnOnError
- incusd/db: Log deferred errors with WarnOnError
- incusd/db/cluster: Log deferred errors with WarnOnError
- incusd/db/node: Log deferred errors with WarnOnError
- incusd/db/query: Log deferred errors with WarnOnError
- incusd/db/schema: Log deferred errors with WarnOnError
- shared/resources: Log deferred errors with WarnOnError
- shared/resources/usbid: Log deferred errors with WarnOnError
- shared/idmap: Log deferred errors with WarnOnError
- shared/cliconfig: Log deferred errors with WarnOnError
- shared/archive: Log deferred errors with WarnOnError
- shared/subprocess: Log deferred errors with WarnOnError
- shared/simplestreams: Log deferred errors with WarnOnError
- shared/util: Log deferred errors with WarnOnError
- incus-migrate: Log deferred errors with WarnOnError
- incus-benchmark: Log deferred errors with WarnOnError
- incus-user: Log deferred errors with WarnOnError
- incus-simplestreams: Log deferred errors with WarnOnError
- lxc-to-incus: Log deferred errors with WarnOnError
- generate-database/file: Log deferred errors with WarnOnError
- incusd: Rename forknet logger parameter to avoid shadowing
- incusd: Log deferred errors in main_forknet with WarnOnError
- github: Update DCO check
- Translated using Weblate (Italian)
- Translated using Weblate (Italian)
- Translated using Weblate (Georgian)
- Translated using Weblate (Georgian)
- Translated using Weblate (Greek)
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Tamil)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Portuguese)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (Dutch)
- Translated using Weblate (Dutch)
- Translated using Weblate (Russian)
- Translated using Weblate (Russian)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Portuguese)
- incusd/api_internal: Add server-certificate endpoint
- incus/admin: Add update-certificate command
- i18n: Update translation templates
- incusd/device/disk: Use virtiofsd --posix-acl=auto if supported
- Translated using Weblate (Russian)
- Translated using Weblate (Swedish)
- Translated using Weblate (Portuguese)
- incus/client: Fix panic when cancelling
- incus/remote: Move OIDC and cookie jar on rename
- incus/cluster: Document the actions
- incusd/console: Read the container console without resetting it
- incusd/linux: Add DialUnix helper
- incusd/qemu: Handle long run paths for the QMP socket
- incusd/qemu: Handle long run paths for the SPICE socket
- i18n: Update translation templates
- shared/cliconfig: Remove duplicate file closing
- Makefile: Remove pinned incus-os
- Update gomod
- global: Update for go-yaml/v4 rc5
- Translated using Weblate (Portuguese)
- Translated using Weblate (Swedish)
- Translated using Weblate (Russian)
- incus/alias: Add alias add command examples with args and numbered args
- doc/incus-alias: Fix italic and ref modifers order to correctly apply both modifiers
- Makefile: Fix sphinx build script to prevent issues with terminal colors
- doc/incus-alias: Refactor doc to create new use-case section and provide how-to examples
- i18n: Update translation templates
- incus/debug: Fix NBD description
- i18n: Update translation templates
- client: Add reuse support to GetInstanceNBDConn
- incusd/instance/qmp: Add listen path support to NBDServerStart
- incusd/instance/qmp: Allow multiple NBD server connections
- incusd/instance/qemu: Update NBDServerStart calls
- incusd/instance: Add reuse support to ConnectNBDAllDisks
- incusd/storage: Add reuse support to GetInstanceAllDisksNBD
- incusd/instances: Add NBD reuse parameter
- incus/debug: Support multiple NBD client connections
- i18n: Update translation templates
- doc/rest-api: Refresh swagger YAML
- incus/server/storage/driver/ceph: Shrink images to minimal size after unpacking
- doc/incus-cli: Add CLI configuration file reference
- Makefile: add incremental spellcheck that skips the sphinx and cli setups
- Makefile: Improve target padding in make help
- incusd/linux: Add ListenUnix helper
- incusd/qemu: Handle long run paths for the migration socket
- incusd/qemu: Handle long run paths for the console socket
- incusd/qemu: Handle long run paths for the virtiofs socket
- incusd/images: Mention images available for other instance types
- incusd/device/nic_routed: Add neighbour proxy entries on the on-link interface
- incusd/network/ovn: Don't use missing router IP as DNS server
- doc: Update preseed description to match with reality
- incus/utils_copy: Fix wrong error returned
- doc: Ignore criu.org link checking
- api: network_bridge_bgp_instances
- incusd/network: Add BGP instance advertisement config keys
- incusd/device: Advertise individual instance addresses over BGP
- doc: Document BGP advertisement of instance addresses
- doc: Update config
- doc: Add NIC's to wordlist
- incusd: Use IsNoneOrEmpty helper
- incusd/device: Add configOrVolatile helper
- incus/remote: Add set-keepalive subcommand
- incus/keepalive: Fix comment typo
- doc/remote: Update docs with keepalive configuration via CLI commands
- incus/alias: Fix wrong example command typo
- i18n: Update translation templates
- api: core_https_allowed_websocket_origin
- shared/ws: Validate websocket origin against trusted origins
- incusd: Add core.https_allowed_websocket_origin server config key
- doc: Update config
- incus: close web UI probe response body
- ci: authenticate OpenFGA release lookups
- storage/zfs: factor out send receive helper
- Translated using Weblate (Greek)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Georgian)
- Translated using Weblate (Georgian)
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (Tamil)
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Dutch)
- Translated using Weblate (Dutch)
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- Translated using Weblate (Italian)
- Translated using Weblate (Italian)
- Translated using Weblate (Russian)
- Translated using Weblate (Russian)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- storage/zfs: avoid raw sends for encrypted snapshot copies
- tests: cover encrypted ZFS snapshot copies
- incus/server/storage/driver/volume: Ensure cached image can grow to needed size and not be restricted by pool size config.
- tests: Add more tests for ConfigSizeFromSource
- doc: Update AI/LLM policy
- doc: Add GPG to wordlist
- Translated using Weblate (Swedish)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Russian)
- client: Default to port 443 for raw connections
- incusd/util: Fix JWT validation
- api: Add storage_btrfs_compression extension
- incusd/storage/drivers: Add "btrfs.compression" volume option
- doc: Document the "btrfs.compression" volume option
- doc: Update config
- doc/rest-api: Refresh swagger YAML
- incus/server/storage/driver/ceph: Don't return error if image size is larger than cached image size
- build(deps): bump actions/checkout from 6 to 7
- incusd/instance/lxc: Restrict OCI configuration keys to OCI containers
- api: Add oci_network_config extension
- internal/instance: Simplify OCI key descriptions
- internal/instance: Add OCI DNS configuration keys
- incusd/device: Apply OCI static network configuration on NICs
- incusd/instance/lxc: Generate OCI container network files
- incusd/main_forknet: Handle static interfaces and DNS in forknet dhcp
- doc: Update config
- incusd/storage/btrfs: Fix daemon dir prefix check
- doc/cloud-init: Change YAML spec domain
- incus/server/device: Persist NIC host_name before creating interface
- incusd/images: Tolerate concurrent image record creation in a cluster
- incus/events: Forward info-level log events across the cluster
- incus/vm: Select OVMF.amdsev.fd firmware for SEV guests
- incus/vm: Skip vmcoreinfo device for SEV guests
- incus/console: Ignore not-exist error when removing temporary socket
- github: Block LLM/AI attribution in commit messages
- incusd: Skip br_netfilter proxy/forward handling on IncusOS
- incusd/storage/zfs: Batch snapshot GUID lookups
- incusd/endpoints: Fix infinite loop in network error log writer
- api: infiniband_sriov_guid
- incusd/ip: Add SetVfNodeGUID/SetVfPortGUID for SR-IOV
- incusd/device/infiniband: Add configurable port_guid/node_guid for SR-IOV
- doc: Update config
- doc: Add GUID to wordlist
- incusd/storage/lvm: Account for qcow2 overhead in volume sizing
- incusd/storage: Add patch to fix existing lvmcluster qcow2 volumes
- incusd: Skip NVRAM setup for unified AMD SEV firmware
- shared/cliconfig: Use platform-specific config directory
- incus: Use platform-specific cache directory
- incusd/device/disk: Reject pool property with special sources
- incusd/network/bridge: Clarify nat.order has no effect on nftables
- incusd/metadata: Update generated metadata
- shared/osinfo: Add osinfo package
- internal/server/instance/drivers: Use DetermineOS and osinfo.OSType for instance GuestOS value
- internal/server/instance/drivers: Update GuestOS usages
- internal/server/instance/drivers: Add OS version specific QEMU options
- incusd/storage/drivers: Apply nodatacow directly for btrfs.compression=none
- incusd/storage/drivers: Allow btrfs.compression as a pool-wide default
- test: Cover btrfs.compression nodatacow and pool-wide default
- incusd/network: Add GetNeighbourAddresses helper
- incusd/device: Add shared instance neighbour scan helper
- incusd/firewall: Allow wildcard listen address in proxy NAT
- incusd/device: Support dynamic addresses in proxy NAT mode
- doc: Update config
- doc: Document proxy NAT dynamic addresses
- tests: Add proxy NAT wildcard and dynamic address tests
- incusd: Rename neighbour to neighbor for US english
- incusd: Reject rootfs symlink for instances
- incusd/exec: Reject exec-output symlink
- incusd/instance: Enforce project restrictions on snapshot restore
- api: instance_selinux
- internal/server/sys: Extend SELinux context detection
- internal/server/selinux: Add SELinux package
- shared/validate: Add SELinux validation functions
- internal/instance: Add SELinux configuration keys
- internal/server/project: Add SELinux config permissions
- incusd: Rename forkstart to forklxc and forklimits to forkqemu
- incusd: Add SELinux exec context to forkqemu
- internal/server/instance/drivers: Add SELinux support
- doc: Update config
- Update gomod
- incusd/instance: Confine template access to instance root
- shared/validate: Reject compression algorithm arguments
- incusd/images: Validate fingerprint on direct download
- incusd/storage: Check source volume access on copy
- incusd/instances: Check source instance access on copy
- incus/default: Add incus default commands
- i18n: Update translation templates
- cmd/incusd:
isolatedonrestricted.containers.privilegeprevents settingsecurity.idmap.isolatedtofalse - doc: regenerate configurable options index
- api: regenerate
/1.0/metadata/configurationoptions - incusd/storage: Recreate missing snapshot config subvolume
- Translated using Weblate (Portuguese)
- incusd/storage: Fix storage patches
- incus: Fix gofumpt
- i18n: Update translation templates
Documentation¶
The Incus documentation can be found at:
https://linuxcontainers.org/incus/docs/main/
Packages¶
There are no official Incus packages as Incus upstream only releases regular release tarballs. Below are some available options to get Incus up and running.
Installing the Incus server on Linux¶
Incus is available for most common Linux distributions. You'll find detailed installation instructions in our documentation.
https://linuxcontainers.org/incus/docs/main/installing/
Homebrew package for the Incus client¶
The client tool is available through HomeBrew for both Linux and MacOS.
https://formulae.brew.sh/formula/incus
Chocolatey package for the Incus client¶
The client tool is available through Chocolatey for Windows users.
https://community.chocolatey.org/packages/incus/7.2.0
Winget package for the Incus client¶
The client tool is also available through Winget for Windows users.
https://winstall.app/apps/LinuxContainers.Incus
Support¶
Monthly feature releases are only supported up until the next release comes out. Users needing a longer support length and less frequent changes should consider using Incus 7.0 LTS instead.
Community support is provided at: https://discuss.linuxcontainers.org
Commercial support is available through: https://zabbly.com/incus
Bugs can be reported at: https://github.com/lxc/incus/issues
Incus 7.1 has been released¶
May 30, 2026
The Incus team is pleased to announce the release of Incus 7.1!
This is our first monthly feature release since Incus 7.0 LTS and it's a pretty busy one as we've had some time to clear our backlog a bit.
As usual, you can try Incus for yourself online: Linux Containers - Incus - Try it online
Security fixes¶
This release fixes 4 security issues:
- CVE-2026-48753 (critical)
- CVE-2026-47753 (low)
- CVE-2026-48754 (low)
- CVE-2026-48756 (low)
New features¶
Rebuilding custom storage volumes¶
It's now possible to rebuild a custom storage volume through the new incus storage volume rebuild command.
The underlying volume is deleted and a new empty one is created with the same configuration. The rebuild is only allowed when the volume has no snapshots.
This is effectively the same behavior as incus rebuild for instances but now applied to custom storage volumes.
stgraber@castiana:~$ incus storage volume create default foo
Storage volume foo created
stgraber@castiana:~$ incus storage volume rebuild default foo
Storage volume foo rebuilt
Explicit CPU topology for virtual machines¶
The limits.cpu configuration key for virtual machines can now be used to specify an explicit CPU topology of the form sockets=2,cores=4,threads=2.
This allows more flexibility in what's exposed to the guest, though note that using this syntax will prevent dynamic CPU hotplug or hotremove for that VM.
stgraber@castiana:~$ incus launch images:debian/13 v1 --vm -c limits.cpu="sockets=4,cores=2,threads=4"
Launching v1
stgraber@castiana:~$ incus exec v1 bash
root@v1:~# lscpu | grep -E 'Socket|Core|Thread'
Thread(s) per core: 4
Core(s) per socket: 2
Socket(s): 4
root@v1:~# nproc
32
Custom TPM platform certificate¶
A couple of new server configuration keys were introduced:
instances.tpm.platform_certinstances.tpm.platform_key
This allows providing a certificate authority with which to sign the Endorsement Key of the virtual TPM device. With this, it's now possible to establish trust in the particular TPM device.
stgraber@castiana:~$ incus config get instances.tpm.platform_cert
-----BEGIN CERTIFICATE-----
MIIBjDCCATOgAwIBAgIUD0ayUKYdRlCHaXIzzSTWIDX0L4owCgYIKoZIzj0EAwMw
HDEaMBgGA1UEAwwRSW5jdXMgVFBNIHNpZ25pbmcwHhcNMjYwNTIzMDEyODMyWhcN
MzYwNTIwMDEyODMyWjAcMRowGAYDVQQDDBFJbmN1cyBUUE0gc2lnbmluZzBZMBMG
ByqGSM49AgEGCCqGSM49AwEHA0IABHeorFI2aDNnjcmKgaXKJgwmQFdPEUwVFbze
9PBYRc+157TE7WGNxfjK/x9K6/c/oo91cP7wMfhSuvtLfbVG7d+jUzBRMB0GA1Ud
DgQWBBTCr1gVrRuPVC54BoneUqnQpIUfaDAfBgNVHSMEGDAWgBTCr1gVrRuPVC54
BoneUqnQpIUfaDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA0cAMEQCIFJo
oJ/mWxv69XLDdOMUpvmGu1INjo8cBQh9KqIgnYUYAiA/JXgYEp0u9DCpge9Eifc/
R3QrMmCl71nW2Lz4kZOqhw==
-----END CERTIFICATE-----
stgraber@castiana:~$ incus config get instances.tpm.platform_key
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIMdKhntzfFiQqaBZGo8IvtK16AetkUIYVbhgimeX57aAoAoGCCqGSM49
AwEHoUQDQgAEd6isUjZoM2eNyYqBpcomDCZAV08RTBUVvN708FhFz7XntMTtYY3F
+Mr/H0rr9z+ij3Vw/vAx+FK6+0t9tUbt3w==
-----END EC PRIVATE KEY-----
stgraber@castiana:~$ incus config device add v1 tpm tpm
Device tpm added to v1
stgraber@castiana:~$ incus start v1
stgraber@castiana:~$ incus wait v1 agent
stgraber@castiana:~$ incus exec v1 bash
root@v1:~# tpm2_getekcertificate | openssl x509 -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 2 (0x2)
Signature Algorithm: ecdsa-with-SHA256
Issuer: CN=Incus TPM signing
Validity
Not Before: May 30 01:32:08 2026 GMT
Not After : Dec 31 23:59:59 9999 GMT
Subject: CN=unknown
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:c1:04:b8:19:52:9e:4a:a2:f0:30:1c:23:00:48:
40:71:9b:62:ef:18:d0:56:71:95:da:58:0b:a9:82:
1d:a3:46:b0:66:eb:ad:fe:b1:e0:c1:35:c7:33:bd:
00:69:f4:eb:08:64:84:f1:7a:4f:0b:95:16:1d:88:
18:17:30:ef:3b:74:28:cc:45:b7:9b:ce:be:00:d0:
88:6f:74:4e:90:10:5f:5f:c4:7f:3d:d4:31:3b:5b:
87:57:7d:e5:b1:d0:c4:6b:bd:e8:49:0b:4f:f6:d9:
cb:58:85:91:6a:e7:02:87:bf:5d:99:a0:db:88:74:
f2:47:d8:35:41:fb:09:ec:a6:ae:c4:d4:07:8f:de:
95:d4:82:71:b7:a2:c9:e9:a4:3d:e9:40:73:04:03:
ef:dc:7f:15:60:52:c5:b8:14:9c:ef:66:4a:28:4d:
d7:79:b8:27:b2:b9:d4:58:55:44:f1:52:6a:5e:f7:
a8:e4:56:39:55:65:42:41:c2:73:de:00:de:65:08:
0f:d5:d3:cb:a4:82:3a:75:cf:4e:ac:b2:94:58:96:
a8:9c:c0:f8:e3:3c:2e:25:76:6d:24:7e:00:58:f5:
63:01:e9:90:84:8e:21:b2:e0:29:a4:d8:cb:2f:f7:
d4:a6:a0:3a:e4:54:54:10:77:4f:d0:96:1b:68:b2:
e4:91
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Extended Key Usage:
Endorsement Key Certificate
X509v3 Subject Alternative Name: critical
DirName:/tcg-at-tpmManufacturer=id:00001014/tcg-at-tpmModel=swtpm/tcg-at-tpmVersion=id:20240125
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Subject Directory Attributes:
TPM Specification:
0:d=0 hl=2 l= 12 cons: SEQUENCE
2:d=1 hl=2 l= 3 prim: UTF8STRING :2.0
7:d=1 hl=2 l= 1 prim: INTEGER :00
10:d=1 hl=2 l= 2 prim: INTEGER :B7
X509v3 Authority Key Identifier:
C2:AF:58:15:AD:1B:8F:54:2E:78:06:89:DE:52:A9:D0:A4:85:1F:68
X509v3 Key Usage: critical
Key Encipherment
Signature Algorithm: ecdsa-with-SHA256
Signature Value:
30:46:02:21:00:b9:7a:97:78:fb:4d:ea:6e:93:27:24:3a:f6:
66:08:b9:ae:54:e8:2b:c1:c8:e9:1c:74:45:79:88:88:72:3e:
46:02:21:00:82:f6:c0:d9:dc:c0:1a:5e:95:cb:f3:b9:fa:00:
65:55:b3:5f:b4:25:7e:c5:c6:fb:b2:c4:e4:41:36:6d:76:5b
Documentation: https://linuxcontainers.org/incus/docs/main/server_config/#miscellaneous-options
Volume creation on attach¶
The incus storage volume attach command now accepts a --create flag.
When set, the custom storage volume is created if it doesn't already exist before being attached to the instance, saving a separate incus storage volume create step.
stgraber@castiana:~$ incus storage volume attach default v1-extra v1 extra --create
stgraber@castiana:~$ incus exec v1 bash
root@v1:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 10G 0 disk
├─sda1 8:1 0 100M 0 part /boot/efi
└─sda2 8:2 0 9.9G 0 part /
sdb 8:16 0 10G 0 disk
Filesystem creation options for storage¶
A new block.create_options configuration option allows controlling the mkfs arguments used when creating volumes on block devices.
btrfs.create_options was also introduced to similarly control the mkfs.btrfs options used when creating a new storage pool.
Documentation: https://linuxcontainers.org/incus/docs/main/reference/storage_btrfs/#storage-btrfs
Low-level LINSTOR configuration¶
A new set of linstor.raw.* configuration keys is now available on both LINSTOR storage pools and storage volumes, allowing low-level properties to be set directly on the underlying resource groups and resource definitions.
Documentation: https://linuxcontainers.org/incus/docs/main/reference/storage_linstor/
IP ranges in network address sets¶
Network address sets now support IP ranges (e.g. 10.0.0.120-10.0.0.130), matching what was already allowed in network ACL rules.
A single range may expand to at most 256 addresses; larger sets of addresses should be expressed using CIDR notation instead.
stgraber@castiana:~$ incus network address-set create demo
Network address set demo created
stgraber@castiana:~$ incus network address-set add demo 10.0.0.100-10.0.0.200
Documentation: https://linuxcontainers.org/incus/docs/main/howto/network_address_sets/
Multicast snooping control on bridge networks¶
A new bridge.multicast_snooping configuration option was added for managed bridge networks. When set to false, multicast snooping is disabled on the bridge.
Documentation: https://linuxcontainers.org/incus/docs/main/reference/network_bridge/
Multiple addresses per remote¶
The incus remote command now accepts multiple addresses for a single remote.
Incus keeps track of the last working address and rolls over to the other addresses on failure, making it easy to provide fallback endpoints for a clustered or highly-available server.
S3 object storage improvements¶
The built-in S3-compatible object storage server was expanded to support a few common extensions:
- Presigned URLs are now supported for both the SigV2 and SigV4 signature algorithms.
- The
CopyObjectoperation is now implemented, allowing objects to be copied server-side.
Complete changelog¶
Here is a complete list of all changes in this release:
Full commit list
- gomod: Update dependencies
- incusd/instance/drivers: Round memory hotplug size up to block size
- incusd/instance/lxc: Allow unsetting limits.memory.swap without hitting a cgroup error
- tests: Update for new name restrictions
- doc: Update config
- internal/server: fire agent events after checking current state
- internal/instance: Add volatile.last_state.agent
- incusd/storage/s3: Confine multipart uploads with os.Root
- incusd/storage: Guard nil fields in createDependentVolumesFromBackup
- incusd/storage: Guard nil ExpiresAt in CreateCustomVolumeFromBackup
- incusd/storage: Fix unsafe access to backup data
- incusd/device: Encode device names in DevicesPath storage paths
- incusd/instance/drivers: Apply standard API object name checks
- doc: Update config
- doc: Document CPU topology support for limits.cpu
- incusd/instance: Support CPU topology for VM limits.cpu
- internal/instance: Allow CPU topology syntax for limits.cpu
- shared/validate: Add CPU topology parsing helper
- api: instance_limits_cpu_topology
- i18n: Update translation templates
- tests: Switch to recursive chown on file push
- incus/file: Make recursive push apply UID/GID overrides recursively
- incus/storage_volume: Put big subcommands into their own files
- incusd/devices: Cleanup leftover forkproxy on startup
- i18n: Update translation templates
- incus/config: Fix typo in usage
- incus/image: Improve usage
- incus/move: Improve usage
- incus/storage/volume: Improve usage
- incus/remote: Improve usage
- Translated using Weblate (Portuguese)
- Translated using Weblate (Swedish)
- Translated using Weblate (Russian)
- incusd/images: Revert 36f513c
- incusd/storage: Prevent creating daemon volumes on shared pools
- api: api_fragments
- incusd/project: Handle server objects
- incusd/db/cluster/entities: Add TypeServer and fix map sorting
- incusd/storage: Improve handling of daemon volumes
- shared/api/url: Add URL fragment setter
- client: handle absolute paths for simplestream files
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Tamil)
- Translated using Weblate (Dutch)
- Translated using Weblate (Dutch)
- Translated using Weblate (Russian)
- Translated using Weblate (Russian)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Georgian)
- Translated using Weblate (Georgian)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Greek)
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Italian)
- Translated using Weblate (Italian)
- tests: Add storage bucket presigned URL test
- incus/storage/s3: Support SigV2 presigned URLs
- incus/storage/s3: Support SigV4 presigned URLs
- i18n: Update translation templates
- doc: Update command name
- incus: Keep track of last working remote
- incus: Remove global mutable state from the parser
- incus: Refactor calls to the parser
- incus/remote: Add support for multiple URLs
- global: Use strings.Builder for string concatenation in loops
- shared/api: Drop no-op omitempty on nested struct fields
- global: Use slices.Backward for reverse iteration
- global: Use strings.CutSuffix instead of HasSuffix/TrimSuffix
- global: Use strings.Cut instead of strings.Split/SplitN
- incusd/instance/drivers: Use the min builtin for memory capping
- incusd: Use unsafe.Add for pointer arithmetic in forkproxy
- global: Use t.Context in tests
- global: Use reflect.TypeFor
- global: Use range-over-int loops
- global: Use maps.Copy instead of manual copy loops
- global: Use sync.WaitGroup.Go for goroutine management
- incusd: Rename dqlite references to cowsql
- incusd/network/physical: Skip VLAN interface on filtered bridges
- incusd/network/ovn: Correctly set VLAN on uplink veth
- tests: Add storage volume rebuild test
- i18n: Update translation templates
- incus/storage_volume: Add rebuild command
- client: Add RebuildStoragePoolVolume
- doc/rest-api: Refresh swagger YAML
- incusd/storage: Add storage volume rebuild API endpoint
- shared/api: Add StorageVolumeRebuildPost
- incusd/storage: Add RebuildCustomVolume to pool backend
- api: storage_volumes_rebuild
- test/lint: Run full golangci-lint instead of only new changes
- incusd/instance/operationlock: Omit redundant error type from sentinel var declaration (revive:var-declaration)
- incusd/dnsmasq/dhcpalloc: Omit redundant error type from sentinel var declaration (revive:var-declaration)
- incusd/cluster: Omit redundant error type from sentinel var declaration (revive:var-declaration)
- incusd: Omit redundant error type from sentinel var declaration (revive:var-declaration)
- incusd/operations: Inline reflect.Ptr as reflect.Pointer (govet:inline)
- incus: Inline reflect.Ptr as reflect.Pointer (govet:inline)
- i18n: Update translation templates
- incus: Add newline after block before switch case (newline-after-block)
- incusd/storage/drivers: Add newline after block before switch case (newline-after-block)
- incusd/instance/drivers: Add newline after block before switch case (newline-after-block)
- incusd/device: Add newline after block before switch case (newline-after-block)
- incusd: Add newline after block before switch case (newline-after-block)
- incusd/fsmonitor/drivers: Add doc comments on exported Name methods (revive:exported)
- incusd/fsmonitor/drivers: Rename locals that shadow logger import (revive:import-shadowing)
- incusd/fsmonitor: Rename local that shadows logger import (revive:import-shadowing)
- incusd/seccomp: Simplify setxattr whiteout check with early return (revive:early-return)
- incusd/backup: Rename locals that shadow state import (revive:import-shadowing)
- incusd/apparmor: Omit inferred type from strings.Builder declarations (staticcheck:ST1023)
- incusd/apparmor: Add doc comment on nullWriteCloser.Close (revive:exported)
- internal/linux: Add missing doc comments on exported symbols (revive:exported)
- internal/linux: Drop redundant = nil from err declaration (revive:var-declaration)
- internal/linux: Rename devpts_fd parameter (revive:var-naming)
- internal/linux: Return error last from GetErrno (revive:error-return)
- incusd/device: Use tagged switch statements (staticcheck:QF1003)
- incusd/device: Apply De Morgan's law to simplify booleans (staticcheck:QF1001)
- incusd/device: Remove embedded StorageVolume field from selector (staticcheck:QF1008)
- incusd/device: Check container type assertions (revive:unchecked-type-assertion)
- incusd/device: Invert conditions to return early (revive:early-return)
- incusd/device: Remove unnecessary blank line in validateConfig (whitespace)
- incusd/device: Remove blank line at start of block (revive:empty-lines)
- incusd/device: Avoid defer inside loop in checkAttachedRunningProcesses (revive:defer)
- incusd/device: Rename locals that shadow imports (revive:import-shadowing)
- incusd/auth/oidc: Add doc comments on exported methods (revive:exported)
- incusd/auth/oidc: Check email claim type assertion (revive:unchecked-type-assertion)
- incusd/auth: Use strings.Split instead of SplitN (staticcheck:QF1004)
- incusd/auth: Add doc comments on exported symbols (revive:exported)
- incusd/auth: Rename locals that shadow logger import (revive:import-shadowing)
- incusd/events: Add doc comments on exported methods (revive:exported)
- incusd/events: Remove embedded Conn field from selectors (staticcheck:QF1008)
- incusd/response: Use fmt.Fprintf instead of WriteString with Sprintf (staticcheck:QF1012)
- incusd/response: Avoid defer inside loop in fileResponse.Render (revive:defer)
- incusd/response: Add doc comments on exported Render methods (revive:exported)
- incusd/device/config: Rename copy locals that shadow builtin (revive:redefines-builtin-id)
- incusd: Fix remaining identifier naming (revive:var-naming)
- incusd: Annotate intentional os.Exit calls (revive:deep-exit)
- incusd: Remove useless break in case clauses (revive:useless-break)
- incusd: Remove blank line at start of block (revive:empty-lines)
- incusd: Remove empty else block (revive:empty-block)
- incusd: Rename local that shadows builtin min (revive:redefines-builtin-id)
- incusd: Add space after comment delimiter (revive:comment-spacings)
- incusd: Avoid deferring inside loops (revive:defer)
- incusd: Drop else after return (revive:indent-error-flow)
- incusd: Return early to reduce nesting (revive:early-return)
- incusd: Use comma-ok form for type assertions (revive:unchecked-type-assertion)
- incusd: Rename locals that shadow imports (revive:import-shadowing)
- incusd: Fix identifier naming (revive:var-naming)
- incusd: Use tagged switch statements (staticcheck:QF1003)
- incusd: Remove dead source connection (staticcheck:SA4006)
- incusd: Fix errors.Is argument order (staticcheck:SA1032)
- incusd: Use fmt.Fprintf instead of Write of Sprintf (staticcheck:QF1012)
- incusd: Convert byte slice argument to string (staticcheck:QF1010)
- incusd: Merge conditional assignments into declarations (staticcheck:QF1007)
- incusd: Remove unnecessary trailing newline (whitespace)
- incusd: End comments with a period (godot)
- incusd: Fix import grouping (gci)
- incusd/config: Use fmt.Fprintf instead of WriteString (staticcheck:QF1012)
- incusd/bgp: Remove unused setup method (unused)
- incusd/firewall/drivers: Remove unused subnetMask function (unused)
- incusd/metadata: Add doc comment on exported var Data (revive:exported)
- incusd/refcount: Omit redundant type in var declaration (revive:var-declaration)
- incusd/ucred: Check type assertion in GetConnFromContext (revive:unchecked-type-assertion)
- incusd/scriptlet/log: Fix doc comment on exported CreateLogger (revive:exported)
- incusd/scriptlet: Use tagged switch statements (staticcheck:QF1003)
- incusd/metrics: Use fmt.Fprintf instead of WriteString (staticcheck:QF1012)
- incusd/dnsmasq/dhcpalloc: Lift break condition into loop (staticcheck:QF1006)
- incusd/dnsmasq: Use strings.Split instead of SplitN (staticcheck:QF1004)
- incusd/dns: Rename param that shadows db import (revive:import-shadowing)
- incusd/dns: Add doc comment on exported method ServeDNS (revive:exported)
- incus/usage: Remove dead assignments to renderedAtoms (staticcheck:SA4006)
- incus: Remove unused functions (unused)
- incus: Use tagged switch statement (staticcheck:QF1003)
- incusd/instance/drivers: Use tagged switch statements (staticcheck:QF1003)
- incusd/instance/drivers: Replace append loop with variadic append (staticcheck:S1011)
- incusd/instance/drivers: Rename locals that shadow imports (revive:import-shadowing)
- incusd/instance/drivers: Add doc comments on exported methods (revive:exported)
- incusd/instance/drivers: Check type assertions (revive:unchecked-type-assertion)
- incusd/instance/drivers: Return early to reduce nesting (revive:early-return)
- incusd/instance/drivers: Avoid deferring inside loops (revive:defer)
- incusd/instance/drivers: Omit inferred type from var declaration (revive:var-declaration)
- incusd/instance/drivers: Remove unnecessary blank line at end of block (whitespace)
- incusd/instance/drivers: Remove unused const and function (unused)
- incusd/instance: Rename locals that shadow imports (revive:import-shadowing)
- incusd/instance: Use fmt.Fprintf instead of WriteString (staticcheck:QF1012)
- incusd/instance: Return explicit values instead of bare returns (revive:bare-return)
- incusd/instance/drivers/qmp: Use tagged switch statement (staticcheck:QF1003)
- incusd/instance/drivers/qmp: Fix doc comment on exported Run method (revive:exported)
- incusd/logging: Use fmt.Fprintf instead of WriteString (staticcheck:QF1012)
- incusd/db: Omit type from strings.Builder declarations (staticcheck:ST1023)
- incusd/db: Add space after comment delimiter (revive:comment-spacings)
- incusd/db: Omit redundant types in var declarations (revive:var-declaration)
- incusd/db: Use fmt.Fprintf instead of WriteString (staticcheck:QF1012)
- incusd/db: Check type assertion result (revive:unchecked-type-assertion)
- incusd/db: Rename local that redefines builtin max (revive:redefines-builtin-id)
- incusd/db: Rename profileIds parameter to profileIDs (revive:var-naming)
- incusd/db: Apply De Morgan's law to simplify boolean (staticcheck:QF1001)
- incusd/db: Rename locals that shadow imports (revive:import-shadowing)
- incusd/db/cluster: Use fmt.Fprintf instead of WriteString (staticcheck:QF1012)
- incusd/db/cluster: Check type assertion result (revive:unchecked-type-assertion)
- incusd/db/cluster: Rename locals that shadow imports (revive:import-shadowing)
- incusd/db/cluster: Remove redundant import alias (revive:redundant-import-alias)
- incusd/db/schema: Rename locals that shadow imports (revive:import-shadowing)
- incusd/db/schema: Check error from db.Close (errcheck)
- incusd/db/node: Rename locals that shadow imports (revive:import-shadowing)
- incusd/db/query: Rename locals that shadow imports (revive:import-shadowing)
- incusd/db/query: Add missing doc comments on exported symbols (revive:exported)
- incusd/cluster: Rename locals that shadow imports (revive:import-shadowing)
- incusd/cluster: Avoid deferring inside loops and chains (revive:defer)
- incusd/cluster: Simplify with early return (revive:early-return)
- incusd/cluster: Add missing doc comments on exported methods (revive:exported)
- incusd/cluster: Drop redundant client import alias (revive:redundant-import-alias)
- incusd/endpoints: Rename locals that shadow import (revive:import-shadowing)
- incusd/operations: Rename param that shadows import (revive:import-shadowing)
- incusd/operations: Add missing doc comments on exported methods (revive:exported)
- incusd/network: Use tagged switch statements (staticcheck:QF1003)
- incusd/network: Lift break condition into loop (staticcheck:QF1006)
- incusd/network: Merge conditional assignment into declaration (staticcheck:QF1007)
- incusd/network: Remove embedded common field from selectors (staticcheck:QF1008)
- incusd/network: Remove blank line at start of block (revive:empty-lines)
- incusd/network: Rename locals that shadow imports (revive:import-shadowing)
- incusd/network: Add and fix doc comments on exported symbols (revive:exported)
- incusd/network/acl: Remove blank line at start of switch (revive:empty-lines)
- incusd/network/acl: Invert condition to return early (revive:early-return)
- incusd/network/acl: Merge conditional assignment into declaration (staticcheck:QF1007)
- incusd/network/acl: Use tagged switch on rule.Protocol (staticcheck:QF1003)
- incusd/network/acl: Use tagged switch on rule.Action (staticcheck:QF1002)
- incusd/network/acl: Rename locals that shadow imports (revive:import-shadowing)
- incusd/network/zone: Add and fix doc comments on exported methods (revive:exported)
- incusd/network/zone: Rename param that shadows state import (revive:import-shadowing)
- incusd/network/ovn: Use tagged switch statements (staticcheck:QF1003)
- incusd/network/ovs: Use strings.Split instead of SplitN (staticcheck:QF1004)
- incusd/network/ovs: Remove unused unquote function (unused)
- incusd/storage/drivers: Use tagged switch statements (staticcheck:QF1003)
- incusd/storage/drivers: Use strings.Split instead of SplitN (staticcheck:QF1004)
- incusd/storage/drivers: Omit inferable type from declaration (staticcheck:QF1011)
- incusd/storage/drivers: Remove extra blank lines at start of block (revive:empty-lines)
- incusd/storage/drivers: Simplify if/else with early return (revive:early-return)
- incusd/storage/drivers: Avoid deferring inside loops (revive:defer)
- incusd/storage/drivers: Rename locals that shadow imports (revive:import-shadowing)
- incusd/storage/drivers: Add missing doc comments on exported symbols (revive:exported)
- incusd/storage: Simplify boolean with De Morgan's law (staticcheck:QF1001)
- incusd/storage: Use tagged switch statements (staticcheck:QF1003)
- incusd/storage: Check type assertion result (revive:unchecked-type-assertion)
- incusd/storage: Simplify if/else with early return (revive:early-return)
- incusd/storage: Rename locals that shadow imports (revive:import-shadowing)
- incusd/storage: Add missing doc comments on exported symbols (revive:exported)
- tests: Update btrfs test for new behavior
- incusd/instance/lxc: Use os.Root for templating
- incusd/instance: Handle negative disk usage values
- incusd/storage: Return -1 as disk usage when the driver doesn't support it
- incus/info: Handle negative usage values (unknown)
- i18n: Update translation templates
- incus/storage_volume: Fix push behavior with UID/GID/mode overrides
- tests: Add thorough tests for incus file push with UID/GID/mode overrides
- incus/file: Fix typo
- incus/file: Fix push behavior with UID/GID/mode overrides
- incusd/instances: Only reset NVRAM on secureboot change for VMs
- incusd/storage/zfs: Use latest common GUID as refresh base
- Translated using Weblate (Russian)
- Translated using Weblate (Swedish)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Swedish)
- Translated using Weblate (Russian)
- Translated using Weblate (Swedish)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Swedish)
- inucsd/devices/tpm: Enable tpm live migration
- tests: Add IP range coverage for network address sets
- doc: Document IP range support in network address sets
- incusd/network/address-set: Support IP ranges
- api: network_address_set_ip_ranges
- doc: Update config
- incusd/network/ovn: Use dnat_and_snat for fully mapped external addresses
- api: linstor_raw
- tests: Add quick raw DRBD key checks
- incusd/storage/linstor: Allow setting raw DRBD properties on storage volumes
- incusd/storage/linstor: Allow setting raw DRBD properties on storage pools
- incusd/storage: Allow skipping validation for more prefixes
- gomod: Update dependencies
- Makefile: Use older incus-os for Go 1.25
- incusd/forknet: Filter the DHCPv4 raw socket
- incusd/forknet: Handle zero wait time for DHCPv6
- incusd/forknet: Time out DHCPv6 lease acquisition
- incusd/forknet: Time out DHCPv4 lease acquisition
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Russian)
- Translated using Weblate (Russian)
- Translated using Weblate (Italian)
- Translated using Weblate (Italian)
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Tamil)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Portuguese)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Dutch)
- Translated using Weblate (Dutch)
- Translated using Weblate (Georgian)
- Translated using Weblate (Georgian)
- Translated using Weblate (Greek)
- incus-simplestreams: Detect type of unified images
- incus-simplestreams: Support split container images
- shared/simplestreams: Add combined_type
- i18n: Update translation templates
- incus/config: Fix YAML file name in help text
- i18n: Update translation templates
- incus/launch: Update examples
- incus/network/forward: Fix typo in description
- i18n: Update translation templates
- incus/remote_unix: Clarify socket type
- incus/launch: Clarify examples
- incus/cluster: Fix typo in description
- Translated using Weblate (Russian)
- Translated using Weblate (Portuguese)
- doc: Add PEM to wordlist
- doc: Update config
- incusd/device/tpm: Provision vTPM with platform CA when configured
- incusd/cluster/config: Add instances.tpm.platform keys
- incusd/devices: Set volatileGet on Refresh
- api: instances_tpm_platform_cert
- shared/archive: Improved ENOSPC detection
- incus/utils: Tweak environment file handling to strip matching outer quotes
- doc: Update config
- tests: Add test for block.create_options
- incusd/storage/drivers: Add support for block.create_options
- api: storage_create_options
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Dutch)
- Translated using Weblate (Dutch)
- Translated using Weblate (Georgian)
- Translated using Weblate (Georgian)
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Tamil)
- Translated using Weblate (Italian)
- Translated using Weblate (Italian)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Greek)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Russian)
- Translated using Weblate (Russian)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Norwegian Bokmål)
- i18n: Update translation templates
- incus/storage/volume: Align long and short description
- incus/project: Align description formatting
- incus/project: Fix typo in description
- incus/cluster/group: Fix typo in description
- incus/warning: Align description formatting
- incus/config/trust: Align description formatting
- incus/image: Align description formatting
- incus/network/forward: Fix typo in description
- incus/config/trust: Fix typo in description
- incus/storage/volume: Fix typo in description
- incus/network: Fix typo in description
- incus/network/zone: Align long and short descriptions
- incus/network: Fix typo in description
- incus/operation: Fix default column layout in help text
- incusd/instance/qemu: Add virtio vga feature gating
- incusd/instance/qmp: Add QueryVirtioVGADevice
- Extend description for OCI-compliant remotes
- incus/server/network/ovn/driver: Fix duplicate listening ip check in LoadBalancerCreate
- incus/server/network/ovn/driver: Fix duplicate listening ip check in ForwardCreate
- client/oci: Pass --no-tags to skopeo inspect
- incusd/firewall/nftables: Use terse mode to improve performance
- i18n: Update translation templates
- doc/rest-api: Refresh swagger YAML
- doc: Update metadata
- doc: Clarify snapshots.expiry
- cmd/incus: Clarify --expiry flag format
- shared/api: Fix swagger examples
- incusd/storage/ceph: Refuse pool deletion when unexpected images exist
- incus: Print console log when attaching via --console
- incusd/db/node: Allow using a fixed time in Offline checks
- incusd/forknet: Use space separator for DNS search domains
- incusd/device/nic_bridged: Recover orphaned veth on startup
- incusd/device/nic_bridged: Drop redundant accept_ra=0
- incusd/ip: Set NUD_PERMANENT on neighbour proxy entries
- incusd/networks: Parallelize network startup and OVN restart
- Translated using Weblate (Portuguese)
- incusd/storage/drivers: Add workaround for shared VG removal failures
- tests/storage: Add S3 CopyObject coverage
- incusd/storage/s3: Implement ACL placeholder
- tests/storage_volume_attach: Test --create on attach
- i18n: Update translation templates
- incus/storage_volume: Add --create flag to attach
- incusd/storage/s3: Implement S3 CopyObject
- doc/storage_volume: Fix outdated information
- test: Disable volume shrinking with LINSTOR
- incusd/instance/drivers/lxc: Quote values in lxc.environment
- incusd/instances: Skip offline members in bulk state changes
- incusd/network/ovn: Skip per-IP NAT for external routes when no uplink
- incusd/storage/zfs: Avoid recursive zfs list in GetResources
- incusd/cluster: Better handle misisng OVS/OVN
- Use correct host:port format for ClusterAddress
- Update list of Ubuntu LTS releases that get pre-built Incus packages
- doc: Update Ansible section with incus-client details
- incusd/storage/drivers: Restore config volume as part of VM block restoration
- build(deps): bump actions/dependency-review-action from 4 to 5
- devcontainer: fix golangci-lint install source
- incusd/storage: Add lock handling for NBD operations
- incusd/storage: Use InstanceByVolumeName in qcow2MigrateVolume
- incusd/locking: Add TryLock
- doc: Update config
- incusd/network/bridge: Add bridge.multicast_snooping config key
- api: network_bridge_multicast_snooping
- incusd/db/node: Cleanup node offline messages
- incusd/instance/qemu: Pass SMBIOS type 11 entries via files
- incusd/endpoints: Fix Wait() race in Tomb shutdown
- incusd/cluster: Re-order evacuations to happen earlier on shutdown
- incusd/instance/qemu: Remove deprecated QEMU flag
- test/network_acl: Add test for ACL used by instance in different project
- doc/rest-api: Refresh swagger YAML
- incusd/storage_volume_nbd: Fix incorrect swagger
- incusd/projects: Fix targeting on project delete
- incusd/network/acl: Fix issue with instances in different project than ACL
- doc/authorization: Fix reference to old "manager" relation
- incusd/device/nic_bridged: Fix swapped IPv4/IPv6 DNS record
- incusd/forknet: Add jitter to DHCPv6 renewal
- incusd/forknet: Properly renew stateful DHCPv6
- incusd/forknet: Include FQDN in DHCPv6 INFO requests
- incusd/forknet: Persist DHCPv6 client DUID across restarts
- incusd/instance/lxc: Fix swap=false failure
- incusd: Re-introduce core scheduling detection
- incusd/instance/qemu: Fix version detection for qemu-kvm
- Translated using Weblate (French)
- Translated using Weblate (Russian)
- Translated using Weblate (Japanese)
- Translated using Weblate (Swedish)
- Translated using Weblate (French)
- Translated using Weblate (Russian)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Italian)
- Translated using Weblate (Italian)
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Dutch)
- Translated using Weblate (Dutch)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Tamil)
- Translated using Weblate (Greek)
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Georgian)
- Translated using Weblate (Georgian)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Russian)
- Translated using Weblate (Russian)
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- doc/devices/disk: Fix broken link
Documentation¶
The Incus documentation can be found at:
https://linuxcontainers.org/incus/docs/main/
Packages¶
There are no official Incus packages as Incus upstream only releases regular release tarballs. Below are some available options to get Incus up and running.
Installing the Incus server on Linux¶
Incus is available for most common Linux distributions. You'll find detailed installation instructions in our documentation.
https://linuxcontainers.org/incus/docs/main/installing/
Homebrew package for the Incus client¶
The client tool is available through HomeBrew for both Linux and MacOS.
https://formulae.brew.sh/formula/incus
Chocolatey package for the Incus client¶
The client tool is available through Chocolatey for Windows users.
https://community.chocolatey.org/packages/incus/7.1.0
Winget package for the Incus client¶
The client tool is also available through Winget for Windows users.
https://winstall.app/apps/LinuxContainers.Incus
Support¶
Monthly feature releases are only supported up until the next release comes out. Users needing a longer support length and less frequent changes should consider using Incus 7.0 LTS instead.
Community support is provided at: https://discuss.linuxcontainers.org
Commercial support is available through: https://zabbly.com/incus
Bugs can be reported at: https://github.com/lxc/incus/issues
Incus 7.0 LTS has been released¶
May 5, 2026
Introduction¶
It's with great pride and pleasure that the Incus team is announcing the release of Incus 7.0 LTS!
Incus is a modern system container, application container and virtual machine manager. It's released under the Apache 2.0 license and is run as a community led Open Source project as part of the Linux Containers organization.
Incus provides a cloud-like environment, creating instances from our premade images or any OCI registry and offers a wide variety of features, including the ability to seamlessly cluster servers together.
It supports multiple different local or remote storage options, traditional or fully distributed networking and offers most common cloud features, including a full REST API and integrations with common tooling like Ansible, Terraform/OpenTofu, Packr, Kubernetes Cluster API and more!
This is the second LTS release for Incus with Incus 6.0 LTS now entering its security-only phase for the remaining 3 years of its 5 years lifespan.
Incus 7.0 LTS joins LXC 7.0 LTS and LXCFS 7.0 LTS in wrapping up this round of LTS releases.
Just like its sister projects, Incus 7.0 LTS will be supported until June 2031.
The first 2 years will feature bug and security fixes as well as minor usability improvements, delivered through occasional point releases (7.0.x). After that initial two years, Incus 7.0 LTS will move to security only maintenance for the remaining of its 5 years of support.
A total of 204 individuals contributed to Incus between the 6.0 LTS and 7.0 LTS releases with 45 contributing between the 6.23 and 7.0 LTS releases.
As usual, you can try it for yourself online: https://linuxcontainers.org/incus/try-it/
Enjoy!
Security fixes¶
This release includes fixes for a total of 9 security issues.
Those were reported as part of a security audit of Incus performed by https://7asecurity.com
- CVE-2026-35527 (Moderate)
- CVE-2026-40195 (Moderate)
- CVE-2026-40197 (Moderate)
- CVE-2026-40251 (Moderate)
- CVE-2026-41647 (Moderate)
- CVE-2026-41684 (Moderate)
- CVE-2026-41685 (Moderate)
- CVE-2026-40243 (Low)
- CVE-2026-41648 (Low)
Breaking changes¶
As this is a new major release, we have used the opportunity to make a few breaking changes.
The minimum system requirements have been updated:
- Go 1.25
- Linux 6.12
- QEMU 8.2
- LXC 6.0.0
- nftables 1.0.0
- dnsmasq 2.90
- openvswitch 2.15.0 (when OVS or OVN are used)
- ovn 23.03.0 (when OVN is used)
- ZFS 2.1.0 (when ZFS is used)
- LVM 2.03.11 (when LVM is used)
In addition, some legacy system support has been removed:
- Deprecation of CGroupV1 support
- Deprecation of xtables (iptables/ip6tables/ebtables) support
The incus command line tool has also seen quite a lot of improvements to its parsing logic and has done away with a lot of legacy special cases and made sure that the behavior of the various commands is consistent.
Changes since Incus 6.23¶
Minio replaced by built-in S3 listener¶
With MinIO no longer being maintained upstream, we couldn't keep it as the backend provider for our storage buckets.
Rather than move to another external dependency, with all the plumbing and integration works that comes from that. We've decided to instead implement the basic S3 operations that we need directly in Incus.
Storage buckets will be automatically converted from MinIO's on-disk format to the new on-disk format (plain files with separate metadata) the first time they are accessed. This process can take up to a few minutes depending on the size of the objects present in the bucket.
The migration logic keeps the original MinIO metadata around, should it become useful.
From a client's point of view, other than an initial connection delay during the conversion, there is no API difference, it's still S3.
Server shutdown action¶
A new core.shutdown_action server configuration option has been added.
The default value of shutdown has all instances shutdown cleanly. The new value ofevacuate will trigger a clustered server evacuation on shutdown, allowing for as many instances as possible to move to other servers.
Documentation: https://linuxcontainers.org/incus/docs/main/server_config/
Low level backup API¶
To ease integration with standard backup software, Incus now exposes an NBD API as well as APIs to control the creation of dirty bitmaps for change tracking.
The combination of those two features allows for easy backup of virtual machines, including support for incremental transfers and restores.
As NBD is carried over the Incus API, the Incus CLI tool can be used to handle the backend connection and have a local NBD listener setup for regular NBD clients to interface.
stgraber@castiana:~$ incus storage volume nbd default virtual-machine/v1 --address=127.0.0.1:1234
NBD listening on 127.0.0.1:1234
Storage pool project restriction¶
A new restricted.storage-pools.access project configuration key has been added allowing for a comma separated list of storage pools which can be accessed from within that project.
It behaves similarly to settinga 0-byte quota for that storage pool within the project, but allows for an allow-list approach rather than a deny-list one.
Documentation: https://linuxcontainers.org/incus/docs/main/reference/projects/
Placement scriptlet call on cluster rebalance¶
The instance placement scriptlet now gets a dedicated rebalance call when the cluster re-balance feature is enabled and Incus is looking at moving instances around to spread the load.
The list of candidate servers is sorted from least loaded to most loaded.
Documentation: https://linuxcontainers.org/incus/docs/main/explanation/clustering/
File transfer commands now aligned with cp¶
Both the incus file push and incus file pull commands now follow a cp-like behavior and matching set of flags:
-p, --create-dirs Create any directories necessary
-L, --dereference Always follow symbolic links in source path
-H, --follow Follow command-line symbolic links in source path
-P, --no-dereference Never follow symbolic links in source path
-r, --recursive Recursively transfer files
This should offer a more predictable experience when transferring files in and out of Incus instances.
--reuse flag in incus image copy¶
The incus image copy command now supports a --reuse flag which when used alongside --copy-aliases causes the newly copied image to take over any of the pre-existing aliases.
Changes since Incus 6.0.6 LTS¶
We have been pretty aggressively backporting changes from the Incus 6.x releases back to the 6.0.x LTS releases. As a result, the list of new features for those coming from 6.0.6 LTS is reasonably short.
Those features primarily focus on changes that required large on-disk or database schema changes and were therefore unsuitable for backporting to the LTS.
All features listed above¶
Incus 6.0.6 LTS was released just before Incus 6.23, as a result, all the new features listed above also apply to those coming from Incus 6.0.6 LTS.
OCI support¶
First introduced in Incus 6.3, it's now possible to create application containers from OCI images.
All of the Incus container configuration options, whether resource limits, system call interception, ... all apply to those containers too. They're also all run in the same safe container environment as our system containers.
stgraber@dakara:~$ incus remote add docker https://docker.io --protocol=oci
stgraber@dakara:~$ incus launch docker:mysql mysql \
> -c environment.MYSQL_DATABASE=wordpress \
> -c environment.MYSQL_USER=wordpress \
> -c environment.MYSQL_PASSWORD=wordpress \
> -c environment.MYSQL_RANDOM_ROOT_PASSWORD=1
Launching mysql
stgraber@dakara:~$ incus list mysql
+-------+---------+----------------------+------------------------------------------+-----------------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+-------+---------+----------------------+------------------------------------------+-----------------+-----------+
| mysql | RUNNING | 172.17.250.26 (eth0) | 2602:fc62:c:250:216:3eff:fefa:468 (eth0) | CONTAINER (APP) | 0 |
+-------+---------+----------------------+------------------------------------------+-----------------+-----------+
stgraber@dakara:~$ incus launch docker:wordpress wordpress \
> -c environment.WORDPRESS_DB_HOST=172.17.250.26 \
> -c environment.WORDPRESS_DB_USER=wordpress \
> -c environment.WORDPRESS_DB_PASSWORD=wordpress \
> -c environment.WORDPRESS_DB_NAME=wordpress
Launching wordpress
stgraber@dakara:~$ incus list wordpress
+-----------+---------+-----------------------+-------------------------------------------+-----------------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+-----------+---------+-----------------------+-------------------------------------------+-----------------+-----------+
| wordpress | RUNNING | 172.17.250.119 (eth0) | 2602:fc62:c:250:216:3eff:fe61:c1fc (eth0) | CONTAINER (APP) | 0 |
+-----------+---------+-----------------------+-------------------------------------------+-----------------+-----------+
stgraber@dakara:~$
Dependent storage volumes¶
First introduced in Incus 6.23, it's now possible to have custom volumes be fully tied to an instance,having them get matching snapshots, migrate alongside the instance, get included in backups and deleted when the instance gets deleted.
stgraber@castiana:~$ incus launch images:debian/13 c1
Launching c1
stgraber@castiana:~$ incus storage volume create default c1-extra dependent=true
Storage volume c1-extra created
stgraber@castiana:~$ incus config device add c1 extra disk pool=default source=c1-extra dependent=true path=/extra
Device extra added to c1
stgraber@castiana:~$ incus storage volume snapshot create default c1-extra test
Error: Direct snapshots are not allowed for dependent volumes
stgraber@castiana:~$ incus snapshot create c1 foo
stgraber@castiana:~$ incus storage volume snapshot list default c1-extra
+------+----------------------+------------+
| NAME | TAKEN AT | EXPIRES AT |
+------+----------------------+------------+
| foo | 2026/03/27 18:54 EDT | |
+------+----------------------+------------+
stgraber@castiana:~$ incus snapshot delete c1 foo
stgraber@castiana:~$ incus storage volume snapshot list default c1-extra
+------+----------+------------+
| NAME | TAKEN AT | EXPIRES AT |
+------+----------+------------+
Network address sets¶
First introduced in Incus 6.12, network address sets are a convenient way to simplify network ACLs by not having to duplicate the list of source/destination addresses.
Address sets are tied to projects similarly to ACLs and each set can contain a variety of IPv4 and IPv6 addresses. Sets can then be referenced from within ACLs for either the source or destination field.
stgraber@dakara:~$ incus network address-set create cloudflare-dns
Network address set cloudflare-dns created
stgraber@dakara:~$ incus network address-set add cloudflare-dns 1.0.0.1
stgraber@dakara:~$ incus network address-set add cloudflare-dns 1.1.1.1
stgraber@dakara:~$ incus network address-set add cloudflare-dns 2606:4700:4700::1001
stgraber@dakara:~$ incus network address-set add cloudflare-dns 2606:4700:4700::1111
stgraber@dakara:~$ incus network acl create my-acl
Network ACL my-acl created
stgraber@dakara:~$ incus network acl rule add my-acl egress action=allow state=enabled
stgraber@dakara:~$ incus network acl rule add my-acl egress action=reject state=enabled destination='$cloudflare-dns'
stgraber@dakara:~$ incus config device override d13 eth0 security.acls=my-acl
Device eth0 overridden for d13
stgraber@dakara:~$ incus exec d13 -- ping linuxcontainers.org -c1 -W1
PING linuxcontainers.org (2602:fc62:a:1::7) 56 data bytes
64 bytes from rproxy.dcmtl.stgraber.org (2602:fc62:a:1::7): icmp_seq=1 ttl=59 time=8.60 ms
--- linuxcontainers.org ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 8.599/8.599/8.599/0.000 ms
stgraber@dakara:~$ incus exec d13 -- ping one.one.one.one -c1 -W1
PING one.one.one.one (2606:4700:4700::1111) 56 data bytes
--- one.one.one.one ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
Documentation: https://linuxcontainers.org/incus/docs/main/howto/network_address_sets/
Linstor storage driver¶
First introduced in Incus 6.11, Linstor is another remote storage option which uses DRBD for efficient data replication between systems.
You can read more about Linstor itself on their website: https://linbit.com/linstor/
This allows for block volumes to be generated for containers and virtual machines with typically the primary copy existing on the server running the instance itself and a replica existing on another server in the cluster.
Driver documentation: https://linuxcontainers.org/incus/docs/main/reference/storage_linstor/
Howto: https://linuxcontainers.org/incus/docs/main/howto/storage_linstor_setup/
Internals: https://linuxcontainers.org/incus/docs/main/reference/storage_linstor_internals/
TrueNAS storage driver¶
First introduced in Incus 6.16, the TrueNAS storage driver allows usage of a remote TrueNAS server as a storage pool for Incus instances and volumes.
This behaves very similarly to the ZFS storage driver since that's what TrueNAS uses, but rather than interacting with ZFS locally, the driver uses the TrueNAS API to perform the various actions remotely on the storage server and then relies on iSCSI to export those volumes from the TrueNAS server and connect them on the Incus server.
As a remote storage driver (alongside Ceph, Linstor and clustered LVM), this can be used to back clusters, allowing for seamless migration of instances between servers as no data needs to be moved.
root@truenas-incus:~# incus storage create demo truenas source=test/demo truenas.host=192.0.2.10 truenas.api_key=MY-KEY truenas.allow_insecure=true
Storage pool demo created
root@truenas-incus:~# incus launch images:debian/13 d13 --storage demo
Launching d13
root@truenas-incus:~# incus list
+------+---------+---------------------+------------------------------------------------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+---------+---------------------+------------------------------------------------+-----------+-----------+
| d13 | RUNNING | 10.2.165.159 (eth0) | fd42:a815:51cf:d4bb:1266:6aff:fe51:ae56 (eth0) | CONTAINER | 0 |
+------+---------+---------------------+------------------------------------------------+-----------+-----------+
Documentation: https://linuxcontainers.org/incus/docs/main/reference/storage_truenas/
CPU baseline definition in cluster groups¶
First introduced in Incus 6.4, Incus now has configurable CPU definitions within cluster groups. This allows for effecient CPU utilization and live migration within mixed clusters.
This makes it possible to have one cluster group per CPU model/generation and have Incus compute the common set of CPU flags for those servers.
For example, incus cluster group set foo instances.vm.cpu.x86_64.baseline=kvm64 instances.vm.cpu.x86_64.flags=auto will have Incus automatically go through the servers in the foo cluster group and then fill in the flags configuration key with the set of common CPU flags.
But this also allows setting up your own completely custom CPU defintion, for example, incus cluster group set foo instances.vm.cpu.x86_64.baseline=EPYCv2 instances.vm.cpu.x86_64.flags=-svm will expose a basic 2nd generation AMD EPYC CPU with the virtualization extension (svm) disabled.
Complete changelog¶
Here is a complete list of all changes since Incus 6.23:
Full commit list
- shared/cliconfig: Shorten path to using keepalive proxy
- shared/cliconfig: Implement TLS cert/key/ca caching
- shared/cliconfig: Add support for encrypted TLS keys to keepalive proxy
- github: format INCUS_VERSION from tag in release workflow
- Added translation using Weblate (Georgian)
- client: Optionally skip blocking for OIDC authentication
- incus/version: Gracefully fail when server unreachable
- incusd/instance/agent-loader: Use Linux arch names
- incusd/instance/qmp: Add QuerySpice
- incusd/instance/qemu: Add SPICE detection logic
- incusd/instance/qemu: Disable SPICE on systems missing support
- incusd/instances/qemu: Rework qemuArchConfig
- incusd/instance/qmp: Add Query9pDevice
- incusd/instance/qemu: Add plan9 detection logic
- incusd/instance/qemu: Export plan9 drives only when supported
- incusd/instance/qemu: enable SPICE audio via feature gate
- incus: Un-export Command and Run functions
- incus-benchmark: Un-export Command and Run functions
- incus-simplestreams: Un-export Command and Run functions
- incus-agent: Un-export Command and Run functions
- incus-user: Un-export Command and Run functions
- lxd-to-incus: Un-export Command and Run functions
- lxc-to-incus: Un-export Command and Run functions
- fuidshift: Un-export Command and Run functions
- incus: Un-export remaining exported functions
- incus-migrate: Un-export remaining exported functions
- incus-benchmark: Un-export remaining exported functions
- incusd: Un-export remaining exported functions
- incus-benchmark: Remove unused function
- incusd: Fix bad type in format strings
- incusd/instance/qmp: Add QueryVirtioSoundDevice
- incusd/instance/qemu: Add virtio-sound detection logic
- incusd/instance/qemu: Omit audio device on systems without virtio-sound
- Translated using Weblate (Georgian)
- Translated using Weblate (Russian)
- incusd/storage: Delete dependent volumes on instance deletion
- tests: Test dependent volume deletion on instance deletion
- internal/incusos: Allow non-GET requests
- internal/incusos: Implement TriggerSystemUpdateCheck
- incusd: Trigger IncusOS update check on version mismatch
- incusd/response: Make pipeResponse flush headers ASAP
- incusd: Disallow setting the 'dependent' key on volume creation
- incusd/device: Update 'dependent' flag on device add and detach
- tests: Add additional tests for dependent volume handling
- incusd/instance/common: Don't perform costly storage actions when no snapshots
- incusd: Remove explicit caching mechanism in favor of implicit
- incusd/storage/zfs: Implement better caching
- incusd/storage/truenas: Implement better caching
- incusd/instances: Allow more concurency
- incusd/storage/truenas: Retry iSCSI map request
- shared/cliconfig: Avoid treating
=as part of a remote name - incusd/network/state: Use canAccessNetwork
- cmd/incus-simplestreams: Add flag for overriding product name
- incusd/storage/truenas: Use old-style ZFS types
- incusd/storage/zfs: Use old-style ZFS types
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Tamil)
- Translated using Weblate (Georgian)
- Translated using Weblate (Georgian)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Russian)
- Translated using Weblate (Russian)
- Translated using Weblate (Dutch)
- Translated using Weblate (Dutch)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (Greek)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Italian)
- Translated using Weblate (Italian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- shared/api: Switch to go-yaml/v4
- shared/cliconfig: Switch to go-yaml/v4
- shared/cmd: Switch to go-yaml/v4
- shared/subprocess: Switch to go-yaml/v4
- shared/validate: Switch to go-yaml/v4
- incusd/instance/drivers: Switch to go-yaml/v4
- incusd/storage: Switch to go-yaml/v4
- incus-agent: Switch to go-yaml/v4
- incus-migrate: Switch to go-yaml/v4
- incus-simplestreams: Switch to go-yaml/v4
- incusd/backup: Switch to go-yaml/v4
- incusd/storage/drivers: Switch to go-yaml/v4
- incusd: Switch to go-yaml/v4
- incus: Switch to go-yaml/v4
- test: Switch to go-yaml/v4
- gomod: Update dependencies
- incus: Update for new YAML empty reader behavior
- test: Fix ordering of godeps.list
- tests: Update for slight YAML differences
- incusd/device: Ignore 'not found' errors when updating dependent config during device add/remove
- incusd/storage: Add ShouldMigrateDependentVolume
- incusd/instance: Add support for disk name to ExportQcow2Block
- incusd/instance/drivers: Add support for cross-cluster dependent volumes migration
- incusd/storage: Add support for cross-cluster dependent volumes migration
- incusd/instance: Add HasDependentDisk and ForEachDependentDiskType to instance interface
- incusd/storage: use ForEachDependentDiskType and HasDependentDisk from instance
- incusd/instance: Pass additional parameter to Delete method
- incusd/storage: Pass additional parameter to Delete method
- incusd/instance: Move dependent volume deletion from storage to instance delete()
- incusd/storage: Move dependent volume deletion from storage to instance delete()
- incusd/storage: Fix race in caching logic
- incusd/storage: Fix potential deadlock
- incusd/migration: Implement cancelation in migration logic
- incusd/instances: Implement cancelation in exec logic
- incusd: Clarify shutdown message
- incusd: Limit request body to 1MiB by default
- incusd: Configure exceptions to the 1MiB limit
- incusd/instance: Rename deleteDependentVolumes to cleanupDependencies
- incus/server/network/ovn/nb: Add function to get PortGroups by Port UUID
- incus/server/network/ovn/driver: Cleanup stale instance port uuids from acl port groups on instance stop
- incusd/storage: Support optimized storage for dependent volumes
- incusd/storage: Improve logging during dependent volume creation from backup
- incusd/storage: Rename createDependentVolumes to createDependentVolumesFromBackup
- incusd/device: Add cleanupDependencies argument to Remove() method
- incusd/instance/drivers: Pass the cleanupDependencies flag to device Remove
- tests: Rewrite out-of-space test to use profiles
- incusd/storage: Improve comments on locks
- incusd/forksyscall: Handle mount arguments when using idmap
- incusd/storage: Use device name when importing dependent volumes from backup
- tests: Add tests for exporting/importing dependent volumes
- incusd/cluster/config: Clarify description of oidc.claim option
- doc: Update metadata
- incusd/device/nic_physical: Fix device validation
- doc: Update config
- gomod: Update dependencies
- incusd/instance: Add support for stateful snapshots for qcow2 volumes
- incusd/storage: Add support for stateful snapshots for qcow2 volumes
- incusd: Don't expose the API extension list pre-authentication
- incusd/device/nic_physical: Fix bridge handling
- incusd/device/nic_physical: Fix inheritance from network
- incusd/instances/qemu: Skip vmcoreinfo on ppc64le
- doc/image_format: Update Pongo2 website
- incusd/device/nic_bridged: Handle physical NICs
- incusd/instance/drivers: Fix live migration of instances with snapshots
- incusd/instance/qemu: Scale SCSI queues with CPUs
- incus: Enable admin recover and admin sql on all platforms
- api: storage_volume_nbd
- incusd/auth: Add can_connect_nbd
- client: Add GetStoragePoolVolumeBlockNBDConn
- incusd/storage_volumes: Add NBD API
- incusd/storage: Implement NBD functions
- doc/rest-api: Refresh swagger YAML
- incusd/instance: Implement ConnectNBD
- incus/storage/volume: Add NBD command
- i18n: Update translation templates
- incusd/instance/qmp: Add QueryBlockExports and QueryNBDBlockExports
- incusd/instance/drivers: Improve error when NBD server is already running
- incusd/instance: Export snapshot when VM is running to ensure consistency
- incusd/storage: Export snapshot when VM is running to ensure consistency
- incusd/storage/drivers: Implement ActivateTask
- incusd/storage: Support NBD export in offline mode
- incusd/instance/qmp: Add commands to manage dirty bitmaps
- shared/api: Add structs for managing dirty bitmaps
- incusd/instance: Add methods to manage dirty bitmaps
- incusd/storage: Add InstanceByVolumeName
- incusd: Add API endpoints for managing dirty bitmaps
- doc/rest-api: Refresh swagger YAML
- incusd/instance/lxc: Don't return nil when not implemented
- client: Forward skopeo errors
- incusd/storage: Add instanceStateful flag to volume snapshot operations
- incusd/device: Pass instanceStateful flag during instance snapshot
- incusd: Pass instanceStateful flag during instance snapshot
- incusd/apparmor/qemuimg: Expand symlinks
- incus: Fix Windows absolute paths
- incus: Enforce stricter directory checks
- tests: Add strict pull checks for directories
- i18n: Update translation templates
- incusd: Return bitmap endpoints by default, objects with recursion=1
- doc/rest-api: Refresh swagger YAML
- incusd/instance/qemu: Fix RTC handling on Windows
- incusd/instance/drivers: Allow exposing dirty bitmaps through NBD export in online mode
- incusd/storage: Allow exposing dirty bitmaps through NBD export in offline mode
- incusd/storage/drivers: Fix ordering in Qcow2DeletionCleanup
- incusd/instance/drivers: Improve snapshot creation rollback handling
- incusd/storage: Improve snapshot creation rollback handling
- internal/instance: Introduce volatile.vm.boot_state
- incusd/instance/qemu: Rename internal structs
- incusd/instance/qemu: Add new migration state volatile
- incusd/instance/qemu: Move topology functions to new file
- incusd/instance/qemu: Make use of new migration state logic
- incusd/instance/qemu: Don't export internal vcpus and numa nodes maps
- doc: Update config
- incusd/instance/qemu: Handle stateful detection corner case
- incusd/migrate: Set short timeouts on read/write of control data
- client: Fix bad error handling
- incusd/response/upgrade: Add small delay for NBD
- incus/server/network/ovn/nb: Mark route as discord when nexthop is 'discard'
- incus/server/network/ovn/driver: Only add discard route if it doesn't exist already
- incusd/storage: Improve qcow2 volume handling
- incusd/storage/drivers: Add syncBtrfs
- incusd/storage/drivers: Use 'qemu-img info' in read-only mode
- incusd/instances: Don't delete ephemeral instances on system shutdown
- api: Add projects_restricted_storage_pool_access extension
- incusd/project: Add support for restricted.storage-pools.access
- doc: Update config
- incusd/project: Make checkRestrictionsAndAggregateLimits validate pool access
- Translated using Weblate (Tamil)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- Translated using Weblate (Russian)
- Translated using Weblate (Russian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Georgian)
- Translated using Weblate (Georgian)
- Translated using Weblate (Italian)
- Translated using Weblate (Italian)
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Greek)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Dutch)
- Translated using Weblate (Dutch)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- shared/archive: Improve detection and error handling
- shared/subprocess: Cleanup pointless check
- incusd/seccomp: Cleanup pointless check
- incusd/migrate: Bump migration timeouts
- shared/util: Introduce SafeCopy
- incus-migrate: Switch io.CopyN to util.SafeCopy
- incus: Switch io.CopyN to util.SafeCopy
- incusd: Switch io.CopyN to util.SafeCopy
- client: Switch io.Copy to util.SafeCopy
- shared/ws: Switch io.Copy to util.SafeCopy
- shared/cliconfig: Switch io.Copy to util.SafeCopy
- shared/util: Switch io.Copy to util.SafeCopy
- internal/util: Switch io.Copy to util.SafeCopy
- internal/io: Switch io.Copy to util.SafeCopy
- internal/rsync: Switch io.Copy to util.SafeCopy
- lxd-to-incus: Switch io.Copy to util.SafeCopy
- lxc-to-incus: Switch io.Copy to util.SafeCopy
- incus-simplestreams: Switch io.Copy to util.SafeCopy
- incus-agent: Switch io.Copy to util.SafeCopy
- incus-user: Switch io.Copy to util.SafeCopy
- incus-migrate: Switch io.Copy to util.SafeCopy
- incus: Switch io.Copy to util.SafeCopy
- incusd: Switch io.Copy to util.SafeCopy
- Translated using Weblate (Russian)
- incusd/migration: Bump timeouts to 30s
- Translated using Weblate (Russian)
- incusd/instance/qemu: Fix boot state recording
- incusd/devices/disk: Lock creation of ISO images
- incusd: Increase devices tmpfs
- gomod: Update dependencies
- incusd/device/nic: Prevent USB NICs on migratable VMs
- incus/cluster: Tweak error message
- i18n: Update translation templates
- incus/info: Tweak wording in resources output
- i18n: Update translation templates
- incus/export: Improve target file handling
- incus/import: Improve stdin handling
- incus/storage_volume: Improve import/export file handling
- incus/storage_bucket: Improve import/export file handling
- tests: Add import from stdin and export to stdout
- i18n: Update translation templates
- incusd/instance/drivers/qmp: Wait for block job completion after issuing block-job-complete
- incusd/instance/drivers: Add support for handling BLOCK_JOB_COMPLETED and BLOCK_JOB_ERROR events
- incusd/migrate: Limit timeout to initial handshake
- shared/archive: Avoid concurrent calls to Wait
- Translated using Weblate (Italian)
- Translated using Weblate (Italian)
- Translated using Weblate (Russian)
- Translated using Weblate (Russian)
- Translated using Weblate (Dutch)
- Translated using Weblate (Dutch)
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Greek)
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (Georgian)
- Translated using Weblate (Georgian)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (Tamil)
- incusd/images: Allow simpler HTTP headers
- incusd/storage/drivers: Extract unpackVolume and backupVolume to util
- incusd/storage/drivers: Make createParentSnapshotDirIfMissing public
- incusd/storage: Add support for export/import qcow2 in raw format
- Translated using Weblate (Portuguese)
- incusd/instance/edk2: Add support for seabios at bios-256k
- incus: Widen stdout checks in pull commands
- incus: Add cp-like flags to incus file push
- tests: Test cp-like flags in incus file push
- incus: Defer dereferencing error handling
- incus: Add cp-like flags to incus storage volume file push
- tests: Test cp-like flags in incus storage volume file push
- i18n: Update translation templates
- incusd/instance/qemu: Improve OS detection for FreeBSD
- incus-agent: Use psutil for process count
- Translated using Weblate (Portuguese)
- Translated using Weblate (Russian)
- incusd/instance/qemu: Use timeouts for agent operations
- incusd: Add validation for dependent volumes during copy request
- incusd: Allow copy only when all volumes are on remote storage
- incusd/storage: Include dependent disks in copy requests
- incusd/instance/drivers: Remove temporary snapshot block device after migration
- incusd/storage: Add support for migrating dependent volumes with a new name
- incusd/storage: Add support for copying dependent volumes on the same target when the root volume storage changes
- incusd/instance/drivers: Add support for live-migration of dependent volumes with a changed name
- incusd/instance/drivers: Add check to notify disk only during cluster move
- incusd/instances/qemu: Fix crash on nil qmp handler in RunJSON
- incusd/storage: Prevent migration of dependent volumes for snapshot instances
- shared/validate: Fix name validation on single character
- internal/linux: Add logging to ClearBlock
- Translated using Weblate (Russian)
- incusd/networks: Support targeting of network list
- incus/network: Add --target to network list
- i18n: Update translation templates
- doc/benchmark_performance: Mention GOPATH
- incus/instance/drivers/common: Add isErrorStatusCode function Signed-off-by: Leon Schoch git@darkress.xyz
- incus/instance/drivers/qemu: Early return state call in case instance is in error state Signed-off-by: Leon Schoch git@darkress.xyz
- incus/instance/drivers/lxc: Early return state call in case instance is in error state Signed-off-by: Leon Schoch git@darkress.xyz
- incusd/cgroup: Require Cgroup V2
- incusd/instance/lxc: Remove cgroup1 support
- incusd: Remove cgroup1 support
- incusd/apparmor: Remove cgroup1 support
- incusd/device: Remove cgroup1 support
- incusd/seccomp: Remove cgroup1 support
- incusd/sys: Remove cgroup1 support
- doc: Remove cgroup1 mentions
- Translated using Weblate (Russian)
- incus-agent: Work around issue when built with GO111MODULE=off
- incusd/storage/drivers: Add CanRestoreVolume
- incusd/storage/drivers: Run Qcow2Info in read-only mode
- incusd/storage: Add CanRestoreInstanceSnapshot and qcow2CanRestoreSnapshot
- incusd/instance/drivers: Check whether an instance snapshot can be safely restored
- incusd/storage/drivers: Fix migration import-shadowing
- incus; Fix copy/pasted list column description
- incus: Add missing example descriptions
- incus/profile: Clarify example description
- incus/admin_sql: Clarify behavior on standalone systems
- i18n: Update translation templates
- incus: Wrap addition of string flags
- incus: Wrap addition of string array flags
- incus: Wrap addition of integer flags
- incus: Wrap addition of boolean flags
- incus: Wrap addition of native integer flags
- incus: Generalize -f shorthand for --force
- incus: Generalize -f shorthand for --format
- incus: Generalize -t shorthand for --type
- incus: Generalize -a shorthand for --all
- i18n: Update translation templates
- incusd: Reset LXC feature detection
- incusd/cgroup: Update LXC baseline
- incusd/device: Update LXC baseline
- incusd/instance/lxc: Update LXC baseline
- incusd/seccomp: Update LXC baseline
- incus: Improve cp compatibility for pull operations
- tests: Add more thorough tests for pull/push operations
- client: Add bitmap manipulation functions
- incusd: Remove kernel feature detection
- incusd/sys: Update kernel baseline
- incusd/instance/lxc: Update kernel baseline
- incusd/device: Update kernel baseline
- incusd/apparmor: Update kernel baseline
- incusd/seccomp: Update kernel baseline
- incusd/seccomp: Update LXC baseline
- incusd/instance/lxc: Drop forknet info fallback in networkState
- incusd/forknet: Remove unused info subcommand
- incusd/device/proxy: Drop pidfd fallback in setupProxyProcInfo
- incusd/seccomp: Assume pidfd kernel support in MakePidFd
- incusd/instance/lxc: Drop pidfd fallback paths
- shared/idmap: Keep respecting INCUS_IDMAPPED_MOUNTS_DISABLE
- doc/requirements: Expand on minimum versions
- incusd: Drop kernel version checks (6.12 baseline)
- incusd/instance/qemu: Drop QEMU version checks below 8.2
- incusd/storage/zfs: Drop ZFS version checks below 2.1.0
- incusd/storage/btrfs: Drop btrfs version checks below 6.12.0
- incusd/storage/lvm: Drop LVM version checks below 2.03.11
- incusd/storage/truenas: Bump baseline to 0.7.7
- incusd/firewall/nftables: Drop nftables version checks below 1.0.0
- incusd/apparmor: Drop AppArmor version checks below 3.0.0
- incusd/rsync: Drop rsync version checks below 3.2.0
- incusd/network/bridge: Drop dnsmasq version checks below 2.90
- Translated using Weblate (Portuguese)
- incusd/storage/linstor: Update comment
- incus/config_trust: Drop legacy [
:] ATOM syntax - shared/cliconfig: Drop legacy
syntax - incus/remote_unix: Drop legacy
syntax - incus/color: Add warning prefix
- incus/usage: Add deprecation warning for the
syntax - incus/storage_volume: Drop legacy [custom/] prefix
- tests: Drop legacy [custom/] prefix
- i18n: Update translation templates
- incusd/firewall: Drop xtables/iptables/ebtables backend (nftables only)
- doc: Drop xtables/iptables/ebtables references
- tests: Drop xtables firewall driver support
- github: Automatically close untyped issues
- github: Add disclaimer on bug reports
- incusd/storage: Allow overriding pool for dependent disk during migration
- incusd/migration: Add DeviceName field to DependentVolume
- client: Pass device override information during copy
- incusd/migration: Add support for overriding disk device pool during migration
- incusd/storage: Add support for overriding disk device pool during migration
- incusd/instance: Add UpdateDevices
- incusd/instance: Add support for overriding disk device pool during migration
- incusd: Add support for overriding disk device pool during migration
- incusd: Fix cross-server migration being used instead of intra-cluster migration when storage and target are specified
- incusd/storage/linstor: Tune DrbdOptions/Disk/rs-discard-granularity on pool creation
- incus/storage: Fix typo
- i18n: Update translation templates
- incus/cluster: Fix spelling of YAML
- i18n: Updatee translation templates
- incus/network_zone: Fix missing example description
- i18n: Updatee translation templates
- incus/storage_bucket: Fix bad list column help message
- i18n: Updatee translation templates
- internal/rsync: Fix gofumpt
- internal/server/cgroup: Fix gofumpt
- incusd/instances: Fix gofump
- incusd/storage/s3: Add in-process S3 handler package
- incusd/storage/s3: Switch to new listener
- incusd/storage/s3: Migrate data from minio to new format
- incusd/storage: Remove remaining minio interactions
- incusd/storage/s3: Remove minio supervisor and ActivateBucket
- tests: Replace minio with simple built-in S3 endpoint
- incusd: Switch minio S3 client for AWS SDK
- incusd/storage/s3: Derive AWS region from S3 endpoint URL
- gomod: Update dependencies
- incusd: Patch LINSTOR to set DrbdOptions/Disk/rs-discard-granularity
- incus/server/network/ovn/driver: Validate that networks external ips are not used by another network, forward or loadbalancer
- incusd/images: Add image server restriction check in image URL download path
- incusd/storage/bucket: Validate expected metadata on import
- incusd/storage/volume: Validate snapshot entries on import
- incusd/storage/instance: Properly check dependent volumes on import
- incusd/network/ovn: Fix TLS validation logic
- incusd/storage/instance: Fix bad snapshot index calculation
- incusd/storage/s3: Fix nil pointer dereference on truncated input
- incusd: Limit tarball YAML reads to 1MiB
- incusd: Fix nil pointer dereference in instance backup restore
- incusd: Use QuotaWriter for backup and ISO uploads
- api: Add server_shutdown_action extension
- incusd/cluster/config: Add core.shutdown_action
- doc: Update metadata
- incusd/evacuate: Extract evacuateStopInstance and evacuateMigrateInstance helpers
- incusd: Implement core.shutdown_action
- incus/cluster: Don't attempt to connect during join
- incus/image/copy: Add --reuse flag for --copy-aliases
- i18n: Update translation templates
- incus/server/network/ovn/driver: Fix duplicate external network ip check on network creation
- doc/metrics: Mention Loki requirement
- incusd: Add missing path parameters
- doc/rest-api: Refresh swagger YAML
- Makefile: Add help target and remove tags target
- tests: Use a 5MiB test file for buckets
- incus/cluster: Simplify logic
- api: instances_placement_scriptlet_rebalance
- shared/api/scriptlet: Add InstancePlacementReasonRebalance
- incusd/cluster: Run placement scriptlet during re-balancing
- doc/clustering: Add new scriptlet reason
- incusd/instance/qemu: Fix locking around VM reset
- incusd/device/nic: Set next-hop based on configured IP addresses
- tests: Adjust to work with next-hop
- incusd/instance/agent-loader: Remove some trailing whitespaces
- incus/storage_bucket/key: Fix incorrect list column description
- incus/launch: Add missing example description
- incus/config_template: Add missing example description
- incus/create: Add missing example description
- incus/network_acl: Add missing example description
- incus/network_address_set: Add missing example description
- incus/network_integration: Add missing example description
- incus/network_zone: Add missing example description
- incus/storage: Add missing example description
- i18n: Update translation templates
- incusd/device/disk: Auto-create missing volume sub-directories
- incusd/instance: Allow initial keys for sub-paths
- doc/devices/disk: Update to cover sub-path creation
- doc: Update config
- tests: Extend sub-path tests to cover directory creation
- incusd/instance/qemu: Don't emit shutdown lifecycle event during restart
- incusd/instance/qemu: Don't restart the VM on shutdown
- incusd/instance/console: Emit a single instance-console event on SPICE
- gomod: Update dependencies
- Makefile: Switch to new golangci-lint install script
- github/workflows/tests: Configure PPAs without apt-add-repository
- github/workflows/tests: Install mdl from rubygems instead of snap
- github/workflows/tests: Build cowsql and raft from source
- Rewrite Go import path to v7
- gomod: Update dependencies
Documentation¶
The Incus documentation can be found at:
https://linuxcontainers.org/incus/docs/main/
Installation¶
There are no official Incus packages as Incus upstream only releases regular release tarballs. Below are some available options to get Incus up and running.
Linux packages¶
Incus is available for most common Linux distributions. You'll find detailed installation instructions in our documentation.
https://linuxcontainers.org/incus/docs/main/installing/
Homebrew package for the Incus client¶
The client tool is available through HomeBrew for both Linux and MacOS.
https://formulae.brew.sh/formula/incus
Chocolatey package for the Incus client¶
The client tool is available through Chocolatey for Windows users.
https://community.chocolatey.org/packages/incus/7.0.0
Winget package for the Incus client¶
The client tool is also available through Winget for Windows users.
https://winstall.app/apps/LinuxContainers.Incus
Migrating from LXD¶
A lxd-to-incus migration tool allows for in-place migration from LXD to Incus.
It's been tested with LXD versions as low as 4.0 LTS and as high as the latest LXD 5.21 bugfix release.
It allows for a very quick migration from LXD over to Incus, automatically checking for potential conflicts ahead of time.
More details can be found here: https://linuxcontainers.org/incus/docs/main/howto/server_migrate_lxd/
Support¶
Incus 7.0 LTS will be supported for a total of 5 years (until June 2031).
During the first 2 years, new point releases will be issued including a mix of bug and security fixes as well as some minor usabiltiy improvements. After that initial 2 years (after Incus 8.0 LTS is released), Incus 7.0 LTS will transition to security fixes only for the remaining 3 years.
This matches what we've been doing for our other projects (LXC and LXCFS) over the past 10 years.
Community support is provided at: https://discuss.linuxcontainers.org
Commercial support is available through: https://zabbly.com/incus
Bugs can be reported at: https://github.com/lxc/incus/issues
Incus 6.23 has been released¶
Mar 27, 2026
Introduction¶
The Incus team is pleased to announce the release of Incus 6.23!
This release is going to be our last 6.x release before Incus 7.0 LTS which is due out on April 30th.
It's also quite a busy release with a good mix of security issues (mostly thanks to an ongoing analysis by 7asecurity), bug fixes and performance improvements and then a very good selection of features from expanding our OS support for VMs to adding more flexible instance storage with dependent volumes!
As usual, you can try Incus for yourself online: https://linuxcontainers.org/incus/try-it/
Enjoy!
New maintainers¶
With this Incus release the Incus project is welcoming two new maintainers:
- Benjamin Somers
- Piotr Resztak
They are both long time contributors to Incus who have been involved with a variety of features and bugfixes throughout the Incus codebase and who are therefore well qualified to help with code reviews and general project direction and maintenance.
They're joining the existing maintainers:
- Aleksa Sarai
- Christian Brauner
- Free Ekanayaka
- Serge Hallyn
- Stéphane Graber
- Tycho Andersen
Security fixes¶
This release fixes 6 security issues:
- CVE-2026-33711 (low)
- CVE-2026-33542 (moderate)
- CVE-2026-33743 (moderate)
- CVE-2026-33898 (high)
- CVE-2026-33897 (critical)
- CVE-2026-33945 (critical)
All of the above except for CVE-2026-33542 were found as part of an ongoing security review of Incus by 7asecurity.
Backports to our LTS branch are available in the stable-6.0 branch and the distributions shipping Incus LTS have been notified and have published or will very soon publish updated packages.
New features¶
Dependent storage volumes¶
Incus now supports "dependent" volumes. Those are effectively the same as a regular custom volume attached to an instance, except that it is fully tied to the instance.
This means that deleting the instance will also delete the volume, creating an instance snapshot will create a matching snapshot on the volume, instance backups will include and restore the dependent volumes and migrating the instance will take the dependent volumes along for the ride.
stgraber@castiana:~$ incus launch images:debian/13 c1
Launching c1
stgraber@castiana:~$ incus storage volume create default c1-extra dependent=true
Storage volume c1-extra created
stgraber@castiana:~$ incus config device add c1 extra disk pool=default source=c1-extra dependent=true path=/extra
Device extra added to c1
stgraber@castiana:~$ incus storage volume snapshot create default c1-extra test
Error: Direct snapshots are not allowed for dependent volumes
stgraber@castiana:~$ incus snapshot create c1 foo
stgraber@castiana:~$ incus storage volume snapshot list default c1-extra
+------+----------------------+------------+
| NAME | TAKEN AT | EXPIRES AT |
+------+----------------------+------------+
| foo | 2026/03/27 18:54 EDT | |
+------+----------------------+------------+
stgraber@castiana:~$ incus snapshot delete c1 foo
stgraber@castiana:~$ incus storage volume snapshot list default c1-extra
+------+----------+------------+
| NAME | TAKEN AT | EXPIRES AT |
+------+----------+------------+
FreeBSD VM support¶
Incus now supports running its agent on FreeBSD.
Similar to the MacOS support, this relies on a network connection between Incus and the agent, requiring the VM to run on an Incus-managed network.
Daily builds of FreeBSD 14 and 15 are availabe on our image server.
stgraber@castiana:~$ incus launch images:freebsd/15.0 bsd -c security.secureboot=false --vm
Launching bsd
stgraber@castiana:~$ incus wait bsd agent && incus exec bsd sh
# freebsd-version·
15.0-RELEASE
NOTE: It may take a little while before all packagers include the need build recipe for the FreeBSD agent, leading to some Incus 6.23 systems being unable to get a shell out of the box. Rebooting the VM into single user mode will allow setting up a root password and using it through the console.
Reworked CLI parser¶
The main command line parser for the incus command has gone through a few improvements. It now has much better errors to indicate what argument may be wrong or missing as well as colored output to improve the legibility of the help messages.

Support for disabling DHCP announcement of the gateway¶
It's now possible to set ipv4.dhcp.gateway to the special none value to have Incus configure its DHCP server to only configure IP addresses but not push any routes.
This can be particularly useful when some instances are connected to multiple networks with some of those networks not meant to route traffic to the outside world.
Support for ipv4.dhcp.gateway on OVN networks¶
Related to the previous feature, OVN now also supports ipv4.dhcp.gateway, including the new special none value.
This allows having another instance or machine on the OVN network act as the gateway in place of the virtual router, or configuring the OVN DHCP service to not advertised a default route at all.
Support for io.bus on OVN NICs¶
It's now possible to use io.bus with OVN NICs.
This effectively allows adding a USB network interface to a VM and have it be connected to an OVN network.
VM agent lifecycle events¶
Two new lifecycle events have been added in this release:
- instance-agent-started
- instance-agent-stopped
The events should be pretty self-explanatory. They are limited to Incus VMs and will be emitted as soon as Incus receives an agent notification over the serial connection.
Reworked incus file pull and incus storage volume file pull¶
The file pulling logic in both commands has been updated to match behavior with the popular cp command.
This specifically relates to handling of symlinks with the following options being now supported:
-L(Always follow symbolic links in source path)-H(Follow command-line symbolic links in source path)-P(Never follow symbolic links in source path)
Project related metrics¶
Some new metrics have been added to provide for project-wide statistics.
stgraber@castiana:~/Code/lxc/incus (git:lxc/main)$ incus query /1.0/metrics | grep _project_
# HELP incus_project_resources_total Current resource count in a project.
# TYPE incus_project_resources_total gauge
incus_project_resources_total{project="default",resource="containers"} 0
incus_project_resources_total{project="default",resource="virtual-machines"} 3
incus_project_resources_total{project="default",resource="images"} 17
incus_project_resources_total{project="default",resource="profiles"} 1
incus_project_resources_total{project="default",resource="networks"} 3
incus_project_resources_total{project="default",resource="storage-volumes"} 6
incus_project_resources_total{project="demo",resource="containers"} 0
incus_project_resources_total{project="demo",resource="virtual-machines"} 0
incus_project_resources_total{project="demo",resource="images"} 0
incus_project_resources_total{project="demo",resource="profiles"} 1
incus_project_resources_total{project="demo",resource="networks"} 0
incus_project_resources_total{project="demo",resource="storage-volumes"} 0
incus_project_resources_total{project="user-1001",resource="containers"} 0
incus_project_resources_total{project="user-1001",resource="virtual-machines"} 0
incus_project_resources_total{project="user-1001",resource="images"} 2
incus_project_resources_total{project="user-1001",resource="profiles"} 1
incus_project_resources_total{project="user-1001",resource="networks"} 0
incus_project_resources_total{project="user-1001",resource="storage-volumes"} 0
Instance low-level repair API¶
A new API-only endpoint was introduced at /1.0/instances/NAME/debug/repair.
This allows Incus to expose some low-level repair actions that may need to be run especially in restricted environments where a user can't directly go look at the instance on-disk configuration or storage (IncusOS is a good example of that).
Currently a single action is supported, rebuild-config-volume which is available for instances using QCOW2 block storage on the clustered LVM driver and as the name suggests, allows for completely rebuilding the configuration volume to recover from specific btrfs corruption issues that may occur from a host power loss event.
Complete changelog¶
Here is a complete list of all changes in this release:
Full commit list
- incusd/instance: Allow custom volume snapshot create/delete when attached to running instance
- incusd/server: Allow custom volume snapshot create/delete when attached to running instance
- shared/cliconfig: Add lock to prevent panic
- incusd/endpoints/starttls: Report correct ServerName
- cmd/generate-database: fix linter complaints - #2636
- build(deps): bump actions/upload-artifact from 6 to 7
- incusd/network/bridge: Support disabling DHCPv4 router announcement
- incusd/network/ovn: Implement ipv4.dhcp.gateway
- doc: Update config
- internal/server/firewall: fix linter complaints - #2636
- internal/server/sys: fix linter complaints - #2636
- internal/server/project: fix linter complaints - #2636
- internal/server/util: fix linter complaints - #2636
- incusd/instance/lxc: Add /usr/bin/init to OCI PID1 list
- internal/server/seccomp: fix linter complaints - #2636
- internal/server/migration: fix linter complaints - #2636
- internal/server/task: fix linter complaints - #2636
- incus/usage: Add a way to show the user a parsing rule different from the one in use
- incus/usage: Small tweaks before adding parsers
- api: instances_debug_repair
- shared/api: Add InstanceDebugRepairPost
- doc/rest-api: Refresh swagger YAML
- incusd/storage: Implement ActivateTask
- incusd/instance/debug: Implement instance repair API
- incus/usage: Add parsers
- incus: Add --explain global flag
- incus/usage: Add legacy support functions
- incus/action: Switch to new parser
- incus/admin_init: Switch to new parser
- incus/admin_recover: Switch to new parser
- incus/admin_shutdown: Switch to new parser
- incus/admin_sql: Switch to new parser
- incus/admin_waitready: Switch to new parser
- incus/alias: Switch to new parser
- incus/cluster: Switch to new parser
- incus/cluster_group: Switch to new parser
- incus/cluster_role: Switch to new parser
- incus/config: Switch to new parser
- incus/config_device: Switch to new parser
- incus/config_metadata: Switch to new parser
- incus/config_template: Switch to new parser
- incus/config_trust: Switch to new parser
- incus/console: Switch to new parser
- incus/delete: Switch to new parser
- incus: Switch
copyandmoveto new parser - incus: Switch
createandlaunchto new parser - incus/debug: Switch to new parser
- incus/exec: Switch to new parser
- incus/export: Switch to new parser
- incus/file: Switch to new parser
- incus/image: Switch to new parser
- incus/image_alias: Switch to new parser
- incus/import: Switch to new parser
- incus/info: Switch to new parser
- incus/list: Switch to new parser
- incus/manpage: Switch to new parser
- incus/monitor: Switch to new parser
- incus/network: Switch to new parser
- incus/network_acl: Switch to new parser
- incus/network_address_set: Switch to new parser
- incus/network_allocations: Switch to new parser
- incus/network_forward: Switch to new parser
- incus/network_integration: Switch to new parser
- incus/network_load_balancer: Switch to new parser
- incus/network_peer: Switch to new parser
- incus/network_zone: Switch to new parser
- incus/operation: Switch to new parser
- incus/profile: Switch to new parser
- incus/project: Switch to new parser
- incus/publish: Switch to new parser
- incus/query: Switch to new parser
- incus/rebuild: Switch to new parser
- incus/remote: Switch to new parser
- incus/rename: Switch to new parser
- incus/snapshot: Switch to new parser
- incus/storage: Switch to new parser
- incus/storage_bucket: Switch to new parser
- incus/storage_volume: Switch to new parser
- incus/top: Switch to new parser
- incus/version: Switch to new parser
- incus/wait: Switch to new parser
- incus/warning: Switch to new parser
- incus/webui: Switch to new parser
- test: Fix
incus config settests - test: Fix
incus profile assigntests - test: Fix
incus storage volume attachtests - test: Fix
incus storage volume snapshot showtests - test: ISO import now allows setting no volume name
- go.mod: Make runewidth a direct dependency
- Makefile: Properly set POT encoding
- i18n: Update translation templates
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Italian)
- Translated using Weblate (Italian)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Dutch)
- Translated using Weblate (Dutch)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Russian)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Tamil)
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- incusd/operations: Fix missing Unlock
- doc: Fix typo
- incusd: Fix typo
- Translated using Weblate (Portuguese)
- incusd/metrics: Increase node-exporter timeout to 5s
- doc: Add preselects to wordlist
- Translated using Weblate (Swedish)
- incusd/instance_logs: Prevent bad values for exec-output
- incus-migrate: Restrict OVA unpack path
- incus/network_allocation: Fix project handling
- incusd/network_allocations: Use canAccessNetwork
- incusd/instance/qemu: Relax SEV check
- incus: Fix import shadowing
- incusd/storage_volumes: Use switch statement
- incusd/network/common: Use FPrintf instead of WriteString
- incusd/device/nic_physical: Drop support for connected key
- incusd/device/nic_ovn: Add io.bus key for OVN NICs
- doc: Update config
- api: network_io_bus_ovn
- shared/api: add new instance-agent events
- internal/server: fire instance-agent events when agent status changes
- doc: add instance-agent entries to lifecycle events
- incus/usage: Defer remote connection
- incusd/backup: Make extra sure backup.yaml is consistent on disk
- incus-agent/darwin: Factor BSD-like bits out
- incus-agent/freebsd: Add FreeBSD agent
- incusd/instance/agent-loader: Add FreeBSD files
- incusd/instance/qemu: Support FreeBSD
- doc/instance/create: Add details for FreeBSD
- doc/wordlist: Update wordlist
- incusd/instance/lxc: Stop any forkfile instances prior to migration
- incusd/storage/zfs: Freeze ZFS instances when using block_mode
- incusd/storage/zfs: Don't create temporary snapshot for inactive volumes
- incusd/storage/zfs: Don't unmap a mounted snapshot
- incus/storage/volume: Fix image deletion
- incusd/storage: Don't allow loop pools on IncusOS
- Translated using Weblate (Swedish)
- cmd/incus: fix log in sftpRecursiveMkdir
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- devcontainer: update Go version and pipx install command
- Translated using Weblate (Swedish)
- incus/cluster: Fix default column layout in help text
- i18n: Update translation templates
- incus: Fix indent on --sub-commands
- incusd/storage: Add readonly 'dependent' volume config key
- incusd/device: Add 'dependent' config key to disk device
- incusd: Prevent direct snapshot creation and deletion on dependent volumes
- incusd/storage: Create and delete dependent volume snapshots with instance snapshots
- incusd/storage: Support restoring an instance with dependent volumes from a snapshot
- incusd/storage/drivers: Add ability to set archive files path when exporting/importing volumes
- incusd/backup: Add DefaultBackupPrefix constant
- incusd/backup/config: Add DependentVolumes field to Config struct
- incusd: Pass path info when exporting/importing custom volume
- incusd/storage: Add support for exporting/importing dependent volumes
- incusd/storage/drivers: Create QCOW2 config volume snapshot during unpack if needed
- incusd/export: Add support for root-only flag
- incusd: Pass rootOnly argument where needed
- shared/api: Add RootOnly to InstanceBackupsPost
- incusd/backup: Add support for dependent volumes to backup
- incusd/db/cluster: Add root_only column to instances_backups
- incusd/db: Read and write 'root_only' field in table operations
- incusd/storage: Conditionally export dependent volumes
- incusd/instance: Pass rootOnly argument where needed
- tests: Add tests for dependent volumes
- doc/rest-api: Refresh swagger YAML
- doc: Update metadata
- api: Add dependent extension
- i18n: Update translation templates
- Introduce goreleaser
- incusd/daemon: Allow internal and os API during startup
- api: Add project_metrics extension
- incusd/metrics: Add project resource, limit and usage metrics
- doc: Add project metrics documentation
- incus-agent: Fix typos
- incusd/instance/agent-loader: Make stop kill the daemon instead of the agent
- incus-agent: Add hostname update logic for FreeBSD
- github: Disable shellcheck for rc.d services
- incusd/storage/drivers: Disallow for qcow2 custom block volumes
- doc: Document restriction for qcow2 custom block volumes
- cmd/incus: Print newly-created snapshot name if unspecified
- i18n: Update translation templates
- incus/info: Allow querying alternative log files
- i18n: Update translation templates
- incus: Add colors
- go.mod: Make color a direct dependency
- golangci: ignore errcheck for colored printers
- shared/cmd: Remove non-translatable colon
- incus: Refactor description strings
- incus-simplestreams: Re-add colons in description headers
- incusd: Re-add colons in description headers
- Makefile: Add missing packages to translate
- i18n: Update translation templates
- incusd/storage: Remove renaming of config volume Btrfs subvolume
- incusd/storage/drivers: Switch Btrfs subvolume naming to 'instance-' prefix
- incusd: Add patch to rename existing Btrfs subvolumes from '
-' to 'instance-' - incusd/device: Add support for partial device validation
- incusd: Pass partial validation flag to device validation functions
- incusd/instance: Pass partial validation flag to device validation functions
- incusd/migration: Add protobuf definitions to support dependent volume migration
- incusd/migration: Add structs and helper functions for dependent volume migration
- incusd: Switch to common VolumeSnapshotToProtobuf
- incusd/storage: Add support for dependent volumes migration
- incusd/instance: Add support for dependent volumes migration
- incusd: Add support for removing dependent volumes on source after migration
- internal/util: Fix LogPath logic to work with logs volume
- incusd/instances: Use internalUtil.LogPath
- incusd/daemon_storage: Fix log directory handling after LogPath change
- incus: Disable colors in parsing error messages
- incus: Print a new line before printing parsing errors
- shared/ws: Remove CheckOrigin bypass
- incusd/s3: Use standard TLS config on S3 API calls
- incusd/auth/oidc: Tighten cookie policy
- incus-agent: Tighten HTTP listener configuration
- incusd: Tighten HTTP listener configuration
- incusd/certificates: Prevent any type change
- tests: Confirm certificate type can't be changed
- incus: Add
no_colorconfig key - incusd/seccomp: Limit the new mount API system calls we block
- shared/validate: Allow LZ4 compression
- incus-migrate: Fix OVA handling within os.Root
- incus-migrate: Allow importing OVAs from URLs
- client: Make ImageFileRequest require a ReadWriteSeeker
- incus: Update for changes to incus.ImageFileRequest
- incusd: Update for changes to incus.ImageFileRequest
- client/simplestreams: Validate the full image hash
- incusd/instance_console: Prevent symlink attacks
- incusd/storage/s3: Don't assume backup structure
- incusd/instance: Use restricted pongo2 parser
- incus/remote: Actually validate the token code in
incus webui - doc/authentication: Clarify the type of incus.allowed_subnets
- incusd/auth/oidc: Cleanup and tighten subnet claim handling
- incus-agent: Use same YAML version as rest of code base
- incusd/network: Switch to backoff/v5
- incusd/network: Switch to go-criu/v8
- shared/logger: Implement basic slog wrapper
- incusd/bgp: Port to go-bgp/v4
- Makefile: Bump to Go 1.25.6
- gomod: Update dependencies
- github: Allow GHSA-4p9m-8gc4-rw2h (no fix available)
- incus/usage: Fix edge case
- Translated using Weblate (Tamil)
- Translated using Weblate (Italian)
- Translated using Weblate (Italian)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Russian)
- Translated using Weblate (Dutch)
- Translated using Weblate (Dutch)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Portuguese)
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- doc: Remove config-options page
- Added translation using Weblate (Greek)
- incusd/instance/drivers: Refactor live migration - extract common logic
- incusd/storage/drivers: Prevent setting the 'snapshots.XYZ' keys on dependent volumes
- incusd/device: Use ValidateDependentConfigKey for dependent config validation
- incus: Add cp-like flags to incus file pull
- tests: Test cp-like flags in incus file pull
- incus/storage_volume: Add cp-like flags to incus storage volume file pull
- tests: Test cp-like flags in incus storage volume file pull
- i18n: Update translation templates
- incusd/instances_post: Add extra validation during backup import
- incus/import: Fix bad rendering on error
- incusd/device: Allow live migration of dependent disks
- incusd/instance/drivers: Add support for live migration of dependent disks
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (Japanese)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (French)
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Portuguese (Brazil))
- Translated using Weblate (Swedish)
- Translated using Weblate (Swedish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Spanish)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Indonesian)
- Translated using Weblate (Tamil)
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Chinese (Simplified Han script))
- Translated using Weblate (Russian)
- Translated using Weblate (Russian)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Norwegian Bokmål)
- Translated using Weblate (Dutch)
- Translated using Weblate (Dutch)
- Translated using Weblate (Italian)
- Translated using Weblate (Italian)
- Translated using Weblate (Greek)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (German)
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Chinese (Traditional Han script))
- Translated using Weblate (Portuguese)
- Translated using Weblate (Portuguese)
- Translated using Weblate (French)
- Translated using Weblate (Russian)
- incusd/instance/qemu: Add image.requirements.cdrom_cloud_init key
- doc: Update config
- incusd/daemon_storage: Don't unmount logs path on shutdown
- incusd/instance/lxc: Wait after thawing
- incusd/instance/lxc: Confine credentials write to credentials directory
- incusd/response: Make sftpResponse generic
- incusd: Update for UpgradeResponse
- client: Move to generic upgrader
- Translated using Weblate (Russian)
- Translated using Weblate (Portuguese)
- Translated using Weblate (French)
- incusd/storage/lvm: Use shared access mode for ISO
- incusd/storage/truenas: Fix VM rename
- incus-agent: Fix router to avoid global match
- incusd/instance/lxc: Include config.json on publish
- doc/images_create: Mention that OCI container publishing isn't recommended
- incus: Complete all configs keys
- incusd/instance/lxc: Relax handling of initial.
- incusd/storage/volume/list: Fix project handling in all-projects queries
- incusd/seccomp: Fix mknod in /dev
- incus: Don't hang on password prompt when run from script
- gomod: Update dependencies
- Release Incus 6.23
Documentation¶
The Incus documentation can be found at:
https://linuxcontainers.org/incus/docs/main/
Packages¶
There are no official Incus packages as Incus upstream only releases regular release tarballs. Below are some available options to get Incus up and running.
Installing the Incus server on Linux¶
Incus is available for most common Linux distributions. You’ll find detailed installation instructions in our documentation.
https://linuxcontainers.org/incus/docs/main/installing/
Homebrew package for the Incus client¶
The client tool is available through HomeBrew for both Linux and MacOS.
https://formulae.brew.sh/formula/incus
Chocolatey package for the Incus client¶
The client tool is available through Chocolatey for Windows users.
https://community.chocolatey.org/packages/incus/6.23.0
Winget package for the Incus client¶
The client tool is also available through Winget for Windows users.
https://winstall.app/apps/LinuxContainers.Incus
Support¶
Monthly feature releases are only supported up until the next release comes out. Users needing a longer support length and less frequent changes should consider using Incus 6.0 LTS instead.
Community support is provided at: https://discuss.linuxcontainers.org
Commercial support is available through: https://zabbly.com/incus
Bugs can be reported at: https://github.com/lxc/incus/issues
Older news¶
- Mar 16, 2026
- Feb 27, 2026
- Jan 23, 2026
- Dec 19, 2025
- Nov 29, 2025
- Oct 31, 2025
- Sep 26, 2025
- Aug 29, 2025
- Aug 15, 2025
- Aug 1, 2025
- Jun 28, 2025
- May 30, 2025
- Apr 25, 2025
- Apr 4, 2025
- Mar 28, 2025
- Feb 28, 2025
- Jan 24, 2025
- Dec 19, 2024
- Dec 13, 2024
- Nov 15, 2024
- Oct 3, 2024
- Sep 17, 2024
- Sep 6, 2024
- Aug 9, 2024
- Jul 12, 2024
- Jun 28, 2024
- May 31, 2024
- May 7, 2024
- Apr 4, 2024
- Mar 26, 2024
- Feb 23, 2024
- Jan 29, 2024
- Jan 26, 2024
- Dec 21, 2023
- Nov 27, 2023
- Oct 28, 2023
- Oct 7, 2023




