News

Incus 6.12 has been released

Apr 25, 2025

Introduction

The Incus team is pleased to announce the release of Incus 6.12!

This release comes with some very long awaited improvements such as online growth of virtual machine memory, network address sets for easier network ACLs, revamped logging support and more!

On top of the new features, this release also features quite a few welcome performance improvements, especially for systems with a lot of snapshots and with extra performance enhancements for those using ZFS.

image|690x303

As usual, you can try it for yourself online: https://linuxcontainers.org/incus/try-it/

Enjoy!

New features

Network address sets

To simplify management of complex network ACL rules, Incus now has support for address sets.

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/

Memory hotplug support in VMs

One of the very few remaining gaps between the container and VM experience under Incus was that memory could only be reduced in a VM and never grown.

This has now been fixed as we now support hotplugging memory into a guest, allowing for limits.memory to be increased at runtime, making that memory instantly available inside of the VM.

stgraber@dakara:~$ incus launch images:debian/13 d13 --vm
Launching d13
stgraber@dakara:~$ incus exec d13 -- free -m
               total        used        free      shared  buff/cache   available
Mem:             879         238         662          19         102         640
Swap:              0           0           0
stgraber@dakara:~$ incus config set d13 limits.memory=4GiB
stgraber@dakara:~$ incus exec d13 -- free -m
               total        used        free      shared  buff/cache   available
Mem:            3951         351        3684          19         102        3600
Swap:              0           0           0

Reworked logging handling & remote syslog

Incus logging has so far been limited to two options:

  • Local syslog logging
  • Remote Loki logging (with a single endpoint)

That's now changing with this release as we've rolled out a new much more flexible logging mechanism which allows for an unlimited number of logging targets which can either be loki or syslog and with support for selecting what events to include.

Example:

logging.loki01.target.type: loki
logging.loki01.target.address: https://loki01.int.example.net
logging.loki01.target.username: foo
logging.loki01.target.password: bar
logging.loki01.types: lifecycle,network-acl
logging.loki01.lifecycle.types: instance

logging.syslog01.target.type: syslog
logging.syslog01.target.address: syslog01.int.example.net
logging.syslog01.target.facility: security
logging.syslog01.types: logging
logging.syslog01.logging.level: warning

This example defines two logging targets, loki01 and syslog01, with the former receiving Loki logging traffic through an authenticated endpoint (reverse proxy) and only sends lifecycle events (specifically those affecting instances) as well as network ACL hits. The latter uses syslog logging and sends logging messages of priority warning or higher.

Documentation: https://linuxcontainers.org/incus/docs/main/server_config/#server-options-logging

SNAT support on complex network forwards

Network forwards can be pretty flexible in how ports and port ranges are allowed.
For example, you can forward port 80 and 443 externally to an internal IP on port 1234 and 2345 respectively.

This works fine in most cases, but in specific situations, such as WebRTC applications using UDP ports, some of the traffic will be initiated from the instance rather than from an external client. In this scenario, traffic coming out of the instance from port 2345 should appear externally as coming from the forward address and port 443.

This is what the new snat property on individual ports within a network forward is here for. It sets up a matching SNAT rule for traffic originating from the instance.

The feature is limited to network forwards on regular bridges (not OVN) and only on systems using nftables for firewalling.

Documentation: https://linuxcontainers.org/incus/docs/main/howto/network_forwards/#port-properties

Authentication through access_token parameter

Incus supports two main authentication mechanisms:

  • TLS client certificates
  • OpenID Connect (OIDC)

For the former, most clients will directly consume the TLS client certificate and use it as part of the TLS connection. However this doesn't always work, either because it's difficult for the client to handle (e.g. web browsers) or because of a TLS terminating proxy getting in the way.

For this reason, we also support deriving a signed Bearer token from the TLS certificate and feeding that through the HTTP Authorization header.

Now with this release, that same Bearer token can be passed through the access_token URL parameter rather than through the HTTP header.

The primary reason for this is to allow connecting to authenticated websocket endpoints from web clients as the Javascript websocket API doesn't allow passing custom HTTP headers.

Example:

stgraber@dakara:~$ curl -k -s https://127.0.0.1:8443/1.0 | jq -r .metadata.auth
untrusted
stgraber@dakara:~$ curl -k -s https://127.0.0.1:8443/1.0?access_token=eyJhbGciOiJFUzM4NCIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZjQ3MzRhYzY3YzAzMDYxY2Y1Yzg5Y2UxYTQ2NDAwYjc4MzQ2MWRiOGI3MjlkMDhjNDZhYjE5MmM3ZDc2NTMxIiwiZXhwIjoxNzQ1NTMxOTA4LCJuYmYiOjE3NDU1MzE4NDgsImlhdCI6MTc0NTUzMTg0OH0.WcsG48XQ41fNhLUlf-nqwAyJrZKpCrfM-W8mOSNpt7cwPH-QhKZkiBDa3sFWIVOdo15_cOZBeNy1QbJu6rCnYYQ18LpNJNkSKPkcwi65-yBo7U7ync5BQCuhsOgxAQap | jq -r .metadata.auth
trusted

Improved server side filtering in the CLI

We've recently added support for server-side filtering of everything single object type within the Incus API. Following that, we're now slowly adding support for it to the CLI, allowing for less database and network traffic when only some specific items are requested.

With this release, the following have now been fully ported to server-side filtering:

  • Instances
  • Images
  • Custom volumes
  • Profiles

Example:

stgraber@dakara:~$ incus profile list description=bar
+------+-------------+---------+
| NAME | DESCRIPTION | USED BY |
+------+-------------+---------+
| foo  | bar         | 0       |
+------+-------------+---------+

This work was partly done by students at the University of Texas in Austin.

More generated documentation

We've continued our effort to port most of our configuration tables to be generated directly from the code, avoiding any risk of forgotten configuration keys.

With this release, the following are now extracted directly from the code:

  • Network bridges
  • Network forwards
  • TPM devices
  • Proxy devices
  • GPU devices
  • NIC devices
  • Infiniband devices

This work was done by students at the University of Texas in Austin.

Complete changelog

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

Full commit list
  • doc: Fix missing OCI section
  • internal/instance: Tweak wording
  • doc: Update config
  • incus/utils: Added support for server-side filtering by instance name
  • incus/list: Added support for server-side filtering by instance name
  • incus/image: Adjustments made after modifying getServerSupportedFilters
  • tests: Adjustments made after modifying getServerSupportedFilters
  • doc: Fix config option reference on LINSTOR driver
  • incusd/instance/lxc: Fix max gid when in a privileged container
  • incus: Replace interface{} by any
  • internal/server/ip: Replace interface{} by any
  • shared/logger: Replace interface{} by any
  • client: Use strings.ReplaceAll
  • lxd-to-incus: Use strings.ReplaceAll
  • generate-database: Use strings.ReplaceAll
  • incusd/db/cluster: Update generated code
  • incus: Use strings.ReplaceAll
  • internal/linux: Use strings.ReplaceAll
  • incusd/apparmor: Use strings.ReplaceAll
  • incusd/auth: Use strings.ReplaceAll
  • incusd/db/cluster: Use strings.ReplaceAll
  • incusd/db: Use strings.ReplaceAll
  • incusd/device: Use strings.ReplaceAll
  • incusd/instance: Use strings.ReplaceAll
  • incusd/ip: Use strings.ReplaceAll
  • incusd/network: Use strings.ReplaceAll
  • incusd/storage: Use strings.ReplaceAll
  • incus/utils: Check type assertion
  • incusd/instance: Remove needless embedded fields
  • incusd/storage/s3: Simplify variable declaration
  • README: Fix typo
  • lxd-to-incus: Fix typo in trigger
  • incusd/instance/edk2: Limit test to UEFI architectures
  • doc/devices/disk: Fix restriction on path option
  • doc: Update configs
  • doc: Tweak ACME documentation
  • incusd/instances/qemu: Handle deprecation of runas
  • incusd/main_forknet: Handle missing DNS in DHCP response
  • incusd/instance/lxc: Pass limited environment to forkstart
  • incusd/instance/lxc: Don't reset resolv.conf
  • incusd/main_forknet: Use Fprintf
  • cmd/list: Support server-side filtering
  • cmd/image: Support server-side filtering
  • cmd/utils: Support server-side filtering
  • internal/filter: Support server-side filtering
  • tests: Added/Fixed tests for server-side filtering
  • client: Add GetImagesAllProjectsWithFilter
  • cmd/image: Use GetImagesAllProjectsWithFilter to filter images across all projects
  • incusd/instance/qemu: Avoid unnecessary snapshot loading
  • incusd/migrate: Bump timeouts to 30s
  • incusd/storage: Add missing forwarding on snapshot list
  • client: Pass ETag in UpdateWarning
  • client: Pass ETag in UpdateCluster
  • client: Make golangci-lint clean
  • shared/api: Make golangci-lint clean
  • shared/idmap: Remove unused rootfs argument to NewSetFromSystem
  • incus-user: Update for change to shared/idmap
  • incusd/sys: Update for change to shared/idmap
  • shared/idmap: Rename IdmapStorageType to StorageType
  • shared/idmap: Make golangci-lint clean
  • incusd: Update for shared/idmap changes
  • shared/ws: Make golangci-lint clean
  • shared/ask: Remove deprecated functions (and clear golangci-lint)
  • shared/validate: Make golangci-lint clean
  • shared/tls: Make golangci-lint clean
  • shared/osarch: Make golangci-lint clean
  • shared/osarch: Rename ArchitectureId to ArchitectureID
  • shared/simplestreams: Update for ArchitectureID
  • incusd: Update for ArchitectureID
  • client: Update for ArchitectureID
  • incus-simplestreams: Update for ArchitectureID
  • lxc-to-incus: Update for ArchitectureID
  • internal/version: Update for ArchitectureID
  • shared/osarch: Keep our all-caps architecture names
  • client/oci: Only replace the first match
  • incus: Remove unused functions
  • incusd/instance/common: Fix concurrent restarts
  • incus: Make golangci-lint clean
  • shared/subprocess: Make golangci-lint clean
  • shared/simplestreams: Make golangci-lint clean
  • shared/cliconfig: Make golangci-lint clean
  • shared/ask: Make golangci-lint clean
  • shared/util: Make golangci-lint clean
  • shared/revert: Make golangci-lint clean
  • shared/proxy: Make golangci-lint clean
  • shared/logger: Make golangci-lint clean
  • shared/archive: Make golangci-lint clean
  • incusd/instance/lxc: Fix import shadowing in IdmappedStorage
  • doc/rest-api: Refresh swagger YAML
  • generate-database: Fix documentation for ignore
  • incusd/response: Remove redundant line break in error
  • incusd/main_forknet: Don't add gateway route if classless static routes are provided (as required by RFC 3442)
  • incusd/network/ovn: Add plumbing for state through OVN ACL functions
  • api: network_address_set
  • doc: Add documentation for network address sets
  • shared/api: Add network address sets
  • shared/api/lifecycle: Add events for network address sets
  • incusd/auth: Add network address sets
  • incusd/auth/openfga: Rebuild model
  • incusd/network/ovn: Add GetAddressSet
  • incusd/network/ovn: Add address set support
  • incusd/network/bridge: Add address set support
  • incusd/db/cluster: Add network_address_sets tables
  • incusd/db: Add network address set functions
  • incusd/network/acl: Add address set support
  • incusd/lifecycle: Add network address set events
  • incusd/firewall: Add address set support
  • incusd/projects: Clear address sets on delete
  • incusd/network/address-set: Add new API
  • incusd/device/nic/ovn: Handle address set when cleaing ACLs
  • client: Add network address set functions
  • incus: Add network address-set sub-command
  • i18n: Update translation templates
  • tests: Add tests for address sets
  • doc/rest-api: Refresh swagger YAML
  • doc: Update configs
  • incus-agent: Retry mounts to avoid kernel races
  • incusd/instance: Add Name to ConfigReader interface
  • incusd/storage: Use ConfigReader when possible
  • incusd/response: Remove unused nolint
  • incusd/storage: Add infrastructure to cache pre-fetch snapshot data
  • incusd/instance: Use storage instance snapshot caching
  • incusd/instance/lxc: Use existing storage pool in diskState
  • incusd/storage/zfs: Implement snapshot size caching
  • incusd/instance: Move instance disk usage to driver logic
  • incusd/config: Update list of supported compressors
  • incusd/project: Update list of supported compressors
  • doc: Update configs
  • incusd/operations: Fix WaitGet on op failure
  • incusd/instance/lxc: Use pre-existing PATH when not overridden
  • incusd/acme: Include CA in generate certificate
  • shared/ask: Fix bad validation logic
  • incus-migrate: Fix golangci-lint warnings
  • incus-migrate: Rework command validation
  • incus-migrate: Require an instance type
  • incus-migrate: Clarify arguments
  • client/incus: Fix non-constant format strings
  • doc/cluster: mDNS setup for cluster access
  • cmd/storage_volume: Support filtering by a single keyword
  • i18n: Update translation templates
  • incusd/instance/qemu: Clean leftover sockets on startup
  • incusd: Implement Incus OS API forwarding
  • incusd/network/bridge: Port to gendoc
  • doc/network/bridge: Use gendoc
  • doc: Update configs
  • doc: Use $USER instead of YOUR-USERNAME
  • doc: Ignore link that's blocking Azure
  • incusd/storage: Avoid querying pending pool status
  • incusd/storage/linstor: Fix pool size reporting
  • incusd/patches: Refresh OpenFGA model for address sets
  • incusd/network/common: Add gendoc comments for forward configurations
  • doc: Update configs
  • doc/network/forward: Use gendoc for network forwards
  • api: server_logging
  • incus/server/logging: Add new logging mechanism with syslog and loki support
  • incus/server/config: Support for new logging.* config keys
  • incusd: Use new logging mechanism
  • incus/server/events: Fix issue with race condition
  • incus/server/loki: Remove loki package
  • doc: Documentation for new logging mechanism
  • doc: Update configs
  • incusd/device/tpm: Add gendoc comments
  • doc: Update configs
  • doc: Use gendoc for TPM devices
  • incusd/firewall/nftables: Cleanup rule formatting
  • incusd/firewall: Add basic rules on nftables
  • incusd/storage/zfs: Make CacheVolumeSnapshots failures non-fatal
  • incusd/instance/lxc: Restrict unprivileged ping to recent kernels
  • api: network_forward_snat
  • doc/network_forwards: Add snat key
  • shared/api: Add SNAT to NetworkForwardPort
  • doc/rest-api: Refresh swagger YAML
  • incusd/network/common: Add validation for SNAT
  • incusd/network: Pass SNAT field to firewall driver
  • incusd/firewall: Add support for forward SNAT rules
  • doc: Add SNAT/DNAT to wordlist
  • incusd/apparmor/lxc: Allow write access to /proc/sys/user
  • incusd/instance/lxc: Defer calls to the scheduler
  • shared/archive: Prevent xattr errors from crashing unsquashfs
  • incusd/storage/zfs: Extend use of the cache
  • incusd/instance: Pre-fetch snapshot data in RenderFull
  • incus-simplestreams: Add import and delete aliases to add and remove
  • incus: Add remove alias to delete
  • incusd/http: Support passing bearer authentication token through access_token parameter
  • tests: Test the access_token handling
  • incusd/instance/qmp: Add utility functions for memory manipulation
  • incusd/instance/drivers: Extract getCPUOpts for reuse
  • incusd/instance/drivers: Add support for memory hotplug
  • api: memory_hotplug
  • tests: Add tests for memory hotplug helper functions
  • incusd/instances_post: Properly handle refresh migrations
  • incusd/storage/zfs: Rework ZFS setting enforcement
  • incusd: Remove old routing logic
  • incusd/instances_post: Fix bad function call
  • incusd/devices: Don't require a serial number for USB hotplug
  • Move tls testing functions to tlstest
  • incusd/device/proxy: Add gendoc comments
  • doc: Update generated configs
  • doc/devices/proxy: Use gendoc for docs
  • Remove Rican7/retry dependency
  • shared/tls: Fix gofumpt
  • incusd/device/gpu: Added gendoc comments
  • doc: Updated configs
  • doc: Use gendoc for gpu
  • incusd/device/nic_bridged: Port to gendoc
  • incusd/device/nic_macvlan: Port to gendoc
  • incusd/device/nic_sriov: Port to gendoc
  • incusd/device/nic_ovn: Port to gendoc
  • incusd/device/nic_physical: Port to gendoc
  • incusd/device/nic_ipvlan: Port to gendoc
  • incusd/device/nic_p2p: Port to gendoc
  • incusd/device/nic_routed: Port to gendoc
  • doc/devices_nic: Update to use gendoc
  • doc: Update configs
  • incusd/device: Replace j-keck/arping with mdlayher/arp
  • Makefile: Hold back go-jose
  • gomod: Update dependencies
  • incusd/sys: Remove gocapability dependency
  • gomod: Update dependencies
  • incusd/server/device/infiniband: Added gendoc for parent, mtu, hwaddr
  • incusd/device/device_load.go: Added gendoc for nicType
  • doc: Update configs
  • doc: Use gendoc for infiniband
  • shared/validate: Move to adhocore/gronx
  • incusd: Move to adhocore/gronx
  • gomod: Update dependencies
  • incus/storage: Correct help messsage for incus storage list
  • i18n: Update translation templates
  • api/scriptlet: Add yaml struct tags
  • incusd/storage/migration: Check instance size during migration
  • incusd/main_forknet: Add dhcp static routes via 0.0.0.0 as scope link
  • incusd/main_forknet: Use logrus for logging and add a command argument for the logfile path
  • incusd/instance/lxc: Pass log file to forknet dhcp
  • incusd/device/disk: Fix registration of custom volumes
  • client: Add server-side filtering for profiles
  • incus/profile: Use server-side filtering
  • i18n: Update translation templates
  • Fix reference passing when yaml unmarshal
  • Limit new() calls
  • incusd/network/bridge: Fix children interface delete issue
  • doc/reference/instance: Clarify VM memory behavior
  • incus/admin/init: Allow passing a file to --preseed
  • incusd/network/ovn: Notify whole cluster on uplink changes
  • incus: Use a random image in first use message
  • incus-benchmark: Replace default distro
  • incus: Replace distro examples
  • i18n: Update translation templates
  • doc: Replace Ubuntu in documentation examples
  • doc/requirements: Refresh a bit
  • scriptlet: Return proper error
  • incusd/instance: Also consider local CPU flags
  • gomod: Update dependencies
  • incusd/instance/qemu: Cap maxmem to host mem maximum

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.12.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

Incus 6.0.4 LTS has been released

Apr 4, 2025

Introduction

The Incus team is pleased to announce the release of Incus 6.0.4!

This is the fourth bugfix release for Incus 6.0 which is supported until June 2029.

Changes

As usual this bugfix releases focus on stability and hardening.

Minor improvements have also been backported, specifically anything which does not require data migration, database changes or cause any unexpected change to user facing behavior.

The number of such improvements will decrease over time within the LTS branch.

Some of the highlights for this release are:

  • Instance network ACLs on bridge networks
  • Enhanced QEMU scriptlets
  • VM memory dumps
  • Extended OVN network state information
  • Extended server preseed file support
  • ACME DNS-01 support
  • API wide collection filtering
  • SMBIOS11 VM provisioning support
  • IOMMU support for VMs
  • VRF support for routed NICs
  • New MAC address range
  • USB NICs in VMs
  • USB disks in VMs
  • Configurable DNS servers in networks
  • Extra IPv4 routes through DHCP

The full list of commits is available below:

Detailed changelog
  • api: network_ovn_state_addresses
  • shared/api: Expand OVN state with uplink addresses
  • doc/rest-api: Refresh swagger YAML
  • internal/server: Add uplink addresses to ovn state
  • incus/network/info: Add uplink addresses for ovn network
  • incus: Add --description flag to create commands
  • tests: Add tests for --description flag on create commands
  • Add simple shell.nix
  • Encode mc alias for storage buckets to match allowed characters
  • doc: Contributing section restructuring
  • incusd/network/ovn: Allow creation of OVN network with no uplink
  • incusd/network/ovn: Handle missing logical router in state
  • lxd-to-incus: Clear volatile.uuid from instances
  • github: Bump most workflows to 24.04
  • github: Split testsuite to separate action
  • github: Add aarch64 tests
  • tests: Skip nftables test on old kernels
  • shared/util: Add IsNoneOrEmpty
  • incusd/network/bridge: Tweak dnsmasq startup condition
  • shared/cgo: Add finalize_userns
  • shared/cgo: Export in_same_namespace
  • incusd/main_forkproxy: Join all namespaces at once
  • incusd/main_forkfile: Join all namespaces at once
  • internal/linux: Add ClearBlock
  • incusd/storage: Switch to linux.ClearBlock
  • internal/linux/discard: Remove leftover debugging
  • internal/linux/discard: Use marker length for buffer
  • internal/linux/discard: Add support for offset
  • incusd/storage/generic: Pass offset to ClearBlock
  • incusd/storage/lvm: Discard the new blocks on resize
  • incusd/storage/lvm: Run ClearBlock on all new thick block volumes
  • cmd: support header line for csv output
  • cmd: update --format flag description
  • cmd: add validation for --format flag
  • doc: fix ref for vendor-data
  • devcontainer: initial version
  • Makefile: add target for unit tests as root
  • Makefile: add missing installations for gotags and openfga
  • incusd/network/ovn: Skip remote peers when iterating peer networks
  • incusd/storage/lvm: Move resize clearing to SetVolumeQuota
  • incusd/storage: Make use of qemu-img's target-is-zero option
  • incusd/device/disk: Remove virtfs-proxy-helper dependency
  • tests: Remove 9p proxy driver
  • incusd/instance: Split startupHook function
  • incusd/main_cluster: Tweak to have help refer to correct command name
  • incusd/instance: Pass an *api.Instance to the scriptlet program
  • incusd/scriptlet/qemu: Add instance parameter to the QEMU scriptlet
  • incusd/instance: Rewire QEMU config generation
  • incusd/instance: Make QEMU config types public
  • incusd/scriptlet/qemu: Fix Starlark function name
  • incusd/scriptlet/qemu: Prevent calling QMP functions at config stage
  • incusd/device/disk: Better handle partitions
  • Fixed link to point to correct manpage.
  • lxd-to-incus: Be more lenient on database changes
  • incusd/storage/drivers: Handle 4k sector sizes
  • incusd/dnsmasq: Don't put the project name in the DNS record
  • incusd/device/disk: disable 9p if idmap requested
  • incusd/scriptlet/qemu: Add QEMU configuration getters
  • incusd/scriptlet/qemu: Add QEMU configuration setters
  • api: qemu_scriptlet_config
  • doc/ref/instance_options: Update QEMU scriptlet documentation
  • incusd/instance: Update unit test
  • incusd/instance/drivers: Introduce ReloadDevice
  • api: network_bridge_acl_devices
  • incusd/device/nic: ACL support for bridge NIC device
  • incusd/server/firewall: ACL for bridge NIC device
  • doc/device/nic: Add ACL support to bridge NICs
  • doc/network_acl: Document usage with bridged NICs
  • tests: nftable test with ACL rules
  • github: Switch to Github's hosted arm64 runners
  • doc: typo
  • doc: Updated storage_zfs.md
  • incusd/device/disk: Update correct mount options
  • incus/file/pull: Port to SFTP
  • api: instance_debug_memory
  • incusd/instances/qemu: Add vmcoreinfo device
  • incusd/instances/qemu: Add dump-guset-memory implementation for instance memory debugging
  • incusd: Add GET /1.0/instances/NAME/debug/memory
  • doc/rest-api: Refresh swagger YAML
  • client: Add API implementation for instance memory debugging
  • incus: Add "debug dump-memory" command
  • doc: Force white background for swagger API
  • i18n: Update translation templates
  • gomod: Update dependencies
  • api: init_preseed_storage_volumes
  • client: Add storage volume initialization
  • shared/api: Add storage volume initialization
  • doc: Include storage initialization example
  • doc/rest-api: Refresh swagger YAML
  • tests: Include storage volume to init test
  • incusd/instance/qemu: Fix device_id warning on 9.2.x
  • incus: Fix example description for debug dump-memory command
  • incusd/instance/drivers/qmp: Handle missing log directory
  • cmd/incus-user: keep track of socket path used to connect to the server
  • cmd/incus-user: unify logging, support --verbose and --debug
  • api: init_preseed_profile_project
  • shared/api: Add project support to profiles in preseed init
  • client: Add project support to profiles in preseed init
  • doc/rest-api: Refresh swagger YAML
  • incus/admin/init: use api.InitProfileProjectPost
  • incusd/network/ovn: Fix bad route check
  • incus/file/pull: Ensure we have a leading / in all paths
  • github: Fix shellcheck
  • gomod: Update dependencies
  • doc/installing: mention incus group on NixOS
  • incus/file/pull: Read files in chunks
  • incus/file/pull: Actually make read buffer 1MiB
  • incusd/network/bridge: Fix deletion of tunnels and dummy devices
  • incusd/device/disk: Allow virtiofsd on non-x86
  • incusd/instance/drivers/qemu: Add IOMMU device
  • incus/file: Remove unused function
  • incus/network/info (ovn): Fix object not found.
  • incusd/instance/drivers: Improve NUMA balancing
  • incus/file: Move from path to filepath
  • github: Add linux-modules-extra (for vrf)
  • shared/archive: Added LZ4 support
  • api: instance_nic_routed_host_address
  • incus/server/ip: Add Master parameter for veth and tuntap
  • incus/server/ip: Add VRF parameter for IP Route
  • incus/server/device: Add vrf parameter for routed NIC devices
  • tests: Add test for routed NIC with VRF
  • doc: Add description for routed-nic VRF parameter
  • generate-database: Move into cmd package
  • generate-config: Move to cmd package
  • incus/storage/drivers: Fix issue with lvmcluster storage pool creation
  • generate-database: Rename from incus-generate
  • generate-config: Rename from incus-doc
  • github: Workaround permission problems
  • internal/instance: Move user config key doc string
  • internal/instance: Add environment config keys docstring
  • incusd/internal/server/instance: Add qemuEscapeCmdline
  • incusd/internal/server/instance: Use qemuEscapeCmdline
  • api: instance_smbios
  • internal/instance: Add smbios config keys
  • incusd/instance/drivers/qemu: Implement smbios config keys
  • doc: Update configs
  • incus: Fix instance copy error when using '--refresh' flag
  • doc/network_load_balancers: Fix backend add instructions
  • doc: Add frontend to wordlist
  • incusd/main_nsexec: Fix change_namespaces fallback to handle multiple namespaces
  • incusd/instance/utils: Only check uid/gid for containers
  • generate-database: Use types.Package
  • generate-database: Remove support for separate database package
  • generate-database: Separate Go package loading
  • incusd/instance/drivers: Check if disk is remote when migrating with an extra disk
  • incusd/instance/edk2: Look for bios.bin in /usr/share/seabios
  • generate-database: Add unified generate command
  • incusd/db: Use generate command
  • generate-database: Remove obsolete commands stmt and method
  • generate-database: Update README.md
  • generate-database: Reduce to single go:generate per package
  • incusd/db: Use Single generate per package
  • golangci: Update for new generate-database syntax
  • internal/cmd/table: Improve errors on modifiers
  • incusd: Add additional validation when joining a new cluster member
  • incusd: Upgrade flosch/pongo2 to v6
  • Makefile: Bump minimal Go to 1.23
  • doc: Bump minimum Go to 1.23
  • github: Re-order code tests tasks
  • incusd/resources: Prevent concurrent runs and cache data for 10s
  • incusd/backup: Implement compatibility with old backups
  • incusd/backup: Detect incompatible backup files
  • incusd: Ensure directories have 755 permissions in 'incus file push -p' command
  • tests: Fix test for verifying directory permissions
  • devcontainer: Update Go to 1.23
  • generate-database: Make "Code generated" comment Go conformant
  • db/cluster: Update code generated by generate-database
  • generate-database: Add internal tool disclaimer
  • generate-config: Formatting README.md
  • generate-config: Add internal tool disclaimer
  • incusd/storage/drivers: Truncate the block file during custom volume migration
  • incusd/instance/qemu: Don't attempt to hotplug over the virtual IOMMU
  • incusd/device/disk: Remove diskAddRootUserNSEntry
  • incusd/device/disk: Use virtiofsd uid/gid handling
  • generate-database: Add error mapping
  • incusd/db: Use error mapping
  • gomod: Update dependencies
  • incusd/db/cluster: Fix cluster group table
  • incusd/db: Update generated files
  • generate-database: Make self-sufficient
  • incusd/db: Update generated code
  • generate-database: Improve case handling
  • incus/list: Remove unused arguments and parameters
  • incus/top: Fix handling of all-projects
  • incusd/storage/drivers: Refactor ceph discovery
  • incusd/instance/drivers: Let QEMU handle Ceph itself
  • incus/file: Simplify sftpCreateFile
  • incus/file: Change recursiveFilePush to use SFTP
  • incus/file: Change recursiveMkdir to use SFTP
  • incus/file: Change recursivePullFile to use SFTP
  • incus/file: Re-use SFTP as much as possible
  • internal/filter: Handle multiple in-line structs
  • api: api_filtering_extended
  • incusd: Add filtering to /1.0/networks
  • incusd: Add filtering to /1.0/networks/{networkName}/forwards
  • incusd: Add filtering to /1.0/networks/{networkName}/load-balancers
  • incusd: Add filtering to /1.0/networks/{networkName}/peers
  • incusd: Add filtering to /1.0/network-acls
  • incusd: Add filtering to /1.0/network-integrations
  • incusd: Add filtering to /1.0/network-zones
  • incusd: Add filtering to /1.0/network-zones/{zone}/records
  • incusd: Add filtering to /1.0/storage-pools
  • incusd: Add filtering to /1.0/storage-pools/{poolName}/buckets
  • incusd: Add filtering to /1.0/certificates
  • incusd: Add filtering to /1.0/profiles
  • incusd: Add filtering to /1.0/projects
  • doc/rest-api: Refresh swagger YAML
  • tests: Test more API filters
  • doc: Remove mention of limitations on filtering
  • api: acme_dns01
  • incusd/cluster/config: Add extra ACME config keys
  • incusd/acme: Add DNS-01 support
  • doc: Add resolvers to wordlist
  • doc: Update configs
  • incusd/network/bridge: Fix deletion of tunnels and dummy devices
  • incusd/device/disk: Include cluster name and config path in RBD string
  • incusd/instance/qemu: Provide the RBD keyring to QEMU
  • api: security_iommu
  • internal/instance: Add security.iommu
  • doc: Update configs
  • incusd/instance/qemu: Simplify Windows detection
  • incusd/instance/qemu: Implement security.iommu
  • incusd/instance/qemu: Add IOMMU for Windows
  • incusd/instance/qemu: Configure irqchip for split mode with IOMMU
  • doc: Add passthrough and IOMMU to wordlist
  • incusd/storage/ceph: Re-introduce keyring parsing
  • doc: Clarify virtiofsd requirements
  • incusd/migration: Change field type of Snapshots in VolumeTargetArgs
  • incusd: Adjust code for VolumeTargetArgs Snapshots type change
  • incusd/instance/drivers: Adjust code for VolumeTargetArgs Snapshots type change
  • incusd/storage: Adjust code for VolumeTargetArgs Snapshots type change
  • incusd/db: Add missing go:generate directive
  • incusd/db: Update generated code
  • incusd/device/disk: Do not allow mounting of custom block volume snapshots
  • generate-database: Abstract DB connection / DB transaction
  • incusd/db: Update generated code
  • lint: Add short import exception for *.mapper.go
  • generate-database: Accept interface instead of concrete type for PrepareStmts
  • incusd/db: Update generated code
  • cmd/list: Simplify evaluateShorthandFilter by reducing nesting levels
  • incusd/storage: Don't use sparse writer on thick LVM
  • shared/util: Add IsTruthy
  • generate-database: Validate struct tags
  • generate-database: Add marshal=json
  • generate-database: Update generated code
  • incusd/instance/edk2: Fix typo in function name
  • incusd/instance/edk2: Fix EDK2 path overwrite issue
  • incusd/instance/qemu: Propagate errors from edk2
  • incusd/instance_types: Introduce INCUS_SKIP_INSTANCE_TYPES
  • doc/environment: Add INCUS_SKIP_INSTANCE_TYPES
  • doc/environment: Sort the environment variables
  • incusd/ip: Error message styling
  • incusd/ip: Only parse MAC on ethernet links
  • internal/instance: Clarify security.secureboot setting
  • doc: Update configs
  • incusd/network/ovn: Fallback to OVN router address as DNS server
  • api: network_ipv4_dhcp_routes
  • shared/validate: Add IsDHCPRouteList
  • incusd/network/ovn: Add ipv4.dhcp.routes
  • incusd/network/bridge: Add ipv4.dhcp.routes
  • tests: Add tests for ipv4.dhcp.routes
  • doc: Add documentation for ipv4.dhcp.routes config
  • github: Pass shell type to shellcheck
  • generate-database: Handle constraint err in Create
  • incusd/db: Update generated code
  • generate-database: Check for tx if necessary
  • incusd/db: Update generated code
  • cmd/incus: Use the file extension of the edited file for the temp file, to help with syntax highlighting
  • incusd/api_internal: Centralize all internal API endpoints
  • tests: Update for re-organized internal endpoints
  • incus/drivers: Fix ZFS CreateVolume deletes pre-existing data on failure
  • incus/rebuild: Correct help message
  • incusd/cluster/config: Set default value for acme.ca_url
  • incusd/cluster/config: Return acme.provider.environment as a slice
  • incusd/acme: Remove DNS-01 provider (now using lego externally)
  • incusd/acme: Move DNS-01 to external lego binary
  • incusd/api_1_0: Trigger ACME on all ACME config options
  • incus/file: Always use 1MB chunks for SFTP
  • incusd/instance/lxc: Fail immediately if no idmap found
  • incusd/acme: use correct path
  • incusd/bgp: Rework start/stop logic
  • incusd/network/ovn: Skip existing static routes
  • incusd/instance/qemu: Set caching-mode with intel-iommu
  • incus-agent: Improve SFTP performance
  • incusd/instance/qemu: Move Windows check to a function
  • incusd/instance/qemu: Set RTC base to localtime on Windows
  • doc/api-extensions: Fix formatting
  • api: network_state_ovn_ls
  • incusd/network/ovn: Export LogicalRouter and LogicalSwitch names as needed
  • shared/api: Add LogicalSwitch to OVN state
  • incus/network: Add Logical Switch for OVN
  • incus/network: Better handle partial OVN state
  • doc/rest-api: Refresh swagger YAML
  • incus/network: Support for missing counters
  • shared/api: Make NetworkStateCounters a pointer
  • incusd/resources: Update for Counters being a pointer
  • incus/copy: Clear full device when overriding with type=none
  • doc/instance/create: Cover behavior on Windows
  • api: network_dns_nameservers
  • incusd/network/bridge: Add dns.nameservers
  • incusd/network/ovn: Add dns.nameservers
  • doc/network: Add dns.nameservers to bridge and OVN
  • incusd/network/ovn: Correctly remove individual DHCP options from OVN when they are unset
  • incusd/ports: Cleanup consts
  • api: acme_http01_port
  • incusd/cluster/config: Add acme.http.port
  • doc/rest-api: Refresh swagger YAML
  • incusd/acme: Use lego for HTTP-01
  • gomod: Update dependencies
  • i18n: Update translation templates
  • incusd/db: Add missing error mapper
  • incusd/instance/qmp: Add MachineDefinition function
  • internal/instance: Add volatile.vm.definition
  • doc: Update configs
  • incusd/instance/qemu: Use saved machine definition when restoring running VM
  • incusd/instance/qemu: Handle firmware vars name matching internal one
  • incusd: Switch MAC generation to Zabbly prefix
  • incusd: Switch to new MAC prefix
  • doc: Switch to new MAC prefix
  • incus: Switch to new MAC prefix
  • lxc-to-incus: Switch to new MAC prefix
  • shared/api: Switch to new MAC prefix
  • tests: Switch to new MAC prefix
  • doc/rest-api: Refresh swagger YAML
  • client: Fix spelling errors found by codespell
  • incusd/instance/edk2: Select SecureBoot capable firmware on Debian
  • api: network_ovn_ipv4_dhcp_expiry
  • incusd/network/ovn: Add option ipv4.dhcp.expiry for OVN networks
  • doc/reference/network_ovn: Add ipv4.dhcp.expiry
  • incusd/dns: Use shared mutex
  • incusd/network/ovn: Add UpdateLogicalSwitchPortDHCP
  • incusd/network/ovn: Reconfigure DHCP option on existing logical switch ports when DHCP is enabled on the network
  • generate-config: Fix gofumpt
  • lxd-to-incus: Fix gofumpt
  • incus-agent: Fix gofumpt
  • incus-benchmark: Fix gofumpt
  • incus-migrate: Fix gofumpt
  • incus-simplestreams: Fix gofumpt
  • incus-user: Fix gofumpt
  • lxc-to-incus: Fix gofumpt
  • incus: Fix gofumpt
  • shared/tls: Fix gofumpt
  • shared/termios: Fix gofumpt
  • shared/subprocess: Fix gofumpt
  • shared/simplestreams: Fix gofumpt
  • shared/logger: Fix gofumpt
  • shared/idmap: Fix gofumpt
  • shared/cliconfig: Fix gofumpt
  • internal/version: Fix gofumpt
  • internal/util: Fix gofumpt
  • internal/usbid: Fix gofumpt
  • internal/rsync: Fix gofumpt
  • internal/linux: Fix gofumpt
  • internal/io: Fix gofumpt
  • incusd/storage: Fix gofumpt
  • incusd/network: Fix gofumpt
  • incusd/apparmor: Fix gofumpt
  • incusd/backup: Fix gofumpt
  • incusd/cgroup: Fix gofumpt
  • incusd/cluster: Fix gofumpt
  • incusd/config: Fix gofumpt
  • incusd/db: Fix gofumpt
  • incusd/device: Fix gofumpt
  • incusd/dnsmasq: Fix gofumpt
  • incusd/endpoints: Fix gofumpt
  • incusd/events: Fix gofumpt
  • incusd/firewall: Fix gofumpt
  • incusd/ip: Fix gofumpt
  • incusd/metrics: Fix gofumpt
  • incusd/operations: Fix gofumpt
  • incusd/resources: Fix gofumpt
  • incusd/scriptlet: Fix gofumpt
  • incusd/seccomp: Fix gofumpt
  • incusd/sys: Fix gofumpt
  • incusd/util: Fix gofumpt
  • Makefile: Switch to gofumpt
  • golangci: Switch to gofumpt
  • generate-config: Use RunE
  • internal/linux: Fix missing export comments
  • incusd/seccomp: Fix import shadowing
  • incusd/cluster: Remove duplicate type declaration
  • incusd/bgp: Fix comment
  • incusd/network/ovn: Don't run bgpSetup twice
  • incusd/network/physical: Do full start following change of parent
  • incusd/apparmor: Move AppArmor profiles to separate files
  • doc: Fix spelling errors found by codespell
  • shared: Fix spelling errors found by codespell
  • tests: Fix spelling errors found by codespell
  • lint: Run codespell automatically
  • incusd/instance/common: Check PID validity
  • client: Fix gofumpt
  • incusd: Fix gofumpt
  • incusd/instance: Fix gofumpt
  • cmd: Fix spelling errors found by codespell
  • internal: Fix spelling errors found by codespell
  • incus/file: Properly handle relative source paths
  • cmd/storage: Typo 'Examples:' create storage
  • incusd/events: Don't open needless transactions
  • incusd/instances: Re-order evacuated check to limit DB calls
  • incusd: Limit calls to LocalNodeIsEvacuated
  • incusd/instances_post: Move non-DB logic outside of transaction
  • incusd/network/ovn: Fix default DNS IPv4 server
  • shared/osarch: Extend OS detection logic
  • incus-agent: Update for osarch change
  • incusd: Update for osarch change
  • internal/version: Update UserAgent logic for osarch change
  • api: instance_state_cpu_time
  • shared/api: Add AllocatedTime CPU field
  • incusd/cgroup: Add GetCPUCfsLimit
  • incusd/instance/lxc: Add AllocatedTime CPU field
  • incusd/instance/qemu: Add AllocatedTime CPU field
  • doc/rest-api: Refresh swagger YAML
  • test: Check CPU allocated time
  • incusd/certificates: Properly handle bad PEM data
  • cmd/generate-database/lex: Fix pluralization
  • cmd/generate-database/db: Consider marshal tagged fields as columns
  • cmd/generate-database/db: Support multi-package parsing
  • cmd/generate-database/db: Import entities from non-local packages
  • cmd/generate-database/db: Add GetNames
  • cmd/generate-database: Update docs
  • cmd/generate-database/file/boilerplate: Use tx for multi-queries
  • internal/server/db/cluster: Update generated code
  • cmd/generate-database/db: Fix generator tests
  • incusd/network/common: Handle missing BGP peer
  • incusd/cluster/evacuate: Don't live-migrate stopped instances
  • cmd/generate-database/db: Directly pass reference table and column names
  • internal/server/db/cluster: Specify table name on method declarations
  • internal/server/db/cluster: Update generated code
  • cmd/incusd: Update calls to generated code
  • cmd/generate-database/db: Make linter happy (defer loops)
  • api: network_io_bus
  • incusd/device/config: Add USB bus override
  • incusd/instance: Add support for USB NICs
  • incusd/device/nic: Add support for io.bus
  • incusd/storage/s3 Fixed minio client mc too ambious issue
  • doc/device/nic: Add support for io.bus
  • incusd/instance/qemu enable s4 by default
  • doc/instance_options: Updates raw.qemu.conf example
  • incusd/networks: Validate configuration on join too
  • Makefile: Bump base Go 1.23 version
  • gomod: Update dependencies
  • cmd/generate-database/db: Fix GetNames spacing
  • github: Rework issue templates
  • internal/server/storage/s3: Add minio-client to list of potential binary names
  • doc: Update Debian installation documentation
  • internal/server/storage/s3: Update logic for checking MinIO version from multiple possible binary names
  • incusd/auth: Tweak SQL queries
  • incusd/auth: Properly handle network integrations
  • incusd/db/cluster/entities: Sort maps
  • doc/network-integration: Document properties
  • api: disk_io_bus_usb
  • incusd/device/disk: Add support for USB bus
  • incusd/instance/qemu: Add support for USB disks
  • doc: Update configs
  • golangci: Upgrade to version 2
  • incusd/storage/s3 minio client check enhancement
  • golangci: Disable STI005 error checks
  • test: Fix deprecated chown syntax
  • test: Fix test cleanup
  • shared/validate: Add string length validator
  • shared/validate: Add minimum duration validator
  • incusd/sys: Add Hostname to OS struct
  • incusd/instance/drivers: Populate StorageMove and StoragePool when migrating lxc instances
  • incusd/storage: Populate StorageMove and StoragePool when migrating volumes
  • incusd/storage: Add more parameters to MigrationTypes
  • incusd/network/ovn: Remove internal routes to forward/load-balancers
  • doc/ref/storage_ceph: Fix typo
  • tests: Tweak volume sizes
  • tests: Be more specific on selecting property
  • incusd/instance/edk2: Always prefer the EDK2 override
  • doc/support: Update feature release version
  • incusd/instance: Don't enforce device/config validation on snapshots
  • i18n: Update translation templates
  • incus: Replace interface{} by any
  • internal/server/ip: Replace interface{} by any
  • shared/logger: Replace interface{} by any
  • client: Capture original OCI image identifier
  • fix: Don't attempt to download signatures for oci
  • client/oci: Add errors for missing umoci
  • client: Add proxy host to skopoe calls
  • client/oci: Add errors for missing skopeo
  • client: Use strings.ReplaceAll
  • lxd-to-incus: Use strings.ReplaceAll
  • generate-database: Use strings.ReplaceAll
  • incusd/db/cluster: Update generated code
  • incus: Use strings.ReplaceAll
  • internal/linux: Use strings.ReplaceAll
  • incusd/apparmor: Use strings.ReplaceAll
  • incusd/auth: Use strings.ReplaceAll
  • incusd/db/cluster: Use strings.ReplaceAll
  • incusd/db: Use strings.ReplaceAll
  • incusd/device: Use strings.ReplaceAll
  • incusd/instance: Use strings.ReplaceAll
  • incusd/ip: Use strings.ReplaceAll
  • incusd/network: Use strings.ReplaceAll
  • incusd/storage: Use strings.ReplaceAll
  • incus/utils: Check type assertion
  • incusd/instance: Remove needless embedded fields
  • incusd/storage/s3: Simplify variable declaration
  • incusd: Fix missing line breaks
  • README: Fix typo
  • lxd-to-incus: Fix typo in trigger
  • incusd/instance/edk2: Limit test to UEFI architectures
  • doc/devices/disk: Fix restriction on path option
  • doc: Update configs
  • doc: Tweak ACME documentation
  • incusd/instances/qemu: Handle deprecation of runas
  • incusd/instance/lxc: Pass limited environment to forkstart
  • incusd/instance/qemu: Avoid unnecessary snapshot loading
  • incusd/migrate: Bump timeouts to 30s
  • incusd/storage: Add missing forwarding on snapshot list
  • client: Pass ETag in UpdateWarning
  • client: Pass ETag in UpdateCluster
  • client/oci: Only replace the first match
  • incusd/instance/common: Fix concurrent restarts
  • generate-database: Fix documentation for ignore
  • incus: Remove unused functions

Note for packagers: Incus now relies on the external lego command for its ACME support rather than pulling in all of that logic into the incusd binary itself. Make sure to have Incus depend on lego if you want to maintain support for ACME certificate issuance.

Support and upgrade

The Incus 6.0 branch is supported until June 2029. It's always strongly recommended to keep up and run the latest LTS bugfix release.

Downloads

Thanks

This LTS release update was made possible thanks to funding provided by the Sovereign Tech Fund (now part of the Sovereign Tech Agency).

ST-Fund-Logo-Default-White-RGB|690x219

[quote]
The Sovereign Tech Fund supports the development, improvement, and maintenance of open digital infrastructure. Its goal is to sustainably strengthen the open source ecosystem, focusing on security, resilience, technological diversity, and the people behind the code.
[/quote]

Find out more at: https://www.sovereign.tech

Incus 6.11 has been released

Mar 28, 2025

Introduction

The Incus team is pleased to announce the release of Incus 6.11!

Without a doubt, the headline feature for this release is initial support for Linstor as a new storage driver for those looking for an alternative to Ceph!
But that's far from all that this Incus release brings to the table. It also comes with a lot of new VM, OCI and networking features!

image|690x251

As usual, you can try it for yourself online: https://linuxcontainers.org/incus/try-it/

Enjoy!

New features

Linstor storage driver

Incus now supports Linstor as an alternative to Ceph for clustered storage.
You can read more about Linstor itself on their website: https://linbit.com/linstor/

In short, Linstor is a managed layer on top of Linux's DRBD mechanism which is used for block device replication between multiple servers.

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/

New MAC address range

Both LXC and Incus have been using the 00:16:3e MAC address range.

This range comes from the Xen project allocation and while there's no risk of clashing with a real physical device MAC, it's had the downside of not allowing for easy distinguishing between LXC/Incus instances and those running on Xen.

To make things cleaner moving forward, Zabbly has acquired a dedicated address MAC range from IEEE specifically for use by LXC and Incus, 10:66:6a.

The new range will automatically be used for all new instances and networks.
Existing instances and networks remain unchanged.

USB NICs in VMs

A new io.bus configuration key has been added to network interfaces in VMs.
This supports two values, virtio (default) and usb.

When setting io.bus=usb, the network interface will show up as a generic USB network adapter rather than the usual PCI device.

This should help with getting some older guest OS get networking as well as help newer ones get online to fetch the virtio drivers before switching the NIC back to its default virtio bus.

Documentation: https://linuxcontainers.org/incus/docs/main/reference/devices_nic/

USB disks in VMs

It's also now possible to attach disks to VMs through the USB bus.
When doing that, those disks show up as generic USB mass storage devices.

This is done by setting io.bus=usb on the disk device.

Documentation: https://linuxcontainers.org/incus/docs/main/reference/devices_disk/

Tracking of VM machine definition

Incus now tracks what the exact QEMU machine definition is during startup, allowing for live-migration between QEMU versions so long as the target is on the same QEMU release or newer.

This is done through a new volatile.vm.definition configuration key.

Configurable OCI entrypoint

It's now possible to configure the entry point for OCI containers.

On container creation, the entry point data is extracted from the OCI configuration and turned into editable configuration on the container.

This is done through four new configuration options:

  • oci.entrypoint
  • oci.cwd
  • oci.uid
  • oci.gid

Those can be overriden during instance creation or changed at will afterwards.

stgraber@castiana:~$ incus launch oci-docker:nginx nginx
Launching nginx
stgraber@castiana:~$ incus config show nginx | grep oci\\.
  oci.cwd: /
  oci.entrypoint: /docker-entrypoint.sh nginx -g 'daemon off;'
  oci.gid: "0"
  oci.uid: "0"

Documentation: https://linuxcontainers.org/incus/docs/main/reference/instance_options/

Unprivileged ICMP (ping) in OCI containers

OCI containers are now able to send ICMP packets as regular users.
This is allowed as application containers are designed to run a single application and so don't really benefit from having this be restricted to the root user.

Unprivileged low ports in OCI containers

OCI containers are now able to bind low ports as regular users.
This is allowed as application containers are designed to run a single application and so don't really benefit from having this be restricted to the root user.

Allocated CPU time in instance state API

A new allocated_time value is exposed as part of the CPU instance state information.
It's used is to report how much CPU time (in nanoseconds) could be consumed per second, should the container be using as much as it's allowed.

This effectively allows calculating a percentage of CPU usage for a container when combined with multiple CPU usage datapoints over a known period of time.

stgraber@castiana:~$ incus query /1.0/instances/nginx/state | jq .cpu
{
  "allocated_time": 1000000000,
  "usage": 163062000
}

Configurable DNS servers

A new dns.nameservers configuration option is now available on both bridge and ovn networks. It takes a comma separated list of DNS servers to use rather than the default one.

This can be useful when running a dedicated set of DNS resolvers that should be used directly by all instances, or for environments where you want specific networks to bypass all local resolving and go to public resolvers instead.

Documentation (bridge): https://linuxcontainers.org/incus/docs/main/reference/network_bridge/
Documentation (OVN): https://linuxcontainers.org/incus/docs/main/reference/network_ovn/

Extra IPv4 routes through DHCP

A new ipv4.dhcp.routes configuration option is now available on both bridge and ovn networks. It allows advertising additional routes through DHCP.

Documentation (bridge): https://linuxcontainers.org/incus/docs/main/reference/network_bridge/
Documentation (OVN): https://linuxcontainers.org/incus/docs/main/reference/network_ovn/

Configurable IPv4 DHCP lease expiry on OVN

The ipv4.dhcp.expiry configuration option is now available to OVN networks too.
This allows reducing or extending the default DHCP lease duration.

Documentation: https://linuxcontainers.org/incus/docs/main/reference/network_ovn/

OVN logical switch name now part of network state

The OVN logical switch name is now reported as part of the OVN network information.
This can make debugging a fair bit easier, especially for networks that are isolated (no uplinks) and so may be lacking a logical router.

root@server01:~# incus network info default
Name: default
MAC address: 00:16:3e:54:62:a9
MTU: 1500
State: up
Type: broadcast

IP addresses:
  inet  10.104.61.1/24 (link)
  inet6 fd42:73ae:9013:c530::1/64 (link)

OVN:
  Chassis: server01
  Logical router: incus-net20-lr
  Logical switch: incus-net20-ls-int
  IPv4 uplink address: 172.31.254.10
  IPv6 uplink address: fd00:1e4d:637d:1234:216:3eff:fe54:62a9

Notice for packagers

With this release Incus now uses the lego tool externally for ACME handling.
This is to significantly reduce the size of the Incus binary itself, but means that lego should be added as a dependency.

Complete changelog

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

Full commit list
  • doc: Clarify virtiofsd requirements
  • incusd/instance/lxc: Allow unprivileged users to use ping in application containers
  • incusd/instance/lxc: Allow unprivileged users in application containers to bind to all ports
  • incusd/migration: Change field type of Snapshots in VolumeTargetArgs
  • incusd: Adjust code for VolumeTargetArgs Snapshots type change
  • incusd/instance/drivers: Adjust code for VolumeTargetArgs Snapshots type change
  • incusd/storage: Adjust code for VolumeTargetArgs Snapshots type change
  • incusd/db: Add missing go:generate directive
  • incusd/db: Update generated code
  • incusd/device/disk: Do not allow mounting of custom block volume snapshots
  • generate-database: Abstract DB connection / DB transaction
  • incusd/db: Update generated code
  • lint: Add short import exception for *.mapper.go
  • generate-database: Accept interface instead of concrete type for PrepareStmts
  • incusd/db: Update generated code
  • cmd/list: Simplify evaluateShorthandFilter by reducing nesting levels
  • incusd/storage: Don't use sparse writer on thick LVM
  • shared/util: Add IsTruthy
  • generate-database: Validate struct tags
  • generate-database: Add marshal=json
  • generate-database: Update generated code
  • incusd/instance/edk2: Fix typo in function name
  • incusd/instance/edk2: Fix EDK2 path overwrite issue
  • incusd/instance/qemu: Propagate errors from edk2
  • incusd/instance_types: Introduce INCUS_SKIP_INSTANCE_TYPES
  • doc/environment: Add INCUS_SKIP_INSTANCE_TYPES
  • doc/environment: Sort the environment variables
  • incusd/ip: Error message styling
  • incusd/ip: Only parse MAC on ethernet links
  • internal/instance: Clarify security.secureboot setting
  • doc: Update configs
  • incusd/network/ovn: Fallback to OVN router address as DNS server
  • api: network_ipv4_dhcp_routes
  • shared/validate: Add IsDHCPRouteList
  • incusd/network/ovn: Add ipv4.dhcp.routes
  • incusd/network/bridge: Add ipv4.dhcp.routes
  • cmd/incusd/forknet: Add classless static route support to the forknet dhcp client
  • tests: Add tests for ipv4.dhcp.routes
  • doc: Add documentation for ipv4.dhcp.routes config
  • github: Pass shell type to shellcheck
  • incusd/instance: Revert on OCI creation failure
  • generate-database: Handle constraint err in Create
  • incusd/db: Update generated code
  • generate-database: Check for tx if necessary
  • incusd/db: Update generated code
  • cmd/incus: Use the file extension of the edited file for the temp file, to help with syntax highlighting
  • incusd/api_internal: Centralize all internal API endpoints
  • tests: Update for re-organized internal endpoints
  • incus/drivers: Fix ZFS CreateVolume deletes pre-existing data on failure
  • incus/rebuild: Correct help message
  • i18n: Update translation templates
  • incusd/cluster/config: Set default value for acme.ca_url
  • incusd/cluster/config: Return acme.provider.environment as a slice
  • incusd/acme: Remove DNS-01 provider (now using lego externally)
  • incusd/acme: Move DNS-01 to external lego binary
  • incusd/api_1_0: Trigger ACME on all ACME config options
  • gomod: Update dependencies
  • incus/file: Always use 1MB chunks for SFTP
  • incusd/instance/lxc: Fail immediately if no idmap found
  • incusd/acme: use correct path
  • incusd/bgp: Rework start/stop logic
  • incusd/network/ovn: Skip existing static routes
  • incusd/instance/qemu: Set caching-mode with intel-iommu
  • incus-agent: Improve SFTP performance
  • incusd/instance/qemu: Move Windows check to a function
  • incusd/instance/qemu: Set RTC base to localtime on Windows
  • doc/api-extensions: Fix formatting
  • api: network_state_ovn_ls
  • incusd/network/ovn: Export LogicalRouter and LogicalSwitch names as needed
  • shared/api: Add LogicalSwitch to OVN state
  • incus/network: Add Logical Switch for OVN
  • i18n: Update translation templates
  • incus/network: Better handle partial OVN state
  • doc/rest-api: Refresh swagger YAML
  • incus/network: Support for missing counters
  • shared/api: Make NetworkStateCounters a pointer
  • incusd/resources: Update for Counters being a pointer
  • incus/copy: Clear full device when overriding with type=none
  • doc/instance/create: Cover behavior on Windows
  • api: network_dns_nameservers
  • incusd/network/bridge: Add dns.nameservers
  • incusd/network/ovn: Add dns.nameservers
  • doc/network: Add dns.nameservers to bridge and OVN
  • incusd/network/ovn: Correctly remove individual DHCP options from OVN when they are unset
  • incusd/ports: Cleanup consts
  • api: acme_http01_port
  • incusd/cluster/config: Add acme.http.port
  • doc/rest-api: Refresh swagger YAML
  • incusd/acme: Use lego for HTTP-01
  • gomod: Update dependencies
  • incusd/instance/qmp: Add MachineDefinition function
  • internal/instance: Add volatile.vm.definition
  • doc: Update configs
  • incusd/instance/qemu: Use saved machine definition when restoring running VM
  • incusd/instance/qemu: Handle firmware vars name matching internal one
  • incusd: Switch MAC generation to Zabbly prefix
  • incusd: Switch to new MAC prefix
  • doc: Switch to new MAC prefix
  • incus: Switch to new MAC prefix
  • lxc-to-incus: Switch to new MAC prefix
  • shared/api: Switch to new MAC prefix
  • tests: Switch to new MAC prefix
  • doc/rest-api: Refresh swagger YAML
  • i18n: Update translation templates
  • client: Fix spelling errors found by codespell
  • incusd/instance/edk2: Select SecureBoot capable firmware on Debian
  • api: network_ovn_ipv4_dhcp_expiry
  • incusd/network/ovn: Add option ipv4.dhcp.expiry for OVN networks
  • doc/reference/network_ovn: Add ipv4.dhcp.expiry
  • incusd/main_forknet: Remove unreachable code
  • incusd/dns: Use shared mutex
  • incusd/network/ovn: Add UpdateLogicalSwitchPortDHCP
  • incusd/network/ovn: Reconfigure DHCP option on existing logical switch ports when DHCP is enabled on the network
  • client: Fix gofumpt
  • generate-config: Fix gofumpt
  • lxd-to-incus: Fix gofumpt
  • incus-agent: Fix gofumpt
  • incus-benchmark: Fix gofumpt
  • incus-migrate: Fix gofumpt
  • incus-simplestreams: Fix gofumpt
  • incus-user: Fix gofumpt
  • lxc-to-incus: Fix gofumpt
  • incus: Fix gofumpt
  • incusd: Fix gofumpt
  • shared/tls: Fix gofumpt
  • shared/termios: Fix gofumpt
  • shared/subprocess: Fix gofumpt
  • shared/simplestreams: Fix gofumpt
  • shared/logger: Fix gofumpt
  • shared/idmap: Fix gofumpt
  • shared/cliconfig: Fix gofumpt
  • internal/version: Fix gofumpt
  • internal/util: Fix gofumpt
  • internal/usbid: Fix gofumpt
  • internal/rsync: Fix gofumpt
  • internal/linux: Fix gofumpt
  • internal/io: Fix gofumpt
  • incusd/storage: Fix gofumpt
  • incusd/network: Fix gofumpt
  • incusd/instance: Fix gofumpt
  • incusd/apparmor: Fix gofumpt
  • incusd/backup: Fix gofumpt
  • incusd/cgroup: Fix gofumpt
  • incusd/cluster: Fix gofumpt
  • incusd/config: Fix gofumpt
  • incusd/db: Fix gofumpt
  • incusd/device: Fix gofumpt
  • incusd/dnsmasq: Fix gofumpt
  • incusd/endpoints: Fix gofumpt
  • incusd/events: Fix gofumpt
  • incusd/firewall: Fix gofumpt
  • incusd/ip: Fix gofumpt
  • incusd/metrics: Fix gofumpt
  • incusd/operations: Fix gofumpt
  • incusd/resources: Fix gofumpt
  • incusd/scriptlet: Fix gofumpt
  • incusd/seccomp: Fix gofumpt
  • incusd/sys: Fix gofumpt
  • incusd/util: Fix gofumpt
  • Makefile: Switch to gofumpt
  • golangci: Switch to gofumpt
  • generate-config: Use RunE
  • internal/linux: Fix missing export comments
  • incusd/seccomp: Fix import shadowing
  • incusd/cluster: Remove duplicate type declaration
  • incusd/bgp: Fix comment
  • incusd/network/ovn: Don't run bgpSetup twice
  • incusd/network/physical: Do full start following change of parent
  • incusd/apparmor: Move AppArmor profiles to separate files
  • cmd: Fix spelling errors found by codespell
  • doc: Fix spelling errors found by codespell
  • internal: Fix spelling errors found by codespell
  • shared: Fix spelling errors found by codespell
  • tests: Fix spelling errors found by codespell
  • lint: Run codespell automatically
  • i18n: Update translation templates
  • incusd/instance/common: Check PID validity
  • incus/file: Properly handle relative source paths
  • cmd/storage: Typo 'Examples:' create storage
  • i18n: Update translation templates
  • incusd/events: Don't open needless transactions
  • incusd/instances: Re-order evacuated check to limit DB calls
  • incusd: Limit calls to LocalNodeIsEvacuated
  • incusd/instances_post: Move non-DB logic outside of transaction
  • incusd/network/ovn: Fix default DNS IPv4 server
  • shared/osarch: Extend OS detection logic
  • incus-agent: Update for osarch change
  • incusd: Update for osarch change
  • internal/version: Update UserAgent logic for osarch change
  • api: instance_state_cpu_time
  • shared/api: Add AllocatedTime CPU field
  • incusd/cgroup: Add GetCPUCfsLimit
  • incusd/instance/lxc: Add AllocatedTime CPU field
  • incusd/instance/qemu: Add AllocatedTime CPU field
  • doc/rest-api: Refresh swagger YAML
  • test: Check CPU allocated time
  • incusd/certificates: Properly handle bad PEM data
  • cmd/generate-database/lex: Fix pluralization
  • cmd/generate-database/db: Consider marshal tagged fields as columns
  • cmd/generate-database/db: Support multi-package parsing
  • cmd/generate-database/db: Import entities from non-local packages
  • cmd/generate-database/db: Add GetNames
  • cmd/generate-database: Update docs
  • cmd/generate-database/file/boilerplate: Use tx for multi-queries
  • internal/server/db/cluster: Update generated code
  • cmd/generate-database/db: Fix generator tests
  • incusd/network/common: Handle missing BGP peer
  • incusd/cluster/evacuate: Don't live-migrate stopped instances
  • cmd/generate-database/db: Directly pass reference table and column names
  • internal/server/db/cluster: Specify table name on method declarations
  • internal/server/db/cluster: Update generated code
  • cmd/incusd: Update calls to generated code
  • cmd/generate-database/db: Make linter happy (defer loops)
  • api: network_io_bus
  • incusd/device/config: Add USB bus override
  • incusd/instance: Add support for USB NICs
  • incusd/device/nic: Add support for io.bus
  • incusd/storage/s3 Fixed minio client mc too ambious issue
  • doc/device/nic: Add support for io.bus
  • incusd/instance/qemu enable s4 by default
  • doc/instance_options: Updates raw.qemu.conf example
  • incusd/networks: Validate configuration on join too
  • Makefile: Bump base Go 1.23 version
  • gomod: Update dependencies
  • cmd/generate-database/db: Fix GetNames spacing
  • github: Rework issue templates
  • internal/server/storage/s3: Add minio-client to list of potential binary names
  • doc: Update Debian installation documentation
  • internal/server/storage/s3: Update logic for checking MinIO version from multiple possible binary names
  • incusd/auth: Tweak SQL queries
  • incusd/auth: Properly handle network integrations
  • incusd/db/cluster/entities: Sort maps
  • doc/network-integration: Document properties
  • incusd/instance/lxc: Cleanup OCI mount paths
  • api: disk_io_bus_usb
  • incusd/device/disk: Add support for USB bus
  • incusd/instance/qemu: Add support for USB disks
  • doc: Update configs
  • golangci: Upgrade to version 2
  • incusd/storage/s3 minio client check enhancement
  • golangci: Disable STI005 error checks
  • test: Fix deprecated chown syntax
  • test: Fix test cleanup
  • shared/validate: Add string length validator
  • shared/validate: Add minimum duration validator
  • incusd/sys: Add Hostname to OS struct
  • incusd/instance/drivers: Populate StorageMove and StoragePool when migrating lxc instances
  • incusd/storage: Populate StorageMove and StoragePool when migrating volumes
  • incusd/storage: Add more parameters to MigrationTypes
  • incusd/network/ovn: Remove internal routes to forward/load-balancers
  • doc/ref/storage_ceph: Fix typo
  • tests: Tweak volume sizes
  • tests: Be more specific on selecting property
  • incusd/instance/edk2: Always prefer the EDK2 override
  • api: storage_driver_linstor
  • doc: Linstor driver documentation
  • incusd/cluster/config: Add cluster-level LINSTOR config options
  • incusd/node/config: Add node-level LINSTOR config options
  • incusd/migration: Add linstor to migration protobuf
  • incusd/storage/linstor: Linstor client setup
  • incusd/storage/linstor: Wrap golinstor logger
  • incusd/state: Add Linstor client to server state
  • incusd: Trigger Linstor client setup on server config changes
  • incusd/storage/linstor: Storage pool creation and deletion
  • incusd/storage/linstor: Volume creation and deletion
  • incusd/storage: Implement the Filler function for Linstor volumes
  • incusd/storage/linstor: Add mount and unmount support for volumes
  • incusd/storage/linstor: Add trivial renaming support for volumes
  • incusd/storage/linstor: Remove filesystem volume and mount path
  • incusd/storage/linstor: Add common volume config validation
  • incusd/storage/linstor: Copy volumes on the same pool
  • incusd/storage/linstor: Add basic snapshot support
  • incusd/storage/linstor: Add support for mounting and unmounting snapshot volumes
  • incusd/storage/linstor: Add support for resizing volumes
  • incusd/storage/linstor: Add basic support for same-pool migration
  • incusd/storage/linstor: Add support for optimized images
  • incusd/storage/linstor: List snapshots to support non optimized copying of volumes with snapshots
  • incusd/storage/linstor: Implement GetResources
  • incusd/storage/linstor: Add support for updating storage pool config
  • incusd/storage/linstor: Add support for generic refreshing of volumes
  • incusd/storage/linstor: Add support for fetching volume disk usage
  • incusd/storage/linstor: Add support for non optimized backups
  • incusd/storage/linstor: Encode snapshot names in metadata
  • incusd/storage/linstor: Add support for listing volumes
  • incusd/storage/linstor: Use aux property to map incus names to linstor resource definitions
  • incusd/storage/linstor: Ensure volumes are available locally when retrieving device paths
  • incusd/storage/linstor: Fallback to generic migration implementation
  • incusd/storage/linstor: Freeze and sync filesystem when snapshotting volumes
  • incusd/storage/linstor: Cleanup temporary resource definitions from snapshots
  • incusd/storage/linstor: Delete diskless resources when unmounting volumes
  • incusd/storage/linstor: Add drbd resource config options
  • tests: Add standalone LINSTOR tests
  • tests: Add clustered LINSTOR tests
  • internal/migration: Update protobuf
  • doc: Update configs
  • gomod: Tidy dependencies and add LINSTOR
  • github: Add LINSTOR CI tests
  • incusd/storage/linstor: Add linstor.remove_snapshots config option
  • doc: Document linstor.remove_snapshots config option
  • test: Add tests for linstor.remove_snapshots config option
  • doc/support: Update feature release version
  • incusd/instance: Don't enforce device/config validation on snapshots
  • gomod: Update dependencies
  • api: instance_oci_entrypoint
  • internal/instance: Add OCI entrypoint configuration
  • incusd/instance/lxc: Add OCI entrypoint configuration
  • incusd/instance: Set instance OCI config from OCI data
  • doc: Update config

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.11.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

Incus 6.10 has been released

Feb 28, 2025

Introduction

The Incus team is pleased to announce the release of Incus 6.10!

This release brings in an easier way to run Incus on a valid HTTPS certificate, a new way to send through provisioning data to VMs, a very welcome API enhancement and much more!

image|659x280

As usual, you can try it for yourself online: https://linuxcontainers.org/incus/try-it/

Enjoy!

New features

ACME DNS-01 validation

New configuration keys have been added to allow for the DNS-01 challenge through ACME (most commonly Let's Encrypt).

This may provide an easier path at getting a valid TLS certificate on Incus servers.

Example configuration:

acme.agree_tos: true
acme.domain: foo.example.net
acme.email: admin@foo.example.net
acme.challenge: DNS-01
acme.provider: cloudflare
acme.provider.environment: |-
  CLOUDFLARE_EMAIL=admin@foo.example.net
  CLOUDFLARE_API_KEY=XYZ

Documentation: https://linuxcontainers.org/incus/docs/main/server_config/#server-options-acme

API wide filtering support

Incus already supported server-side filtering for instances, images and storage volumes.
The same logic has now been expanded to all remaining API collections.

All of them support the filter parameter with the same OData filters.
We expect to see the Incus command line tool making use of this over the next few releases.

Documentation: https://linuxcontainers.org/incus/docs/main/rest-api/#filtering

Support for SMBIOS11 provisioning in VMs

On systems with DMI tables (x86_64 or aarch64), it is now possible to seed data into the SMBIOS Type 11 table. This is a way for the hypervisor to provide data to the system without requiring a separate communication channel (network, serial, ...).

This is most notably supported by systemd where it can be used to pass in some provisioning data: https://www.freedesktop.org/software/systemd/man/latest/smbios-type-11.html

Example:

stgraber@dakara:~$ incus launch images:debian/12 d12 --vm -c smbios11.io.systemd.credential:foo=bar
Launching d12
stgraber@dakara:~$ incus exec d12 -- systemd-creds --system cat foo
bar

IOMMU support in VMs

Incus VMs now automatically get IOMMU support which will help with security and device passthrough.

This was introduced as default behavior in Incus 6.10.0, but following serveral reports of guest kernel and host platform combinations that led to broken PCIe in the guest, it has been moved to opt-in starting with Incus 6.10.1 using the security.iommu configuration option to control it.

root@u1:~# dmesg | grep -i iommu
[    0.406474] iommu: Default domain type: Translated
[    0.406481] iommu: DMA domain TLB invalidation policy: strict mode
[    0.534812] virtio_iommu virtio0: input address: 48 bits
[    0.534820] virtio_iommu virtio0: page mask: 0xfffffffffffff000
[    0.637345] pcieport 0000:00:02.0: Adding to iommu group 0
[    0.642755] pcieport 0000:00:02.1: Adding to iommu group 1
[    0.649614] pcieport 0000:00:02.2: Adding to iommu group 2
[    0.656700] pcieport 0000:00:02.3: Adding to iommu group 3
[    0.663517] pcieport 0000:00:02.4: Adding to iommu group 4
[    0.669419] pcieport 0000:00:02.5: Adding to iommu group 5
[    0.675831] pcieport 0000:00:02.6: Adding to iommu group 6
[    0.682967] pcieport 0000:00:02.7: Adding to iommu group 7
[    0.688303] pcieport 0000:00:03.0: Adding to iommu group 8
[    0.695646] pcieport 0000:00:03.1: Adding to iommu group 9
[    0.700994] pcieport 0000:00:03.2: Adding to iommu group 10
[    0.709613] pcieport 0000:00:03.3: Adding to iommu group 11
[    0.715130] pcieport 0000:00:03.4: Adding to iommu group 12
[    0.722208] virtio-pci 0000:01:00.0: Adding to iommu group 13
[    0.728419] virtio-pci 0000:01:00.1: Adding to iommu group 13
[    0.732362] virtio-pci 0000:01:00.2: Adding to iommu group 13
[    0.737953] virtio-pci 0000:01:00.3: Adding to iommu group 13
[    0.746652] virtio-pci 0000:01:00.4: Adding to iommu group 13
[    0.752491] virtio-pci 0000:01:00.5: Adding to iommu group 13
[    0.781052] virtio-pci 0000:02:00.0: Adding to iommu group 14
[    0.791255] virtio-pci 0000:03:00.0: Adding to iommu group 15
[    0.799383] virtio-pci 0000:03:00.1: Adding to iommu group 15
[    0.809692] virtio-pci 0000:04:00.0: Adding to iommu group 16
[    0.820005] virtio-pci 0000:05:00.0: Adding to iommu group 17
[    1.399721] xhci_hcd 0000:01:00.6: Adding to iommu group 13

VRF support for routed NICs

Systems using multiple VRFs (Virtual Routing and Forwarding) can now have specific routed NICs land in the VRF of their choice.

This is done through a new vrf property on routed type nic devices.

Documentation: https://linuxcontainers.org/incus/docs/main/reference/devices_nic/#nictype-routed

Creating profiles in a project through preseed

The Incus server preseed logic has been expanded to allow for profiles to be created in specific projects.

This is done through a new project key on the relevant profile entry.
The project then needs to also be defined within the preseed.

Documentation: https://linuxcontainers.org/incus/docs/main/howto/initialize/#configuration-format

LZ4 support for backups and images

lz4 is now a fully supported compression format within Incus.
Provided the matching tool is installed on the system, it's now possible to use LZ4 for both instance, volume and bucket backups (import/export) as well as for images.

Complete changelog

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

Full commit list
  • incusd/instance/drivers/qmp: Handle missing log directory
  • cmd/incus-user: keep track of socket path used to connect to the server
  • cmd/incus-user: unify logging, support --verbose and --debug
  • api: init_preseed_profile_project
  • shared/api: Add project support to profiles in preseed init
  • client: Add project support to profiles in preseed init
  • doc/rest-api: Refresh swagger YAML
  • incus/admin/init: use api.InitProfileProjectPost
  • incusd/network/ovn: Fix bad route check
  • incus/file/pull: Ensure we have a leading / in all paths
  • github: Fix shellcheck
  • doc/installing: mention incus group on NixOS
  • incus/file/pull: Read files in chunks
  • incus/file/pull: Actually make read buffer 1MiB
  • incusd/network/bridge: Fix deletion of tunnels and dummy devices
  • incusd/device/disk: Allow virtiofsd on non-x86
  • 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))
  • incusd/instance/drivers/qemu: Add IOMMU device
  • incus/file: Remove unused function
  • i18n: Update translation templates
  • incus/network/info (ovn): Fix object not found.
  • Translated using Weblate (Chinese (Simplified Han script))
  • incusd/instance/drivers: Improve NUMA balancing
  • incus/file: Move from path to filepath
  • github: Add linux-modules-extra (for vrf)
  • shared/archive: Added LZ4 support
  • api: instance_nic_routed_host_address
  • incus/server/ip: Add Master parameter for veth and tuntap
  • incus/server/ip: Add VRF parameter for IP Route
  • incus/server/device: Add vrf parameter for routed NIC devices
  • tests: Add test for routed NIC with VRF
  • doc: Add description for routed-nic VRF parameter
  • Translated using Weblate (Chinese (Simplified Han script))
  • Translated using Weblate (Chinese (Simplified Han script))
  • generate-database: Move into cmd package
  • generate-config: Move to cmd package
  • incus/storage/drivers: Fix issue with lvmcluster storage pool creation
  • generate-database: Rename from incus-generate
  • generate-config: Rename from incus-doc
  • github: Workaround permission problems
  • internal/instance: Move user config key doc string
  • internal/instance: Add environment config keys docstring
  • incusd/internal/server/instance: Add qemuEscapeCmdline
  • incusd/internal/server/instance: Use qemuEscapeCmdline
  • api: instance_smbios
  • internal/instance: Add smbios config keys
  • incusd/instance/drivers/qemu: Implement smbios config keys
  • doc: Update configs
  • incus: Fix instance copy error when using '--refresh' flag
  • doc/network_load_balancers: Fix backend add instructions
  • doc: Add frontend to wordlist
  • incusd/main_nsexec: Fix change_namespaces fallback to handle multiple namespaces
  • incusd/instance/utils: Only check uid/gid for containers
  • generate-database: Use types.Package
  • generate-database: Remove support for separate database package
  • generate-database: Separate Go package loading
  • incusd/instance/drivers: Check if disk is remote when migrating with an extra disk
  • incusd/instance/edk2: Look for bios.bin in /usr/share/seabios
  • generate-database: Add unified generate command
  • incusd/db: Use generate command
  • generate-database: Remove obsolete commands stmt and method
  • generate-database: Update README.md
  • generate-database: Reduce to single go:generate per package
  • incusd/db: Use Single generate per package
  • golangci: Update for new generate-database syntax
  • internal/cmd/table: Improve errors on modifiers
  • incusd: Add additional validation when joining a new cluster member
  • incusd: Upgrade flosch/pongo2 to v6
  • doc: Bump minimum kernel to 5.15
  • Makefile: Bump minimal Go to 1.23
  • doc: Bump minimum Go to 1.23
  • gomod: Update dependencies
  • github: Re-order code tests tasks
  • incusd/resources: Prevent concurrent runs and cache data for 10s
  • incusd/backup: Implement compatibility with old backups
  • incusd/backup: Detect incompatible backup files
  • fix: Don't attempt to download signatures for oci
  • incusd: Ensure directories have 755 permissions in 'incus file push -p' command
  • tests: Fix test for verifying directory permissions
  • devcontainer: Update Go to 1.23
  • generate-database: Make "Code generated" comment Go conformant
  • db/cluster: Update code generated by generate-database
  • generate-database: Add internal tool disclaimer
  • generate-config: Formatting README.md
  • generate-config: Add internal tool disclaimer
  • incusd/storage/drivers: Truncate the block file during custom volume migration
  • incusd/instance/qemu: Don't attempt to hotplug over the virtual IOMMU
  • incusd/device/disk: Remove diskAddRootUserNSEntry
  • incusd/device/disk: Use virtiofsd uid/gid handling
  • generate-database: Add error mapping
  • incusd/db: Use error mapping
  • incusd/db: Update generated code
  • generate-database: Make self-sufficient
  • incusd/db: Update generated code
  • generate-database: Improve case handling
  • incus/list: Remove unused arguments and parameters
  • incus/top: Fix handling of all-projects
  • incusd/storage/drivers: Refactor ceph discovery
  • incusd/instance/drivers: Let QEMU handle Ceph itself
  • incus/file: Simplify sftpCreateFile
  • incus/file: Change recursiveFilePush to use SFTP
  • incus/file: Change recursiveMkdir to use SFTP
  • incus/file: Change recursivePullFile to use SFTP
  • incus/file: Re-use SFTP as much as possible
  • internal/filter: Handle multiple in-line structs
  • api: api_filtering_extended
  • incusd: Add filtering to /1.0/networks
  • incusd: Add filtering to /1.0/networks/{networkName}/forwards
  • incusd: Add filtering to /1.0/networks/{networkName}/load-balancers
  • incusd: Add filtering to /1.0/networks/{networkName}/peers
  • incusd: Add filtering to /1.0/network-acls
  • incusd: Add filtering to /1.0/network-integrations
  • incusd: Add filtering to /1.0/network-zones
  • incusd: Add filtering to /1.0/network-zones/{zone}/records
  • incusd: Add filtering to /1.0/storage-pools
  • incusd: Add filtering to /1.0/storage-pools/{poolName}/buckets
  • incusd: Add filtering to /1.0/certificates
  • incusd: Add filtering to /1.0/profiles
  • incusd: Add filtering to /1.0/projects
  • doc/rest-api: Refresh swagger YAML
  • tests: Test more API filters
  • doc: Remove mention of limitations on filtering
  • gomod: Update dependencies
  • api: acme_dns01
  • incusd/cluster/config: Add extra ACME config keys
  • incusd/acme: Add DNS-01 support
  • gomod: Update dependencies
  • doc: Add resolvers to wordlist
  • doc: Update configs

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.10.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

Incus 6.9 has been released

Jan 24, 2025

Introduction

Happy new year!

The Incus team is pleased to announce the release of Incus 6.9!

This is a bit of a lighter release given the holiday break, but it features some nice feature additions on top of the usual health dose of bugfixes.

image|690x429

As usual, you can try it for yourself online: https://linuxcontainers.org/incus/try-it/

Enjoy!

New features

Instance network ACL on bridge networks

Network ACLs can now be directly applied to instances running on a managed network bridge, so long as the system is using nft for its firewalling (can be checked with incus info).

This allows for networking micro-segmentation by having various instances running on the same bridged network having individual ingress/egress firewall rules applied to them.

Network ACLs can be created and managed through incus network acl and then applied to the relevant NIC interfaces using the security.acls configuration key.

ACL documentation: https://linuxcontainers.org/incus/docs/main/howto/network_acls/
Bridge documentation: https://linuxcontainers.org/incus/docs/main/reference/network_bridge/
NIC documentation: https://linuxcontainers.org/incus/docs/main/reference/devices_nic/#nic-bridged

Enhancements to QEMU scriptlet

The QEMU scriptlet has been further improved in this release.

All scriptlet calls now provide the full instance structure, offering access to the instance configuration, list of profiles, ...

A new config hook was also added which runs prior to QEMU being started at all.
This hook cannot be used to send QMP commands, but it allows calling new functions to alter the QEMU configuration file or command line arguments:

  • get_qemu_cmdline
  • set_qemu_cmdline
  • get_qemu_conf
  • set_qemu_conf

Documentation: https://linuxcontainers.org/incus/docs/main/reference/instance_options/#advanced-use

VM memory dumps

A new incus debug memory-dump command and matching API has been added to provide an easy way to get a virtual machine memory dump.

Incus VMs also now include the necessary additional device to allow for Windows virtual machines to provide memory debug information allowing for a memory dump that can be loaded in the Windows debugger.

stgraber@dakara:~$ incus launch images:debian/12 v1 --vm
Launching v1
stgraber@dakara:~$ incus debug dump-memory v1 debug --format=elf
stgraber@dakara:~$ file debug
debug: ELF 64-bit LSB core file, x86-64, version 1 (SYSV), SVR4-style

It's now possible to get the uplink IPv4 and IPv6 addresses directly from incus network info.

stgraber@athos:~# incus network info default
Name: default
MAC address: 00:16:3e:8d:51:b6
MTU: 1500
State: up
Type: broadcast

IP addresses:
  inet   10.22.45.1/24 (link)
  inet6  2602:fc62:b:8006::1/64 (link)

Network usage:
  Bytes received: 0B
  Bytes sent: 0B
  Packets received: 0
  Packets sent: 0

OVN:
  Chassis: delmak
  Logical router: incus-net13-lr
  IPv4 uplink address: 172.17.200.106
  IPv6 uplink address: 2602:fc62:b:200::106

Creation of storage volumes through server preseed file

It's now possible to define some initial storage volumes directly through the server preseed file.
This can be useful to set up some shared volumes to be used by a profile that's also part of the preseed, or as a way to define volumes to be used for Incus images or backups storage.

Documentation: https://linuxcontainers.org/incus/docs/main/howto/initialize/#configuration-format

Setting description in create commands

All create commands now have a --description option which can be used to directly set the description field on the object.

stgraber@dakara:~$ incus profile create foo --description "Example profile"
Profile foo created
stgraber@dakara:~$ incus profile list
+---------+-----------------------+---------+
|  NAME   |      DESCRIPTION      | USED BY |
+---------+-----------------------+---------+
| default | Default Incus profile | 6       |
+---------+-----------------------+---------+
| foo     | Example profile       | 0       |
+---------+-----------------------+---------+

Complete changelog

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

Full commit list
  • Translated using Weblate (Japanese)
  • incusd/scriptlet: Refactor load package
  • incusd/scriptlet: Add support for checking optional functions and improve error messages
  • Translated using Weblate (Japanese)
  • Translated using Weblate (Japanese)
  • incusd/storage/drivers: Force blkdiscard and ignore errors
  • incusd/auth: fix FGA online data race
  • incusd/storage/drivers: Log on blkdiscard failure
  • incusd/storage: Add storage volume db entries when storage is changed
  • client: Propagate HTTP TLS dialer to websocket
  • api: network_ovn_state_addresses
  • shared/api: Expand OVN state with uplink addresses
  • doc/rest-api: Refresh swagger YAML
  • internal/server: Add uplink addresses to ovn state
  • incus/network/info: Add uplink addresses for ovn network
  • i18n: Update translation templates
  • incus: Add --description flag to create commands
  • i18n: Update translation templates
  • tests: Add tests for --description flag on create commands
  • incusd/scriptlet: Fix qemu_hook required argument
  • doc: Fix qemu_hook required argument
  • Add simple shell.nix
  • client: Add proxy host to skopoe calls
  • incusd/cluster: Add missing error handling
  • incusd/cluster: Clarify error on DB failure
  • incusd/instance/qemu: Fix QMP arguments typing
  • incusd/instance/qemu: QEMU device naming consistency
  • Encode mc alias for storage buckets to match allowed characters
  • doc: Contributing section restructuring
  • incusd/network/ovn: Allow creation of OVN network with no uplink
  • incusd/network/ovn: Handle missing logical router in state
  • Translated using Weblate (Chinese (Simplified Han script))
  • Translated using Weblate (Chinese (Simplified Han script))
  • lxd-to-incus: Clear volatile.uuid from instances
  • Translated using Weblate (Chinese (Simplified Han script))
  • Translated using Weblate (Chinese (Simplified Han script))
  • Added translation using Weblate (Chinese (Traditional Han script))
  • Translated using Weblate (Chinese (Traditional Han script))
  • Translated using Weblate (Chinese (Simplified Han script))
  • github: Bump most workflows to 24.04
  • github: Split testsuite to separate action
  • github: Add aarch64 tests
  • tests: Skip nftables test on old kernels
  • Added translation using Weblate (Tamil)
  • shared/util: Add IsNoneOrEmpty
  • incusd/network/bridge: Tweak dnsmasq startup condition
  • shared/cgo: Add finalize_userns
  • shared/cgo: Export in_same_namespace
  • incusd/main_forkproxy: Join all namespaces at once
  • incusd/main_forkfile: Join all namespaces at once
  • internal/linux: Add ClearBlock
  • incusd/storage: Switch to linux.ClearBlock
  • internal/linux/discard: Remove leftover debugging
  • internal/linux/discard: Use marker length for buffer
  • internal/linux/discard: Add support for offset
  • incusd/storage/generic: Pass offset to ClearBlock
  • incusd/storage/lvm: Discard the new blocks on resize
  • incusd/storage/lvm: Run ClearBlock on all new thick block volumes
  • cmd: support header line for csv output
  • cmd: update --format flag description
  • i18n: Update translation templates
  • cmd: add validation for --format flag
  • doc: fix ref for vendor-data
  • devcontainer: initial version
  • Makefile: add target for unit tests as root
  • Makefile: add missing installations for gotags and openfga
  • incusd/network/ovn: Skip remote peers when iterating peer networks
  • incusd/storage/lvm: Move resize clearing to SetVolumeQuota
  • incusd/storage: Make use of qemu-img's target-is-zero option
  • incusd/device/disk: Remove virtfs-proxy-helper dependency
  • tests: Remove 9p proxy driver
  • incusd/instance: Split startupHook function
  • incusd/main_cluster: Tweak to have help refer to correct command name
  • incusd/instance: Pass an *api.Instance to the scriptlet program
  • incusd/scriptlet/qemu: Add instance parameter to the QEMU scriptlet
  • incusd/instance: Rewire QEMU config generation
  • incusd/instance: Make QEMU config types public
  • incusd/scriptlet/qemu: Fix Starlark function name
  • incusd/scriptlet/qemu: Prevent calling QMP functions at config stage
  • incusd/device/disk: Better handle partitions
  • Fixed link to point to correct manpage.
  • lxd-to-incus: Be more lenient on database changes
  • incusd/storage/drivers: Handle 4k sector sizes
  • incusd/dnsmasq: Don't put the project name in the DNS record
  • incusd/device/disk: disable 9p if idmap requested
  • incusd/scriptlet/qemu: Add QEMU configuration getters
  • incusd/scriptlet/qemu: Add QEMU configuration setters
  • api: qemu_scriptlet_config
  • doc/ref/instance_options: Update QEMU scriptlet documentation
  • incusd/instance: Update unit test
  • incusd/instance/drivers: Introduce ReloadDevice
  • api: network_bridge_acl_devices
  • incusd/device/nic: ACL support for bridge NIC device
  • incusd/server/firewall: ACL for bridge NIC device
  • doc/device/nic: Add ACL support to bridge NICs
  • doc/network_acl: Document usage with bridged NICs
  • tests: nftable test with ACL rules
  • github: Switch to Github's hosted arm64 runners
  • doc: typo
  • doc: Updated storage_zfs.md
  • incusd/device/disk: Update correct mount options
  • incus/file/pull: Port to SFTP
  • i18n: Update translation templates
  • api: instance_debug_memory
  • incusd/instances/qemu: Add vmcoreinfo device
  • incusd/instances/qemu: Add dump-guset-memory implementation for instance memory debugging
  • incusd: Add GET /1.0/instances/NAME/debug/memory
  • doc/rest-api: Refresh swagger YAML
  • client: Add API implementation for instance memory debugging
  • incus: Add "debug dump-memory" command
  • i18n: Update translation templates
  • doc: Force white background for swagger API
  • gomod: Update dependencies
  • api: init_preseed_storage_volumes
  • client: Add storage volume initialization
  • shared/api: Add storage volume initialization
  • doc: Include storage initialization example
  • doc/rest-api: Refresh swagger YAML
  • tests: Include storage volume to init test
  • incusd/instance/qemu: Fix device_id warning on 9.2.x
  • incus: Fix example description for debug dump-memory command
  • 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/6.9.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