Technical Documentation: lxc/incus
ℹ️ Provenance: Multi-Tier Ingestion · CodeWiki Reference
Overview (`README.md`)
Incus
Incus is a modern, secure and powerful system container and virtual machine manager.
It provides a unified experience for running and managing full Linux systems inside containers or virtual machines. Incus supports images for a large number of Linux distributions (official Ubuntu images and images provided by the community) and is built around a very powerful, yet pretty simple, REST API. Incus scales from one instance on a single machine to a cluster in a full data center rack, making it suitable for running workloads both for development and in production.
Incus allows you to easily set up a system that feels like a small private cloud. You can run any type of workload in an efficient way while keeping your resources optimized.
You should consider using Incus if you want to containerize different environments or run virtual machines, or in general run and manage your infrastructure in a cost-effective way.
You can try Incus online at: https://linuxcontainers.org/incus/try-it/
Project history
Incus, which is named after the Cumulonimbus incus or anvil cloud
started as a community fork of Canonical's LXD following Canonical's takeover of the LXD project from the
Linux Containers community.
The project was then adopted by the Linux Containers community, taking back the spot left empty by LXD's departure.
Incus is a true open source community project, free of any CLA and
remains released under the Apache 2.0 license.
It's maintained by the same team of developers that first created LXD.
Get started
See Getting started in the Incus documentation for installation instructions and first steps.
- Release announcements:
https://discuss.linuxcontainers.org/c/news/ - Release tarballs:
https://github.com/lxc/incus/releases/ - Documentation:
https://linuxcontainers.org/incus/docs/main/
Status
| Type | Service | Status |
|---|---|---|
| Tests | GitHub | |
| Go documentation | Godoc | |
| Static analysis | GoReport | |
| Translations | Weblate |
Security
Consider the following aspects to ensure that your Incus installation is secure:
- Keep your operating system up-to-date and install all available security patches.
- Use only supported Incus versions.
- Restrict access to the Incus daemon and the remote API.
- Do not use privileged containers unless required. If you use privileged containers, put appropriate security measures in place. See the LXC security page for more information.
- Configure your network interfaces to be secure.
See Security for detailed information.
IMPORTANT:
Local access to Incus through the Unix socket always grants full access to Incus.
This includes the ability to attach file system paths or devices to any instance as well as tweak the security features on any instance.
Therefore, you should only give such access to users who you'd trust with root access to your system.
Support and community
The following channels are available for you to interact with the Incus community.
Bug reports
You can file bug reports and feature requests at: https://github.com/lxc/incus/issues/new
Community support
Community support is handled at: https://discuss.linuxcontainers.org
Commercial support
Commercial support is currently available from Zabbly for users of their Debian or Ubuntu packages.
Documentation
The official documentation is available at: https://github.com/lxc/incus/tree/main/doc
Contributing
Fixes and new features are greatly appreciated. Make sure to read our contributing guidelines first!
Overview (`doc/README.md`)
Incus documentation
The Incus documentation is available at: https://linuxcontainers.org/incus/docs/main/
GitHub provides a basic rendering of the documentation as well, but important features like includes and clickable links are missing. Therefore, we recommend reading the published documentation.
Documentation framework
Incus' documentation is built with Sphinx.
It is written in Markdown with MyST extensions.
For syntax help and guidelines, see the documentation cheat sheet (source).
For structuring, the documentation uses the Diátaxis approach.
Build the documentation
To build the documentation, run make doc from the root directory of the repository.
This command installs the required tools and renders the output to the doc/html/ directory.
To update the documentation for changed files only (without re-installing the tools), run make doc-incremental.
Before opening a pull request, make sure that the documentation builds without any warnings (warnings are treated as errors).
To preview the documentation locally, run make doc-serve and go to http://localhost:8001 to view the rendered documentation.
Overview (`test/README.md`)
How to run
To run all tests, including the Go tests, run from repository root:
sudo -E make checkTo run only the integration tests, run from the test directory:
sudo -E ./main.shEnvironment variables
| Name | Default | Description |
|---|---|---|
INCUS_BACKEND |
dir | What backend to test against (btrfs, ceph, dir, lvm, zfs, or random) |
INCUS_CEPH_CLUSTER |
ceph | The name of the ceph cluster to create osd pools in |
INCUS_CEPH_CEPHFS |
"" | Enables the CephFS tests using the specified cephfs filesystem for cephfs pools |
INCUS_CEPH_CEPHOBJECT_RADOSGW |
"" | Enables the Ceph Object tests using the specified radosgw HTTP endpoint for cephobject pools |
INCUS_CONCURRENT |
0 | Run concurrency tests, very CPU intensive |
INCUS_DEBUG |
0 | Run incusd, incus and the shell in debug mode (very verbose) |
INCUS_INSPECT |
0 | Don't teardown the test environment on failure |
INCUS_LOGS |
"" | Path to a directory to copy all the Incus logs to |
INCUS_OFFLINE |
0 | Skip anything that requires network access |
INCUS_SKIP_TESTS |
"" | Space-delimited list of test names to skip |
INCUS_TEST_IMAGE |
"" (busybox test image) | Path to an image tarball to use instead of the default busybox image |
INCUS_TMPFS |
0 | Sets up a tmpfs for the whole testsuite to run on (fast but needs memory) |
INCUS_TRUENAS_DATASET |
"" | The remote TrueNAS dataset that will contain all the truenas pools created whilst running tests and is required, and must exist, when using the truenas backend. |
INCUS_TRUENAS_API_KEY |
"" | If set, will be applied as truenas.api_key on truenas pools. |
INCUS_TRUENAS_CONFIG |
"" | If set, will be applied as truenas.config on truenas pools. |
INCUS_TRUENAS_HOST |
"" | If set, will be applied as truenas.host on truenas pools. |
INCUS_TRUENAS_ALLOW_INSECURE |
"" | If set, will be applied as truenas.allow_insecure on truenas pools. |
INCUS_NIC_SRIOV_PARENT |
"" | Enables SR-IOV NIC tests using the specified parent device |
INCUS_IB_PHYSICAL_PARENT |
"" | Enables Infiniband physical tests using the specified parent device |
INCUS_IB_SRIOV_PARENT |
"" | Enables Infiniband SR-IOV tests using the specified parent device |
INCUS_NIC_BRIDGED_DRIVER |
"" | Specifies bridged NIC driver for tests (either native or openvswitch, defaults to native) |
INCUS_REQUIRED_TESTS |
"" | Space-delimited list of test names that must not be skipped if their prerequisites are not met |
INCUS_VERBOSE |
0 | Run incusd, incus and the shell in verbose mode |
Overview (`cmd/generate-config/README.md`)
generate-config
A small CLI to parse comments in a Golang codebase meant to be used for a documentation tool (like Sphinx for example).
It parses the comments from the AST and extracts their documentation.
Disclaimer
generate-config is intended for internal use within the
Incus code base. There are no guarantees regarding
backwards compatibility, API stability, or long-term availability. It may change
or be removed at any time without prior notice. Use at your own discretion.
Usage
$ generate-config -h
Usage of generate-config:
-e value
Path that will be excluded from the processFormatting
A comment is formatted this way:
/* Detailed source-code truncated for AI context efficiency. */The go-swagger spec from source generator can only handles swagger:meta (global file/package level documentation), swagger:route (API endpoints), swagger:params (function parameters), swagger:operation (method documentation), swagger:response (API response content documentation), swagger:model (struct documentation) generation. In our use case, we would want a config variable spec generator that can bundle any key-value data pairs alongside metadata to build a sense of hierarchy and identity (we want to associate a unique key to each gendoc comment group that will also be displayed in the generated documentation)
In a swagger fashion, generate-config can associate metadata key-value pairs (here for example, group and key) to data key-value pairs. As a result, it can generate a YAML tree out of the code documentation and also a Markdown document.
Output
Here is the JSON output of the example shown above:
/* Detailed source-code truncated for AI context efficiency. */Here is the .txt output of the example shown above:
\`\`\`{config:option} user.* cluster
:type: string
:liveupdate: `yes`
:shortdesc: Free form user key/value storage (can be used in search).
:condition: container
:default: -
This is the real long desc.
With two paragraphs.
And a list:
- Item
- Item
- Item
example of a table:
Key | Type | Scope | Default | Description
:-- | :--- | :---- | :------ | :----------
`acme.agree_tos` | bool | global | `false` | Agree to ACME terms of service
`acme.ca_url` | string | global | `https://acme-v02.api.letsencrypt.org/directory` | URL to the directory resource of the ACME service
`acme.domain` | string | global | - | Domain for which the certificate is issued
`acme.email` | string | global | - | Email address used for the account registration
\`\`\`
\`\`\`{config:option} scheduler.instance cluster
:liveupdate: `yes`
:shortdesc: Possible values are all, manual and group. See Automatic placement of instances for more information.
:condition: container
:default: `all`
:type: integer
\`\`\`Overview (`cmd/generate-database/README.md`)
`generate-database`
Introduction
generate-database is a database statement and associated go function generator
for Incus and related projects. generate-database utilizes go's code generation
directives (//go:generate ...) alongside go's ast
and types packages for parsing the syntax tree for
go structs and variables. We use generate-database for the majority of our
SQL statements and database interactions on the go side for consistency and
predictability.
Disclaimer
generate-database is intended for internal use within the
Incus code base. There are no guarantees regarding
backwards compatibility, API stability, or long-term availability. It may change
or be removed at any time without prior notice. Use at your own discretion.
Usage
Initialization
Package global
Once per package, that uses generate-database for generation of database
statements and associated go functions, generate-database needs to be invoked
using the following go:generate instruction:
//go:generate generate-database db mapper generateThis will initiate a call to generate-database db mapper generate,
which will then search for //generate-database:mapper directives in the same file
and process those.
The following flags are available:
--package/-p: Package import paths to search for structs to parse. Defaults to the caller package. Can be used more than once.
File
Generally the first thing we will want to do for any newly generated file is to
ensure the file has been cleared of content:
//generate-database:mapper target instances.mapper.go
//generate-database:mapper reset -i -b "//go:build linux && cgo && !agent"Generation Directive Arguments
The generation directive arguments have the following form:
//generate-database:mapper <command> flags <kind> <args...>
The following flags are available:
--build/-b: build comment to include (commands:reset)--interface/-i: create interface files (commands:reset,method)--entity/-e: database entity to generate the method or statement for (commands:stmt,method)
Example:
//generate-database:mapper stmt -e instance objects table=table_name
The table key can be used to override the generated table name for a specified one.
//generate-database:mapper method -i -e instance Create references=Config,Device
For some tables (defined below under Additional Information as EntityTable, the references=<ReferenceEntity> key can be provided with the name of
a ReferenceTable or MapTable struct. This directive would produce CreateInstance in addition to CreateInstanceConfig and CreateInstanceDevices:
//generate-database:mapper method -i -e instance_profile Create struct=Instance//generate-database:mapper method -i -e instance_profile Create struct=Profile
For some tables (defined below under Additional Information as AssociationTable, method declarations must
include a struct=<Entity> to indicate the directionality of the function. An invocation can be called for each direction.
This would produce CreateInstanceProfiles and CreateProfileInstances respectively.
SQL Statement Generation
SQL generation supports the following SQL statement types:
| Type | Description |
|---|---|
objects |
Creates a basic SELECT statement of the form SELECT <columns> FROM ORDER BY <columns>. |
objects-by-<FIELD>-and-<FIELD>... |
Parses a pre-existing SELECT statement variable declaration of the form produced byobjects, and appends a WHERE clause with the given fields located in the associated struct. Specifically looks for a variable declaration of the form var <entity>Objects = RegisterStmt("SQL String") |
names |
Creates a basic SELECT statement of the form SELECT FROM ORDER BY . |
names-by-<FIELD>-and-<FIELD>... |
Parses a pre-existing SELECT statement variable declaration of the form produced bynames, and appends a WHERE clause with the given fields located in the associated struct. Specifically looks for a variable declaration of the form var <entity>Objects = RegisterStmt("SQL String") |
create |
Creates a basic INSERT statement of the form INSERT INTO VALUES. |
create-or-replace |
Creates a basic INSERT statement of the form INSERT OR REPLACE INTO VALUES. |
delete-by-<FIELD>-and-<FIELD>... |
Creates a DELETE statement of the form DELETE FROM WHERE <constraint> where the constraint is based on the given fields of the associated struct. |
id |
Creates a basic SELECT statement that returns just the internal ID of the table. |
rename |
Creates an UPDATE statement that updates the primary key of a table: UPDATE SET WHERE . |
update |
Creates an UPDATE statement of the form UPDATE SET <all columns> WHERE . |
Examples
//generate-database:mapper stmt -e instance objects
//generate-database:mapper stmt -e instance objects-by-Name-and-Project
//generate-database:mapper stmt -e instance create
//generate-database:mapper stmt -e instance update
//generate-database:mapper stmt -e instance delete-by-Name-and-ProjectStatement Related Go Tags
There are several tags that can be added to fields of a struct that will be parsed by the ast package.
| Tag | Description |
|---|---|
sql=.<column> |
Supply an explicit table and column name to use for this struct field. |
coalesce=<value> |
Generates a SQL coalesce function with the given value coalesce(<column>, value). |
order=yes |
Override the default ORDER BY columns with all fields specifying this tag. |
join=<joinTable.column> |
Applies a JOIN of the form JOIN <joinTable> ON .<joinTable_id> = <joinTable.id>. |
leftjoin= |
Applies a LEFT JOIN of the same form as a JOIN. |
joinon=.<column> |
Overrides the default JOIN ON clause with the given table and column, replacing .<joinTable_id> above. |
jointo=<column> |
Overrides the default target column id with the given column, replacing the id in <joinTable.id> above. This is intended for "loose" foreign keys, not using the ID column. Therefore, this is intended to be used in conjunction with joinon and omit=create,update to get the expected behavior. |
joinas=<alias> |
Sets an alias for the joined table name, in case it clashes with another table. |
primary=yes |
Assigns column associated with the field to be sufficient for returning a row from the table. Will default to Name if unspecified. Fields with this key will be included in the default 'ORDER BY' clause. |
omit=<Stmt Types> |
Omits a given field from consideration for the comma separated list of statement types (create, objects-by-Name, update). |
ignore |
Outright ignore the struct field as though it does not exist. ignore needs to be the only tag value in order to be recognized. |
marshal=<yes/json> |
Marshal/Unmarshal data into the field. The column must be a TEXT column. If marshal=yes, then the type must implement both Marshal and Unmarshal. If marshal=json, the type is marshaled to JSON using the standard library (json.Marshal). This works for entity tables only, and not for association or mapping tables. |
create_timestamp |
Automatically set the value of this column to the current time (UTC) when the respective record is created, namely in Create and CreateOrReplace (regardless if the record is actually created or updated). |
update_timestamp |
Automatically set the value of this column to the current time (UTC) for every operation altering the record, namely Create, CreateOrReplace, Rename and Update. |
nullable=yes |
Modify filters for this field to handle null types like sql.Null* by changing field = ? to (field = ? OR ( field IS NULL AND ? IS NULL )). |
Go Function Generation
Go function generation supports the following types:
| Type | Description |
|---|---|
GetNames |
Return a slice of primary keys for all rows in a table matching the filter. Cannot be used with composite keys. |
GetMany |
Return a slice of structs for all rows in a table matching the filter. |
GetOne |
Return a single struct corresponding to a row with the given primary keys. Depends on GetMany. |
ID |
Return the ID column from the table corresponding to the given primary keys. |
Exists |
Returns whether there is an row in the table with the given primary keys. Depends on ID. |
Create |
Insert a row from the given struct into the table if not already present. Depends on Exists |
CreateOrReplace |
Insert a row from the given struct into the table, regardless of if an entry already exists. |
Rename |
Update the primary key for a table row. |
Update |
Update the columns at a given row, specified by primary key. |
DeleteOne |
Delete exactly one row from the table. |
DeleteMany |
Delete one or more rows from the table. |
//generate-database:mapper method -i -e instance GetMany
//generate-database:mapper method -i -e instance GetOne
//generate-database:mapper method -i -e instance ID
//generate-database:mapper method -i -e instance Exist
//generate-database:mapper method -i -e instance Create
//generate-database:mapper method -i -e instance Update
//generate-database:mapper method -i -e instance DeleteOne-by-Project-and-Name
//generate-database:mapper method -i -e instance DeleteMany-by-NameAdditional Information
All structs should have an ID field, as well as an additional Filter struct prefixed with the original struct name.
This should include any fields that should be considered for filtering in WHERE clauses.
These fields should be pointers to facilitate omission and inclusion without setting default values.
Example:
type Instance struct {
ID int
Name string
Project string
}
type InstanceFilter struct {
Name *string
Project *string
}generate-database will handle parsing of structs differently based on the composition of the struct in four different ways.
Non-EntityType structs will only support GetMany, Create, Update, and Delete functions.
EntityTable
Most structs will get treated this way, and represent a normal table.
If a table has an associated table for which a
ReferenceTableorMapTableas defined below is applicable, functions specific to this entity can be generated by
including a comma separated list toreferences=<OtherEntity>in the code generation directive forGetMany,Create, orUpdatedirectives.The
Createmethod directive forEntityTablewill expect on theIDandExistmethod directives to be present.All
CREATE,UPDATE, andDELETEstatements that include a joined table will expect avar <entity>ID = RegisterStmt('SQL String')to exist for the joining table.
ReferenceTable
A struct that contains a field named ReferenceID will be parsed this way.generate-database will use this struct to generate more abstract SQL statements and functions of the form _.
The associated Filter struct may include a ReferenceID []int field.
This generates an IN clause matching on the parent column, with the integer values inlined into the query to avoid query parameter count limits.
A nil slice leaves the filter unset while an empty (non-nil) slice matches nothing.
When the field is present, the generated per-parent helpers and nested reference fetches are automatically scoped to the relevant parent IDs rather than fetching the whole table.
Real world invocation of these statements and functions should be done through an EntityTable method call with the tag references=. This EntityTable will replace the `` above.
Example:
//generate-database:mapper stmt -e device create
//generate-database:mapper method -e device Create
type Device struct {
ID int
ReferenceID int
Name string
Type string
}
//...
//generate-database:mapper method -e instance Create references=Device
// This will produce a function called `CreateInstanceDevices`.MapTable
This is a special type of ReferenceTable with fields named Key and Value.
On the SQL side, this is treated exactly like a ReferenceTable, but on the go side, the return values will be a map.
Example:
//generate-database:mapper stmt -e config create
//generate-database:mapper method -e config Create
type Config struct {
ID int
ReferenceID int
Key string
Value string
}
//...
//generate-database:mapper method -e instance Create references=Config
// This will produce a function called `CreateInstanceConfig`, which will return a `map[string]string`.AssociationTable
This is a special type of table that contains two fields of the form <Entity>ID, where <Entity> corresponds to two other structs present in the same package.
This will generate code for compound tables of the form <entity1>_<entity2> that are generally used to associate two tables together by their IDs.
method generation declarations for these statements should include a struct=<Entity> to indicate the directionality of the function.
An invocation can be called for each direction.
Example:
//generate-database:mapper method -i -e instance_profile Create struct=Instance
//generate-database:mapper method -i -e instance_profile Create struct=Profile
type InstanceProfile struct {
InstanceID int
ProfileID int
}Overview (`test/mini-oidc/README.md`)
mini-oidc
mini-oidc is an extremely basic OIDC provider which can be used with the incus command line.
It doesn't use web authentication and instead just automatically approves any authentication request.
Usage:
mini-oidc <port> [<user-file>]By default, it will authenticate everyone as unknown, but this can be overridden by writing the username to be returned in the file named in the 2nd
(optional) argument. This effectively allows scripting a variety of users without having to deal with actual login.
The storage sub-package is a based on https://github.com/zitadel/oidc/tree/main/example/server/storage.
The following changes were made:
- Added IncusDeviceClient
- Added option to configure access token and refresh token expiry
Overview (`shared/resources/usbid/README.md`)
This Go package is a variant of usbid from https://github.com/google/gousb.
It was written by the gousb maintainers and contributors and then adapted for our use.
Main changes:
- Doesn't load on import (reduced memory footprint).
- Uses system-local USB database (to always match
lsusb). - Doesn't import anything outside of built-in Go packages.
- Doesn't use or indirectly rely on CGO as this code is often used in cross-built static binaries.
Most users will want to stick to the upstream google/gousb version instead.
This fork is really meant for our special use case and may be further trimmed down in the future.
Doc Index (`doc/index.md`)
Incus
Incus is a modern, secure and powerful system container and virtual machine manager.
% Include content from ../README.md
:start-after:
:end-before:Security
% Include content from ../README.md
:start-after:
:end-before:See Security for detailed information.
% Include content from [../README.md](../README.md)
```{include} ../README.md
:start-after:
:end-before:
```Project and community
Incus is free software and developed under the Apache 2 license.
It’s an open source project that warmly welcomes community projects, contributions, suggestions, fixes and constructive feedback.
- Code of Conduct
- Contribute to the project
- Release announcements
- Release tarballs
- Get support
- Watch tutorials and announcements on YouTube
- Ask and answer questions on the forum
:hidden:
:titlesonly:
self
Getting Started </tutorial/first_steps>
General </general>
Client </client>
Server </server>
Instances </instances>
Storage </storage>
Networks </networks>
Images </images>
Projects </projects>
Clustering </clustering>
API </api>
Security </security>
Internals </internals>
Contributing </contributing>
External resources </external_resources>Doc .Wordlist (`doc/.wordlist.txt`)
AAAA
AAVMF
ABI
ACL
ACLs
AI
AIO
allocator
AMD
Ansible
Ansible's
API
APIs
AppArmor
ARMv
ARP
ASN
AXFR
backend
backends
backported
Backports
balancer
balancers
benchmarking
BFD
BGP
bibi
BitLocker
BMC
bool
bootable
BPF
Btrfs
bugfix
bugfixes
Centos
Ceph
CephFS
Ceph's
CFS
cgroup
cgroupfs
cgroups
checksum
checksums
Chocolatey
CIDR
CLI
Colima
COPR
Cowsql
CPUs
CRIU
CRL
cron
CSV
CUDA
customizable
dataset
DCO
dereferenced
devtmpfs
DHCP
DHCPv
Diátaxis
Diffie
diskful
diskless
Diskless
Distrobuilder
DMA
DNAT
DNS
dnsmasq
DNSSEC
DoS
DRBD
DRM
EB
Ebit
eBPF
ECDHE
EAB
ECDSA
ECMP
EDK
EiB
Eibit
endian
EPEL
ES
ESA
ETag
failover
formatters
FQDNs
FreeBSD
frontend
Furo
gapped
GARM
GARP
GbE
Gbit
Geneve
GiB
Gibit
GID
GIDs
Github
Golang
goroutines
GPG
GPUDirect
GPUs
Grafana
GUID
HAProxy
hardcoded
HDDs
Hellman
HMAC
Homebrew
hostname
hotplug
hotplugged
hotplugging
HTTPS
hwdata
ICMP
idmap
idmapped
idmaps
Incant
incrementing
Incus
Incus'
InfiniBand
InfluxDB
init
initramfs
integrations
IOMMU
IOPS
IOV
IPAM
IPs
IPv
IPVLAN
iSCSI
JIT
jq
JSON
JWT
kB
kbit
KiB
kibi
Kibit
Kubernetes
KVM
LINBIT
LINSTOR
LINSTOR's
LLM
LLMs
lookups
Loongarch
LRU
LTS
LV
LVM
LXC
LXCFS
LXC's
LXD
LXD's
macOS
macvlan
Makefile
manpages
Mbit
mDNS
MiB
Mibit
MicroCeph
MicroCloud
misconfigured
MCS
MII
MITM
MTU
Mullvad
multicast
multiport
MyST
namespace
namespaced
namespaces
NATed
natively
NDP
NetBSD
netmask
NFS
NIC
NIC's
NICs
NixOS
NTP
NUMA
NVMe
NVRAM
OCI
OData
OIDC
OpenFGA
OpenID
OpenMetrics
OpenSSL
openSUSE
OpenSUSE
OpenTofu
OSD
overcommit
overcommitting
overlayfs
OVMF
OVN
OVS
PackageHub
passthrough
Pbit
PEM
PCI
PCIe
PDU
peerings
Permalink
PFs
PiB
Pibit
PID
PKI
PNG
Podman
Pongo
POSIX
PPA
pre
preselects
preseed
proxied
Proxmox
proxying
PTS
PXE
qdisc
QEMU
qgroup
qgroups
QMP
RADOS
RBAC
RBD
RDNSS
README
reconfiguring
requestor
resolvers
RESTful
RHEL
rootfs
RSA
rST
RTC
runtime
SATA
scalable
scriptlet
SDN
SeaBIOS
Seccomp
SELinux
SEV
SFTP
SHA
shiftfs
SIGHUP
SIGTERM
simplestreams
SLAAC
SMTP
Snapcraft
snapshotted
SNAT
SOA
Solaris
SPAs
SPL
SquashFS
SSDs
SSL
Starlark
stateful
stderr
stdin
stdout
STP
struct
structs
subcommand
subcommands
subitem
subnet
subnets
subpage
substep
subtree
subtrees
subvolume
subvolumes
superset
SVG
symlink
symlinks
syscall
syscalls
sysfs
syslog
systemd
Tbit
TCP
Telegraf
Terraform
TiB
Tibit
TLS
tmpfs
toolchain
topologies
TPM
TrueNAS
TSIG
TTL
UDP
UEFI
UFW
UI
UID
UIDs
uncomment
unconfigured
unevictable
unixgram
unmanaged
unmount
unmounting
uplink
uptime
URI
URIs
userspace
UUID
vCPU
vCPUs
VE
VDPA
VFs
VFS
VirtIO
virtualize
virtualized
VLAN
VLANs
VM
VMs
VPD
VPN
VPS
VRF
vSwitch
VXLAN
webhook
WebSocket
WebSockets
Winget
XFS
XHR
YAML
YAML's
Zabbly
Zettabyte
ZFS
zpool
zpools
Doc Api Extensions (`doc/api-extensions.md`)
API extensions
The changes below were introduced to the Incus API after the 1.0 API was finalized.
They are all backward compatible and can be detected by client tools by
looking at the api_extensions field in GET /1.0.
`storage_zfs_remove_snapshots`
A storage.zfs_remove_snapshots daemon configuration key was introduced.
It's a Boolean that defaults to false and that when set to true instructs Incus
to remove any needed snapshot when attempting to restore another.
This is needed as ZFS will only let you restore the latest snapshot.
`container_host_shutdown_timeout`
A boot.host_shutdown_timeout container configuration key was introduced.
It's an integer which indicates how long Incus should wait for the container
to stop before killing it.
Its value is only used on clean Incus daemon shutdown. It defaults to 30s.
`container_stop_priority`
A boot.stop.priority container configuration key was introduced.
It's an integer which indicates the priority of a container during shutdown.
Containers will shutdown starting with the highest priority level.
Containers with the same priority will shutdown in parallel. It defaults to 0.
`container_syscall_filtering`
A number of new syscalls related container configuration keys were introduced.
security.syscalls.blacklist_defaultsecurity.syscalls.blacklist_compatsecurity.syscalls.blacklistsecurity.syscalls.whitelist
See Instance configuration for how to use them.
`auth_pki`
This indicates support for PKI authentication mode.
In this mode, the client and server both must use certificates issued by the same PKI.
See Security for details.
`container_last_used_at`
A last_used_at field was added to the GET /1.0/containers/<name> endpoint.
It is a timestamp of the last time the container was started.
If a container has been created but not started yet, last_used_at field
will be 1970-01-01T00:00:00Z
`etag`
Add support for the ETag header on all relevant endpoints.
This adds the following HTTP header on answers to GET:
- ETag (SHA-256 of user modifiable content)
And adds support for the following HTTP header on PUT requests:
- If-Match (ETag value retrieved through previous GET)
This makes it possible to GET an Incus object, modify it and PUT it without
risking to hit a race condition where Incus or another client modified the
object in the meantime.
`patch`
Add support for the HTTP PATCH method.
PATCH allows for partial update of an object in place of PUT.
`usb_devices`
Add support for USB hotplug.
`https_allowed_credentials`
To use Incus API with all Web Browsers (via SPAs) you must send credentials
(certificate) with each XHR (in order for this to happen, you should setwithCredentials=true
flag to each XHR Request).
Some browsers like Firefox and Safari can't accept server response withoutAccess-Control-Allow-Credentials: true header. To ensure that the server will
return a response with that header, set core.https_allowed_credentials=true.
`image_compression_algorithm`
This adds support for a compression_algorithm property when creating an image (POST /1.0/images).
Setting this property overrides the server default value (images.compression_algorithm).
`directory_manipulation`
This allows for creating and listing directories via the Incus API, and exports
the file type via the X-Incus-type header, which can be either file ordirectory right now.
`container_cpu_time`
This adds support for retrieving CPU time for a running container.
`storage_zfs_use_refquota`
Introduces a new server property storage.zfs_use_refquota which instructs Incus
to set the refquota property instead of quota when setting a size limit
on a container. Incus will also then use usedbydataset in place of used
when being queried about disk utilization.
This effectively controls whether disk usage by snapshots should be
considered as part of the container's disk space usage.
`storage_lvm_mount_options`
Adds a new storage.lvm_mount_options daemon configuration option
which defaults to discard and allows the user to set addition mount
options for the file system used by the LVM LV.
`network`
Network management API for Incus.
This includes:
- Addition of the
managedproperty on/1.0/networksentries - All the network configuration options (see Network configuration for details)
POST /1.0/networks(see RESTful API for details)PUT /1.0/networks/<entry>(see RESTful API for details)PATCH /1.0/networks/<entry>(see RESTful API for details)DELETE /1.0/networks/<entry>(see RESTful API for details)ipv4.addressproperty onnictype devices (whennictypeisbridged)ipv6.addressproperty onnictype devices (whennictypeisbridged)security.mac_filteringproperty onnictype devices (whennictypeisbridged)
`profile_usedby`
Adds a new used_by field to profile entries listing the containers that are using it.
`container_push`
When a container is created in push mode, the client serves as a proxy between
the source and target server. This is useful in cases where the target server
is behind a NAT or firewall and cannot directly communicate with the source
server and operate in pull mode.
`container_exec_recording`
Introduces a new Boolean record-output, parameter to/1.0/containers/<name>/exec which when set to true and combined with
with wait-for-websocket set to false, will record stdout and stderr to
disk and make them available through the logs interface.
The URL to the recorded output is included in the operation metadata
once the command is done running.
That output will expire similarly to other log files, typically after 48 hours.
`certificate_update`
Adds the following to the REST API:
- ETag header on GET of a certificate
- PUT of certificate entries
- PATCH of certificate entries
`container_exec_signal_handling`
Adds support /1.0/containers/<name>/exec for forwarding signals sent to the
client to the processes executing in the container. Currently SIGTERM and
SIGHUP are forwarded. Further signals that can be forwarded might be added
later.
`gpu_devices`
Enables adding GPUs to a container.
`container_image_properties`
Introduces a new image configuration key space. Read-only, includes the properties of the parent image.
`migration_progress`
Transfer progress is now exported as part of the operation, on both sending and receiving ends.
This shows up as a fs_progress attribute in the operation metadata.
`id_map`
Enables setting the security.idmap.isolated and security.idmap.isolated,security.idmap.size, and raw.id_map fields.
`network_firewall_filtering`
Add two new keys, ipv4.firewall and ipv6.firewall which if set tofalse will turn off the generation of iptables FORWARDING rules. NAT
rules will still be added so long as the matching ipv4.nat oripv6.nat key is set to true.
Rules necessary for dnsmasq to work (DHCP/DNS) will always be applied ifdnsmasq is enabled on the bridge.
`network_routes`
Introduces ipv4.routes and ipv6.routes which allow routing additional subnets to an Incus bridge.
`storage`
Storage management API for Incus.
This includes:
GET /1.0/storage-poolsPOST /1.0/storage-pools(see RESTful API for details)GET /1.0/storage-pools/<name>(see RESTful API for details)POST /1.0/storage-pools/<name>(see RESTful API for details)PUT /1.0/storage-pools/<name>(see RESTful API for details)PATCH /1.0/storage-pools/<name>(see RESTful API for details)DELETE /1.0/storage-pools/<name>(see RESTful API for details)GET /1.0/storage-pools/<name>/volumes(see RESTful API for details)GET /1.0/storage-pools/<name>/volumes/<volume_type>(see RESTful API for details)POST /1.0/storage-pools/<name>/volumes/<volume_type>(see RESTful API for details)GET /1.0/storage-pools//volumes/<volume_type>/<name>(see RESTful API for details)POST /1.0/storage-pools//volumes/<volume_type>/<name>(see RESTful API for details)PUT /1.0/storage-pools//volumes/<volume_type>/<name>(see RESTful API for details)PATCH /1.0/storage-pools//volumes/<volume_type>/<name>(see RESTful API for details)DELETE /1.0/storage-pools//volumes/<volume_type>/<name>(see RESTful API for details)All storage configuration options (see Storage configuration for details)
`file_delete`
Implements DELETE in /1.0/containers/<name>/files
`file_append`
Implements the X-Incus-write header which can be one of overwrite or append.
`network_dhcp_expiry`
Introduces ipv4.dhcp.expiry and ipv6.dhcp.expiry allowing to set the DHCP lease expiry time.
`storage_lvm_vg_rename`
Introduces the ability to rename a volume group by setting storage.lvm.vg_name.
`storage_lvm_thinpool_rename`
Introduces the ability to rename a thin pool name by setting storage.thinpool_name.
`network_vlan`
This adds a new vlan property to macvlan network devices.
When set, this will instruct Incus to attach to the specified VLAN. Incus
will look for an existing interface for that VLAN on the host. If one
can't be found it will create one itself and then use that as the
macvlan parent.
`image_create_aliases`
Adds a new aliases field to POST /1.0/images allowing for aliases to
be set at image creation/import time.
`container_stateless_copy`
This introduces a new live attribute in POST /1.0/containers/<name>.
Setting it to false tells Incus not to attempt running state transfer.
`container_only_migration`
Introduces a new Boolean container_only attribute. When set to true only the
container will be copied or moved.
`storage_zfs_clone_copy`
Introduces a new Boolean storage_zfs_clone_copy property for ZFS storage
pools. When set to false copying a container will be done through zfs send and
receive. This will make the target container independent of its source
container thus avoiding the need to keep dependent snapshots in the ZFS pool
around. However, this also entails less efficient storage usage for the
affected pool.
The default value for this property is true, i.e. space-efficient snapshots
will be used unless explicitly set to false.
`unix_device_rename`
Introduces the ability to rename the unix-block/unix-char device inside container by setting path,
and the source attribute is added to specify the device on host.
If source is set without a path, we should assume that path will be the same as source.
If path is set without source and major/minor isn't set,
we should assume that source will be the same as path.
So at least one of them must be set.
`storage_rsync_bwlimit`
When rsync has to be invoked to transfer storage entities setting rsync.bwlimit
places an upper limit on the amount of socket I/O allowed.
`network_vxlan_interface`
This introduces a new tunnel.NAME.interface option for networks.
This key control what host network interface is used for a VXLAN tunnel.
`storage_btrfs_mount_options`
This introduces the btrfs.mount_options property for Btrfs storage pools.
This key controls what mount options will be used for the Btrfs storage pool.
`entity_description`
This adds descriptions to entities like containers, snapshots, networks, storage pools and volumes.
`image_force_refresh`
This allows forcing a refresh for an existing image.
`storage_lvm_lv_resizing`
This introduces the ability to resize logical volumes by setting the size
property in the containers root disk device.
`id_map_base`
This introduces a new security.idmap.base allowing the user to skip the
map auto-selection process for isolated containers and specify what host
UID/GID to use as the base.
`file_symlinks`
This adds support for transferring symlinks through the file API.
X-Incus-type can now be symlink with the request content being the target path.
`container_push_target`
This adds the target field to POST /1.0/containers/<name> which can be
used to have the source Incus host connect to the target during migration.
`network_vlan_physical`
Allows use of vlan property with physical network devices.
When set, this will instruct Incus to attach to the specified VLAN on the parent interface.
Incus will look for an existing interface for that parent and VLAN on the host.
If one can't be found it will create one itself.
Then, Incus will directly attach this interface to the container.
`storage_images_delete`
This enabled the storage API to delete storage volumes for images from
a specific storage pool.
`container_edit_metadata`
This adds support for editing a container metadata.yaml and related templates
via API, by accessing URLs under /1.0/containers/<name>/metadata. It can be used
to edit a container before publishing an image from it.
`container_snapshot_stateful_migration`
This enables migrating stateful container snapshots to new containers.
`storage_driver_ceph`
This adds a Ceph storage driver.
`storage_ceph_user_name`
This adds the ability to specify the Ceph user.
`instance_types`
This adds the instance_type field to the container creation request.
Its value is expanded to Incus resource limits.
`storage_volatile_initial_source`
This records the actual source passed to Incus during storage pool creation.
`storage_ceph_force_osd_reuse`
This introduces the ceph.osd.force_reuse property for the Ceph storage
driver. When set to true Incus will reuse an OSD storage pool that is already in
use by another Incus instance.
`storage_block_filesystem_btrfs`
This adds support for Btrfs as a storage volume file system, in addition to ext4
and xfs.
`resources`
This adds support for querying an Incus daemon for the system resources it has
available.
`kernel_limits`
This adds support for setting process limits such as maximum number of open
files for the container via nofile. The format is limits.kernel.[limit name].
`storage_api_volume_rename`
This adds support for renaming custom storage volumes.
`network_sriov`
This adds support for SR-IOV enabled network devices.
`console`
This adds support to interact with the container console device and console log.
`restrict_dev_incus`
A new security.guestapi container configuration key was introduced.
The key controls whether the /dev/incus interface is made available to the container.
If set to false, this effectively prevents the container from interacting with the Incus daemon.
`migration_pre_copy`
This adds support for optimized memory transfer during live migration.
`infiniband`
This adds support to use InfiniBand network devices.
`dev_incus_events`
This adds a WebSocket API to the /dev/incus socket.
When connecting to /1.0/events over the /dev/incus socket, you will now be
getting a stream of events over WebSocket.
`proxy`
This adds a new proxy device type to containers, allowing forwarding
of connections between the host and container.
`network_dhcp_gateway`
Introduces a new ipv4.dhcp.gateway network configuration key to set an alternate gateway.
`file_get_symlink`
This makes it possible to retrieve symlinks using the file API.
`network_leases`
Adds a new /1.0/networks/NAME/leases API endpoint to query the lease database on
bridges which run an Incus-managed DHCP server.
`unix_device_hotplug`
This adds support for the required property for Unix devices.
`storage_api_local_volume_handling`
This add the ability to copy and move custom storage volumes locally in the
same and between storage pools.
`operation_description`
Adds a description field to all operations.
`clustering`
Clustering API for Incus.
This includes the following new endpoints (see RESTful API for details):
GET /1.0/clusterUPDATE /1.0/clusterGET /1.0/cluster/membersGET /1.0/cluster/members/<name>POST /1.0/cluster/members/<name>DELETE /1.0/cluster/members/<name>
The following existing endpoints have been modified:
POST /1.0/containersaccepts a newtargetquery parameterPOST /1.0/storage-poolsaccepts a newtargetquery parameterGET /1.0/storage-pool/<name>accepts a newtargetquery parameterPOST /1.0/storage-pool//volumes/<type>accepts a newtargetquery parameterGET /1.0/storage-pool//volumes/<type>/<name>accepts a newtargetquery parameterPOST /1.0/storage-pool//volumes/<type>/<name>accepts a newtargetquery parameterPUT /1.0/storage-pool//volumes/<type>/<name>accepts a newtargetquery parameterPATCH /1.0/storage-pool//volumes/<type>/<name>accepts a newtargetquery parameterDELETE /1.0/storage-pool//volumes/<type>/<name>accepts a newtargetquery parameterPOST /1.0/networksaccepts a newtargetquery parameterGET /1.0/networks/<name>accepts a newtargetquery parameter
`event_lifecycle`
This adds a new lifecycle message type to the events API.
`storage_api_remote_volume_handling`
This adds the ability to copy and move custom storage volumes between remote.
`nvidia_runtime`
Adds a nvidia_runtime configuration option for containers, setting this totrue will have the NVIDIA runtime and CUDA libraries passed to the
container.
`container_mount_propagation`
This adds a new propagation option to the disk device type, allowing
the configuration of kernel mount propagation.
`container_backup`
Add container backup support.
This includes the following new endpoints (see RESTful API for details):
GET /1.0/containers/<name>/backupsPOST /1.0/containers/<name>/backupsGET /1.0/containers/<name>/backups/<name>POST /1.0/containers/<name>/backups/<name>DELETE /1.0/containers/<name>/backups/<name>GET /1.0/containers/<name>/backups/<name>/export
The following existing endpoint has been modified:
POST /1.0/containersaccepts the new source typebackup
`dev_incus_images`
Adds a security.guestapi.images configuration option for containers which
controls the availability of a /1.0/images/FINGERPRINT/export API over/dev/incus. This can be used by a container running nested Incus to access raw
images from the host.
`container_local_cross_pool_handling`
This enables copying or moving containers between storage pools on the same Incus
instance.
`proxy_unix`
Add support for both Unix sockets and abstract Unix sockets in proxy devices.
They can be used by specifying the address as unix:/path/to/unix.sock (normal
socket) or unix:@/tmp/unix.sock (abstract socket).
Supported connections are now:
TCP <-> TCPUNIX <-> UNIXTCP <-> UNIXUNIX <-> TCP
`proxy_udp`
Add support for UDP in proxy devices.
Supported connections are now:
TCP <-> TCPUNIX <-> UNIXTCP <-> UNIXUNIX <-> TCPUDP <-> UDPTCP <-> UDPUNIX <-> UDP
`clustering_join`
This makes GET /1.0/cluster return information about which storage pools and
networks are required to be created by joining nodes and which node-specific
configuration keys they are required to use when creating them. Likewise the PUT /1.0/cluster endpoint now accepts the same format to pass information about
storage pools and networks to be automatically created before attempting to join
a cluster.
`proxy_tcp_udp_multi_port_handling`
Adds support for forwarding traffic for multiple ports. Forwarding is allowed
between a range of ports if the port range is equal for source and target
(for example 1.2.3.4 0-1000 -> 5.6.7.8 1000-2000) and between a range of source
ports and a single target port (for example 1.2.3.4 0-1000 -> 5.6.7.8 1000).
`network_state`
Adds support for retrieving a network's state.
This adds the following new endpoint (see RESTful API for details):
GET /1.0/networks/<name>/state
`proxy_unix_dac_properties`
This adds support for GID, UID, and mode properties for non-abstract Unix
sockets.
`container_protection_delete`
Enables setting the security.protection.delete field which prevents containers
from being deleted if set to true. Snapshots are not affected by this setting.
`proxy_priv_drop`
Adds security.uid and security.gid for the proxy devices, allowing
privilege dropping and effectively changing the UID/GID used for
connections to Unix sockets too.
`pprof_http`
This adds a new core.debug_address configuration option to start a debugging HTTP server.
That server currently includes a pprof API and replaces the oldcpu-profile, memory-profile and print-goroutines debug options.
`proxy_haproxy_protocol`
Adds a proxy_protocol key to the proxy device which controls the use of the HAProxy PROXY protocol header.
`network_hwaddr`
Adds a bridge.hwaddr key to control the MAC address of the bridge.
`proxy_nat`
This adds optimized UDP/TCP proxying. If the configuration allows, proxying
will be done via iptables instead of proxy devices.
`network_nat_order`
This introduces the ipv4.nat.order and ipv6.nat.order configuration keys for Incus bridges.
Those keys control whether to put the Incus rules before or after any pre-existing rules in the chain.
`container_full`
This introduces a new recursion=2 mode for GET /1.0/containers which allows for the retrieval of
all container structs, including the state, snapshots and backup structs.
This effectively allows for incus list to get all it needs in one query.
`backup_compression`
This introduces a new backups.compression_algorithm configuration key which
allows configuration of backup compression.
`nvidia_runtime_config`
This introduces a few extra configuration keys when using nvidia.runtime and the libnvidia-container library.
Those keys translate pretty much directly to the matching NVIDIA container environment variables:
nvidia.driver.capabilities=>NVIDIA_DRIVER_CAPABILITIESnvidia.require.cuda=>NVIDIA_REQUIRE_CUDAnvidia.require.driver=>NVIDIA_REQUIRE_DRIVER
`storage_api_volume_snapshots`
Add support for storage volume snapshots. They work like container snapshots,
only for volumes.
This adds the following new endpoint (see RESTful API for details):
GET /1.0/storage-pools//volumes/<type>/<name>/snapshotsPOST /1.0/storage-pools//volumes/<type>/<name>/snapshotsGET /1.0/storage-pools//volumes/<type>/<volume>/snapshots/<name>PUT /1.0/storage-pools//volumes/<type>/<volume>/snapshots/<name>POST /1.0/storage-pools//volumes/<type>/<volume>/snapshots/<name>DELETE /1.0/storage-pools//volumes/<type>/<volume>/snapshots/<name>
`storage_unmapped`
Introduces a new security.unmapped Boolean on storage volumes.
Setting it to true will flush the current map on the volume and prevent
any further idmap tracking and remapping on the volume.
This can be used to share data between isolated containers after
attaching it to the container which requires write access.
`projects`
Add a new project API, supporting creation, update and deletion of projects.
Projects can hold containers, profiles or images at this point and let
you get a separate view of your Incus resources by switching to it.
`network_vxlan_ttl`
This adds a new tunnel.NAME.ttl network configuration option which
makes it possible to raise the TTL on VXLAN tunnels.
`container_incremental_copy`
This adds support for incremental container copy. When copying a container
using the --refresh flag, only the missing or outdated files will be
copied over. Should the target container not exist yet, a normal copy operation
is performed.
`usb_optional_vendorid`
As the name implies, the vendorid field on USB devices attached to
containers has now been made optional, allowing for all USB devices to
be passed to a container (similar to what's done for GPUs).
`snapshot_scheduling`
This adds support for snapshot scheduling. It introduces three new
configuration keys: snapshots.schedule, snapshots.schedule.stopped, andsnapshots.pattern. Snapshots can be created automatically up to every minute.
`snapshots_schedule_aliases`
Snapshot schedule can be configured by a comma-separated list of schedule aliases.
Available aliases are <@hourly> <@daily> <@midnight> <@weekly> <@monthly> <@annually> <@yearly> <@startup> for instances,
and <@hourly> <@daily> <@midnight> <@weekly> <@monthly> <@annually> <@yearly> for storage volumes.
`container_copy_project`
Introduces a project field to the container source JSON object, allowing for
copy/move of containers between projects.
`clustering_server_address`
This adds support for configuring a server network address which differs from
the REST API client network address. When bootstrapping a new cluster, clients
can set the new cluster.https_address configuration key to specify the address of
the initial server. When joining a new server, clients can set thecore.https_address configuration key of the joining server to the REST API
address the joining server should listen at, and set the server_address
key in the PUT /1.0/cluster API to the address the joining server should
use for clustering traffic (the value of server_address will be
automatically copied to the cluster.https_address configuration key of the
joining server).
`clustering_image_replication`
Enable image replication across the nodes in the cluster.
A new cluster.images_minimal_replica configuration key was introduced can be used
to specify to the minimal numbers of nodes for image replication.
`container_protection_shift`
Enables setting the security.protection.shift option which prevents containers
from having their file system shifted.
`snapshot_expiry`
This adds support for snapshot expiration. The task is run minutely. The configuration
option snapshots.expiry takes an expression in the form of 1M 2H 3d 4w 5m 6y (1 minute, 2 hours, 3 days, 4 weeks, 5 months, 6 years), however not all
parts have to be used.
Snapshots which are then created will be given an expiry date based on the
expression. This expiry date, defined by expires_at, can be manually edited
using the API or incus config edit. Snapshots with a valid expiry date will be
removed when the task in run. Expiry can be disabled by setting expires_at to
an empty string or 0001-01-01T00:00:00Z (zero time). This is the default ifsnapshots.expiry is not set.
This adds the following new endpoint (see RESTful API for details):
PUT /1.0/containers/<name>/snapshots/<name>
`snapshot_expiry_creation`
Adds expires_at to container creation, allowing for override of a
snapshot's expiry at creation time.
`network_leases_location`
Introduces a Location field in the leases list.
This is used when querying a cluster to show what node a particular
lease was found on.
`resources_cpu_socket`
Add Socket field to CPU resources in case we get out of order socket information.
`resources_gpu`
Add a new GPU struct to the server resources, listing all usable GPUs on the system.
`resources_numa`
Shows the NUMA node for all CPUs and GPUs.
`kernel_features`
Exposes the state of optional kernel features through the server environment.
`id_map_current`
This introduces a new internal volatile.idmap.current key which is
used to track the current mapping for the container.
This effectively gives us:
volatile.last_state.idmap=> On-disk idmapvolatile.idmap.current=> Current kernel mapvolatile.idmap.next=> Next on-disk idmap
This is required to implement environments where the on-disk map isn't
changed but the kernel map is (e.g. idmapped mounts).
`event_location`
Expose the location of the generation of API events.
`storage_api_remote_volume_snapshots`
This allows migrating storage volumes including their snapshots.
`network_nat_address`
This introduces the ipv4.nat.address and ipv6.nat.address configuration keys for Incus bridges.
Those keys control the source address used for outbound traffic from the bridge.
`container_nic_routes`
This introduces the ipv4.routes and ipv6.routes properties on nic type devices.
This allows adding static routes on host to container's NIC.
`cluster_internal_copy`
This makes it possible to do a normal POST /1.0/containers to copy a
container between cluster nodes with Incus internally detecting whether a
migration is required.
`seccomp_notify`
If the kernel supports seccomp-based syscall interception Incus can be notified
by a container that a registered syscall has been performed. Incus can then
decide to trigger various actions.
`lxc_features`
This introduces the lxc_features section output from the incus info command
via the GET /1.0 route. It outputs the result of checks for key features being present in the
underlying LXC library.
`container_nic_ipvlan`
This introduces the ipvlan nic device type.
`network_vlan_sriov`
This introduces VLAN (vlan) and MAC filtering (security.mac_filtering) support for SR-IOV devices.
`storage_cephfs`
Add support for CephFS as a storage pool driver. This can only be used
for custom volumes, images and containers should be on Ceph (RBD)
instead.
`container_nic_ipfilter`
This introduces container IP filtering (security.ipv4_filtering and security.ipv6_filtering) support for bridged NIC devices.
`resources_v2`
Rework the resources API at /1.0/resources, especially:
- CPU
- Fix reporting to track sockets, cores and threads
- Track NUMA node per core
- Track base and turbo frequency per socket
- Track current frequency per core
- Add CPU cache information
- Export the CPU architecture
- Show online/offline status of threads
- Memory
- Add huge-pages tracking
- Track memory consumption per NUMA node too
- GPU
- Split DRM information to separate struct
- Export device names and nodes in DRM struct
- Export device name and node in NVIDIA struct
- Add SR-IOV VF tracking
`container_exec_user_group_cwd`
Adds support for specifying User, Group and Cwd during POST /1.0/containers/NAME/exec.
`container_syscall_intercept`
Adds the security.syscalls.intercept.* configuration keys to control
what system calls will be intercepted by Incus and processed with
elevated permissions.
`container_disk_shift`
Adds the shift property on disk devices which controls the use of the idmapped mounts overlay.
`storage_shifted`
Introduces a new security.shifted Boolean on storage volumes.
Setting it to true will allow multiple isolated containers to attach the
same storage volume while keeping the file system writable from all of
them.
This makes use of idmapped mounts as an overlay file system.
`resources_infiniband`
Export InfiniBand character device information (issm, umad, uverb) as part of the resources API.
`daemon_storage`
This introduces two new configuration keys storage.images_volume andstorage.backups_volume to allow for a storage volume on an existing
pool be used for storing the daemon-wide images and backups artifacts.
`instances`
This introduces the concept of instances, of which currently the only type is container.
`image_types`
This introduces support for a new Type field on images, indicating what type of images they are.
`resources_disk_sata`
Extends the disk resource API struct to include:
- Proper detection of SATA devices (type)
- Device path
- Drive RPM
- Block size
- Firmware version
- Serial number
`clustering_roles`
This adds a new roles attribute to cluster entries, exposing a list of
roles that the member serves in the cluster.
`images_expiry`
This allows for editing of the expiry date on images.
`resources_network_firmware`
Adds a FirmwareVersion field to network card entries.
`backup_compression_algorithm`
This adds support for a compression_algorithm property when creating a backup (POST /1.0/containers/<name>/backups).
Setting this property overrides the server default value (backups.compression_algorithm).
`ceph_data_pool_name`
This adds support for an optional argument (ceph.osd.data_pool_name) when creating
storage pools using Ceph RBD, when this argument is used the pool will store it's
actual data in the pool specified with data_pool_name while keeping the metadata
in the pool specified by pool_name.
`container_syscall_intercept_mount`
Adds the security.syscalls.intercept.mount,security.syscalls.intercept.mount.allowed, andsecurity.syscalls.intercept.mount.shift configuration keys to control whether
and how the mount system call will be intercepted by Incus and processed with
elevated permissions.
`compression_squashfs`
Adds support for importing/exporting of images/backups using SquashFS file system format.
`container_raw_mount`
This adds support for passing in raw mount options for disk devices.
`container_nic_routed`
This introduces the routed nic device type.
`container_syscall_intercept_mount_fuse`
Adds the security.syscalls.intercept.mount.fuse key. It can be used to
redirect file-system mounts to their fuse implementation. To this end, set e.g.security.syscalls.intercept.mount.fuse=ext4=fuse2fs.
`container_disk_ceph`
This allows for existing a Ceph RBD or CephFS to be directly connected to an Incus container.
`virtual-machines`
Add virtual machine support.
`image_profiles`
Allows a list of profiles to be applied to an image when launching a new container.
`clustering_architecture`
This adds a new architecture attribute to cluster members which indicates a cluster
member's architecture.
`resources_disk_id`
Add a new device_id field in the disk entries on the resources API.
`storage_lvm_stripes`
This adds the ability to use LVM stripes on normal volumes and thin pool volumes.
`vm_boot_priority`
Adds a boot.priority property on NIC and disk devices to control the boot order.
`unix_hotplug_devices`
Adds support for Unix char and block device hotplugging.
`api_filtering`
Adds support for filtering the result of a GET request for instances and images.
`instance_nic_network`
Adds support for the network property on a NIC device to allow a NIC to be linked to a managed network.
This allows it to inherit some of the network's settings and allows better validation of IP settings.
`clustering_sizing`
Support specifying a custom values for database voters and standbys.
The new cluster.max_voters and cluster.max_standby configuration keys were introduced
to specify to the ideal number of database voter and standbys.
`firewall_driver`
Adds the Firewall property to the ServerEnvironment struct indicating the firewall driver being used.
`storage_lvm_vg_force_reuse`
Introduces the ability to create a storage pool from an existing non-empty volume group.
This option should be used with care, as Incus can then not guarantee that volume name conflicts won't occur
with non-Incus created volumes in the same volume group.
This could also potentially lead to Incus deleting a non-Incus volume should name conflicts occur.
`container_syscall_intercept_hugetlbfs`
When mount syscall interception is enabled and hugetlbfs is specified as an
allowed file system type Incus will mount a separate hugetlbfs instance for the
container with the UID and GID mount options set to the container's root UID
and GID. This ensures that processes in the container can use huge pages.
`limits_hugepages`
This allows to limit the number of huge pages a container can use through thehugetlb cgroup. This means the hugetlb cgroup needs to be available. Note, that
limiting huge pages is recommended when intercepting the mount syscall for thehugetlbfs file system to avoid allowing the container to exhaust the host's
huge pages resources.
`container_nic_routed_gateway`
This introduces the ipv4.gateway and ipv6.gateway NIC configuration keys that can take a value of either auto ornone. The default value for the key if unspecified is auto. This will cause the current behavior of a default
gateway being added inside the container and the same gateway address being added to the host-side interface.
If the value is set to none then no default gateway nor will the address be added to the host-side interface.
This allows multiple routed NIC devices to be added to a container.
`projects_restrictions`
This introduces support for the restricted configuration key on project, which
can prevent the use of security-sensitive features in a project.
`custom_volume_snapshot_expiry`
This allows custom volume snapshots to expiry.
Expiry dates can be set individually, or by setting the snapshots.expiry configuration key on the parent custom volume which then automatically applies to all created snapshots.
`volume_snapshot_scheduling`
This adds support for custom volume snapshot scheduling. It introduces two new
configuration keys: snapshots.schedule andsnapshots.pattern. Snapshots can be created automatically up to every minute.
`trust_ca_certificates`
This allows for checking client certificates trusted by the provided CA (server.ca).
It can be enabled by setting core.trust_ca_certificates to true.
If enabled, it will perform the check, and bypass the trusted password if true.
An exception will be made if the connecting client certificate is in the provided CRL (ca.crl).
In this case, it will ask for the password.
`snapshot_disk_usage`
This adds a new size field to the output of /1.0/instances/<name>/snapshots/<snapshot> which represents the disk usage of the snapshot.
`clustering_edit_roles`
This adds a writable endpoint for cluster members, allowing the editing of their roles.
`container_nic_routed_host_address`
This introduces the ipv4.host_address and ipv6.host_address NIC configuration keys that can be used to control the
host-side veth interface's IP addresses. This can be useful when using multiple routed NICs at the same time and
needing a predictable next-hop address to use.
This also alters the behavior of ipv4.gateway and ipv6.gateway NIC configuration keys. When they are set to auto
the container will have its default gateway set to the value of ipv4.host_address or ipv6.host_address respectively.
The default values are:
ipv4.host_address: 169.254.0.1ipv6.host_address: fe80::1
This is backward compatible with the previous default behavior.
`container_nic_ipvlan_gateway`
This introduces the ipv4.gateway and ipv6.gateway NIC configuration keys that can take a value of either auto ornone. The default value for the key if unspecified is auto. This will cause the current behavior of a default
gateway being added inside the container and the same gateway address being added to the host-side interface.
If the value is set to none then no default gateway nor will the address be added to the host-side interface.
This allows multiple IPVLAN NIC devices to be added to a container.
`resources_usb_pci`
This adds USB and PCI devices to the output of /1.0/resources.
`resources_cpu_threads_numa`
This indicates that the numa_node field is now recorded per-thread
rather than per core as some hardware apparently puts threads in
different NUMA domains.
`resources_cpu_core_die`
Exposes the die_id information on each core.
`api_os`
This introduces two new fields in /1.0, os and os_version.
Those are taken from the OS-release data on the system.
`container_nic_routed_host_table`
This introduces the ipv4.host_table and ipv6.host_table NIC configuration keys that can be used to add static routes
for the instance's IPs to a custom policy routing table by ID.
`container_nic_ipvlan_host_table`
This introduces the ipv4.host_table and ipv6.host_table NIC configuration keys that can be used to add static routes
for the instance's IPs to a custom policy routing table by ID.
`container_nic_ipvlan_mode`
This introduces the mode NIC configuration key that can be used to switch the ipvlan mode into either l2 or l3s.
If not specified, the default value is l3s (which is the old behavior).
In l2 mode the ipv4.address and ipv6.address keys will accept addresses in either CIDR or singular formats.
If singular format is used, the default subnet size is taken to be /24 and /64 for IPv4 and IPv6 respectively.
In l2 mode the ipv4.gateway and ipv6.gateway keys accept only a singular IP address.
`resources_system`
This adds system information to the output of /1.0/resources.
`images_push_relay`
This adds the push and relay modes to image copy.
It also introduces the following new endpoint:
POST 1.0/images/<fingerprint>/export
`network_dns_search`
This introduces the dns.search configuration option on networks.
`container_nic_routed_limits`
This introduces limits.ingress, limits.egress and limits.max for routed NICs.
`instance_nic_bridged_vlan`
This introduces the vlan and vlan.tagged settings for bridged NICs.
vlan specifies the non-tagged VLAN to join, and vlan.tagged is a comma-delimited list of tagged VLANs to join.
`network_state_bond_bridge`
This adds a bridge and bond section to the /1.0/networks/NAME/state API.
Those contain additional state information relevant to those particular types.
Bond:
- Mode
- Transmit hash
- Up delay
- Down delay
- MII frequency
- MII state
- Lower devices
Bridge:
- ID
- Forward delay
- STP mode
- Default VLAN
- VLAN filtering
- Upper devices
`resources_cpu_isolated`
Add an Isolated property on CPU threads to indicate if the thread is
physically Online but is configured not to accept tasks.
`usedby_consistency`
This extension indicates that UsedBy should now be consistent with
suitable ?project= and ?target= when appropriate.
The 5 entities that have UsedBy are:
- Profiles
- Projects
- Networks
- Storage pools
- Storage volumes
`custom_block_volumes`
This adds support for creating and attaching custom block volumes to instances.
It introduces the new --type flag when creating custom storage volumes, and accepts the values fs and block.
`clustering_failure_domains`
This extension adds a new failure_domain field to the PUT /1.0/cluster/<node> API,
which can be used to set the failure domain of a node.
`container_syscall_filtering_allow_deny_syntax`
A number of new syscalls related container configuration keys were updated.
security.syscalls.deny_defaultsecurity.syscalls.deny_compatsecurity.syscalls.denysecurity.syscalls.allow
`resources_gpu_mdev`
Expose available mediated device profiles and devices in /1.0/resources.
`console_vga_type`
This extends the /1.0/console endpoint to take a ?type= argument, which can
be set to console (default) or vga (the new type added by this extension).
When doing a POST to /1.0//console?type=vga the data WebSocket
returned by the operation in the metadata field will be a bidirectional proxy
attached to a SPICE Unix socket of the target virtual machine.
`projects_limits_disk`
Add limits.disk to the available project configuration keys. If set, it limits
the total amount of disk space that instances volumes, custom volumes and images
volumes can use in the project.
`network_type_macvlan`
Adds support for additional network type macvlan and adds parent configuration key for this network type to
specify which parent interface should be used for creating NIC device interfaces on top of.
Also adds network configuration key support for macvlan NICs to allow them to specify the associated network of
the same type that they should use as the basis for the NIC device.
`network_type_sriov`
Adds support for additional network type sriov and adds parent configuration key for this network type to
specify which parent interface should be used for creating NIC device interfaces on top of.
Also adds network configuration key support for sriov NICs to allow them to specify the associated network of
the same type that they should use as the basis for the NIC device.
`container_syscall_intercept_bpf_devices`
This adds support to intercept the bpf syscall in containers. Specifically, it allows to manage device cgroup bpf programs.
`network_type_ovn`
Adds support for additional network type ovn with the ability to specify a bridge type network as the parent.
Introduces a new NIC device type of ovn which allows the network configuration key to specify which ovn
type network they should connect to.
Also introduces two new global configuration keys that apply to all ovn networks and NIC devices:
network.ovn.integration_bridge- the OVS integration bridge to use.network.ovn.northbound_connection- the OVN northbound database connection string.
`projects_networks`
Adds the features.networks configuration key to projects and the ability for a project to hold networks.
`projects_networks_restricted_uplinks`
Adds the restricted.networks.uplinks project configuration key to indicate (as a comma-delimited list) which networks
the networks created inside the project can use as their uplink network.
`custom_volume_backup`
Add custom volume backup support.
This includes the following new endpoints (see RESTful API for details):
GET /1.0/storage-pools//<type>/<volume>/backupsPOST /1.0/storage-pools//<type>/<volume>/backupsGET /1.0/storage-pools//<type>/<volume>/backups/<name>POST /1.0/storage-pools//<type>/<volume>/backups/<name>DELETE /1.0/storage-pools//<type>/<volume>/backups/<name>GET /1.0/storage-pools//<type>/<volume>/backups/<name>/export
The following existing endpoint has been modified:
POST /1.0/storage-pools//<type>/<volume>accepts the new source typebackup
`backup_override_name`
Adds Name field to InstanceBackupArgs to allow specifying a different instance name when restoring a backup.
Adds Name and PoolName fields to StoragePoolVolumeBackupArgs to allow specifying a different volume name
when restoring a custom volume backup.
`storage_rsync_compression`
Adds rsync.compression configuration key to storage pools. This key can be used
to disable compression in rsync while migrating storage pools.
`network_type_physical`
Adds support for additional network type physical that can be used as an uplink for ovn networks.
The interface specified by parent on the physical network will be connected to the ovn network's gateway.
`network_ovn_external_subnets`
Adds support for ovn networks to use external subnets from uplink networks.
Introduces the ipv4.routes and ipv6.routes setting on physical networks that defines the external routes
allowed to be used in child OVN networks in their ipv4.routes.external and ipv6.routes.external settings.
Introduces the restricted.networks.subnets project setting that specifies which external subnets are allowed to
be used by OVN networks inside the project (if not set then all routes defined on the uplink network are allowed).
`network_ovn_nat`
Adds support for ipv4.nat and ipv6.nat settings on ovn networks.
When creating the network if these settings are unspecified, and an equivalent IP address is being generated for
the subnet, then the appropriate NAT setting will added set to true.
If the setting is missing then the value is taken as false.
`network_ovn_external_routes_remove`
Removes the settings ipv4.routes.external and ipv6.routes.external from ovn networks.
The equivalent settings on the ovn NIC type can be used instead for this, rather than having to specify them
both at the network and NIC level.
`tpm_device_type`
This introduces the tpm device type.
`storage_zfs_clone_copy_rebase`
This introduces rebase as a value for zfs.clone_copy causing Incus to
track down any image dataset in the ancestry line and then perform
send/receive on top of that.
`gpu_mdev`
This adds support for virtual GPUs. It introduces the mdev configuration key for GPU devices which takes
a supported mdev type, e.g. i915-GVTg_V5_4.
`resources_pci_iommu`
This adds the IOMMUGroup field for PCI entries in the resources API.
`resources_network_usb`
Adds the usb_address field to the network card entries in the resources API.
`resources_disk_address`
Adds the usb_address and pci_address fields to the disk entries in the resources API.
`network_physical_ovn_ingress_mode`
Adds ovn.ingress_mode setting for physical networks.
Sets the method that OVN NIC external IPs will be advertised on uplink network.
Either l2proxy (proxy ARP/NDP) or routed.
`network_ovn_dhcp`
Adds ipv4.dhcp and ipv6.dhcp settings for ovn networks.
Allows DHCP (and RA for IPv6) to be disabled. Defaults to on.
`network_physical_routes_anycast`
Adds ipv4.routes.anycast and ipv6.routes.anycast Boolean settings for physical networks. Defaults to false.
Allows OVN networks using physical network as uplink to relax external subnet/route overlap detection when used
with ovn.ingress_mode=routed.
`projects_limits_instances`
Adds limits.instances to the available project configuration keys. If set, it
limits the total number of instances (VMs and containers) that can be used in the project.
`network_state_vlan`
This adds a vlan section to the /1.0/networks/NAME/state API.
Those contain additional state information relevant to VLAN interfaces:
lower_devicevid
`instance_nic_bridged_port_isolation`
This adds the security.port_isolation field for bridged NIC instances.
`instance_bulk_state_change`
Adds the following endpoint for bulk state change (see RESTful API for details):
PUT /1.0/instances
`network_gvrp`
This adds an optional gvrp property to macvlan and physical networks,
and to ipvlan, macvlan, routed and physical NIC devices.
When set, this specifies whether the VLAN should be registered using GARP VLAN
Registration Protocol. Defaults to false.
`instance_pool_move`
This adds a pool field to the POST /1.0/instances/NAME API,
allowing for easy move of an instance root disk between pools.
`gpu_sriov`
This adds support for SR-IOV enabled GPUs.
It introduces the sriov GPU type property.
`pci_device_type`
This introduces the pci device type.
`storage_volume_state`
Add new /1.0/storage-pools/POOL/volumes/VOLUME/state API endpoint to get usage data on a volume.
`network_acl`
This adds the concept of network ACLs to API under the API endpoint prefix /1.0/network-acls.
`migration_stateful`
Add a new migration.stateful configuration key.
`disk_state_quota`
This introduces the size.state device configuration key on disk devices.
`storage_ceph_features`
Adds a new ceph.rbd.features configuration key on storage pools to control the RBD features used for new volumes.
`projects_compression`
Adds new backups.compression_algorithm and images.compression_algorithm configuration keys which
allows configuration of backup and image compression per-project.
`projects_images_remote_cache_expiry`
Add new images.remote_cache_expiry configuration key to projects,
allowing for set number of days after which an unused cached remote image will be flushed.
`certificate_project`
Adds a new restricted property to certificates in the API as well asprojects holding a list of project names that the certificate has
access to.
`network_ovn_acl`
Adds a new security.acls property to OVN networks and OVN NICs, allowing Network ACLs to be applied.
`projects_images_auto_update`
Adds new images.auto_update_cached and images.auto_update_interval configuration keys which
allows configuration of images auto update in projects
`projects_restricted_cluster_target`
Adds new restricted.cluster.target configuration key to project which prevent the user from using --target
to specify what cluster member to place a workload on or the ability to move a workload between members.
`images_default_architecture`
Adds new images.default_architecture global configuration key and matching per-project key which lets user tell Incus
what architecture to go with when no specific one is specified as part of the image request.
`network_ovn_acl_defaults`
Adds new security.acls.default.{in,e}gress.action and security.acls.default.{in,e}gress.logged configuration keys for
OVN networks and NICs. This replaces the removed ACL default.action and default.logged keys.
`gpu_mig`
This adds support for NVIDIA MIG. It introduces the mig GPU type and associated configuration keys.
`project_usage`
Adds an API endpoint to get current resource allocations in a project.
Accessible at API GET /1.0/projects/<name>/state.
`network_bridge_acl`
Adds a new security.acls configuration key to bridge networks, allowing Network ACLs to be applied.
Also adds security.acls.default.{in,e}gress.action and security.acls.default.{in,e}gress.logged configuration keys for
specifying the default behavior for unmatched traffic.
`warnings`
Warning API for Incus.
This includes the following endpoints (see Restful API for details):
GET /1.0/warningsGET /1.0/warnings/PUT /1.0/warnings/DELETE /1.0/warnings/
`projects_restricted_backups_and_snapshots`
Adds new restricted.backups and restricted.snapshots configuration keys to project which
prevents the user from creation of backups and snapshots.
`clustering_join_token`
Adds POST /1.0/cluster/members API endpoint for requesting a join token used when adding new cluster members
without using the trust password.
`clustering_description`
Adds an editable description to the cluster members.
`server_trusted_proxy`
This introduces support for core.https_trusted_proxy which has Incus
parse a HAProxy style connection header on such connections and if
present, will rewrite the request's source address to that provided by
the proxy server.
`clustering_update_cert`
Adds PUT /1.0/cluster/certificate endpoint for updating the cluster
certificate across the whole cluster
`storage_api_project`
This adds support for copy/move custom storage volumes between projects.
`server_instance_driver_operational`
This modifies the driver output for the /1.0 endpoint to only include drivers which are actually supported and
operational on the server (as opposed to being included in Incus but not operational on the server).
`server_supported_storage_drivers`
This adds supported storage driver info to server environment info.
`event_lifecycle_requestor_address`
Adds a new address field to lifecycle requestor.
`resources_gpu_usb`
Add a new USBAddress (usb_address) field to ResourcesGPUCard (GPU entries) in the resources API.
`clustering_evacuation`
Adds POST /1.0/cluster/members/<name>/state endpoint for evacuating and restoring cluster members.
It also adds the configuration keys cluster.evacuate and volatile.evacuate.origin for setting the evacuation method (auto, stop or migrate) and the origin of any migrated instance respectively.
`network_ovn_nat_address`
This introduces the ipv4.nat.address and ipv6.nat.address configuration keys for Incus ovn networks.
Those keys control the source address used for outbound traffic from the OVN virtual network.
These keys can only be specified when the OVN network's uplink network has ovn.ingress_mode=routed.
`network_bgp`
This introduces support for Incus acting as a BGP router to advertise
routes to bridge and ovn networks.
This comes with the addition to global configuration of:
core.bgp_addresscore.bgp_asncore.bgp_routerid
The following network configurations keys (bridge and physical):
bgp.peers.<name>.addressbgp.peers.<name>.asnbgp.peers.<name>.password
The nexthop configuration keys (bridge):
bgp.ipv4.nexthopbgp.ipv6.nexthop
And the following NIC-specific configuration keys (bridged NIC type):
ipv4.routes.externalipv6.routes.external
`network_forward`
This introduces the networking address forward functionality. Allowing for bridge and ovn networks to define
external IP addresses that can be forwarded to internal IP(s) inside their respective networks.
`custom_volume_refresh`
Adds support for refresh during volume migration.
`network_counters_errors_dropped`
This adds the received and sent errors as well as inbound and outbound dropped packets to the network counters.
`metrics`
This adds metrics to Incus. It returns metrics of running instances using the OpenMetrics format.
This includes the following endpoints:
GET /1.0/metrics
`image_source_project`
Adds a new project field to POST /1.0/images allowing for the source project
to be set at image copy time.
`clustering_config`
Adds new config property to cluster members with configurable key/value pairs.
`network_peer`
This adds network peering to allow traffic to flow between OVN networks without leaving the OVN subsystem.
`linux_sysctl`
Adds new linux.sysctl.* configuration keys allowing users to modify certain kernel parameters
within containers.
`network_dns`
Introduces a built-in DNS server and zones API to provide DNS records for Incus instances.
This introduces the following server configuration key:
core.dns_address
The following network configuration key:
dns.zone.forwarddns.zone.reverse.ipv4dns.zone.reverse.ipv6
And the following project configuration key:
restricted.networks.zones
A new REST API is also introduced to manage DNS zones:
/1.0/network-zones(GET, POST)/1.0/network-zones/<name>(GET, PUT, PATCH, DELETE)
`ovn_nic_acceleration`
Adds new acceleration configuration key to OVN NICs which can be used for enabling hardware offloading.
It takes the values none or sriov.
`certificate_self_renewal`
This adds support for renewing a client's own trust certificate.
`instance_project_move`
This adds a project field to the POST /1.0/instances/NAME API,
allowing for easy move of an instance between projects.
`storage_volume_project_move`
This adds support for moving storage volume between projects.
`cloud_init`
This adds a new cloud-init configuration key namespace which contains the following keys:
cloud-init.vendor-datacloud-init.user-datacloud-init.network-config
It also adds a new endpoint /1.0/devices to /dev/incus which shows an instance's devices.
`network_dns_nat`
This introduces network.nat as a configuration option on network zones (DNS).
It defaults to the current behavior of generating records for all
instances NICs but if set to false, it will instruct Incus to only
generate records for externally reachable addresses.
`database_leader`
Adds new database-leader role which is assigned to cluster leader.
`instance_all_projects`
This adds support for displaying instances from all projects.
`clustering_groups`
Add support for grouping cluster members.
This introduces the following new endpoints:
/1.0/cluster/groups(GET, POST)/1.0/cluster/groups/<name>(GET, POST, PUT, PATCH, DELETE)
The following project restriction is added:
restricted.cluster.groups
`ceph_rbd_du`
Adds a new ceph.rbd.du Boolean on Ceph storage pools which allows
disabling the use of the potentially slow rbd du calls.
`instance_get_full`
This introduces a new recursion=1 mode for GET /1.0/instances/{name} which allows for the retrieval of
all instance structs, including the state, snapshots and backup structs.
`qemu_metrics`
This adds a new security.agent.metrics Boolean which defaults to true.
When set to false, it doesn't connect to the incus-agent for metrics and other state information, but relies on stats from QEMU.
`gpu_mig_uuid`
Adds support for the new MIG UUID format used by NVIDIA 470+ drivers (for example, MIG-74c6a31a-fde5-5c61-973b-70e12346c202),
the MIG- prefix can be omitted
This extension supersedes old mig.gi and mig.ci parameters which are kept for compatibility with old drivers and
cannot be set together.
`event_project`
Expose the project an API event belongs to.
`clustering_evacuation_live`
This adds live-migrate as a configuration option to cluster.evacuate, which forces live-migration
of instances during cluster evacuation.
`instance_allow_inconsistent_copy`
Adds allow_inconsistent field to instance source on POST /1.0/instances. If true, rsync will ignore thePartial transfer due to vanished source files (code 24) error when creating an instance from a copy.
`network_state_ovn`
This adds an ovn section to the /1.0/networks/NAME/state API which contains additional state information relevant to
OVN networks:
- chassis
`storage_volume_api_filtering`
Adds support for filtering the result of a GET request for storage volumes.
`image_restrictions`
This extension adds on to the image properties to include image restrictions/host requirements. These requirements
help determine the compatibility between an instance and the host system.
`storage_zfs_export`
Introduces the ability to disable zpool export when unmounting pool by setting zfs.export.
`network_dns_records`
This extends the network zones (DNS) API to add the ability to create and manage custom records.
This adds:
GET /1.0/network-zones/ZONE/recordsPOST /1.0/network-zones/ZONE/recordsGET /1.0/network-zones/ZONE/records/RECORDPUT /1.0/network-zones/ZONE/records/RECORDPATCH /1.0/network-zones/ZONE/records/RECORDDELETE /1.0/network-zones/ZONE/records/RECORD
`network_zones_all_projects`
This adds support for listing network zones across all projects through the all-projects parameter on the GET /1.0/network-zonesAPI.
`storage_zfs_reserve_space`
Adds ability to set the reservation/refreservation ZFS property along with quota/refquota.
`network_acl_log`
Adds a new GET /1.0/networks-acls/NAME/log API to retrieve ACL firewall logs.
`storage_zfs_blocksize`
Introduces a new zfs.blocksize property for ZFS storage volumes which allows to set volume block size.
`metrics_cpu_seconds`
This is used to detect whether Incus was fixed to output used CPU time in seconds rather than as milliseconds.
`instance_snapshot_never`
Adds a @never option to snapshots.schedule which allows disabling inheritance.
`certificate_token`
This adds token-based certificate addition to the trust store as a safer alternative to a trust password.
It adds the token field to POST /1.0/certificates.
`instance_nic_routed_neighbor_probe`
This adds the ability to disable the routed NIC IP neighbor probing for availability on the parent network.
Adds the ipv4.neighbor_probe and ipv6.neighbor_probe NIC settings. Defaulting to true if not specified.
`event_hub`
This adds support for event-hub cluster member role and the ServerEventMode environment field.
`agent_nic_config`
If set to true, on VM start-up the incus-agent will apply NIC configuration to change the names and MTU of the instance NIC
devices.
`projects_restricted_intercept`
Adds new restricted.container.intercept configuration key to allow usually safe system call interception options.
`metrics_authentication`
Introduces a new core.metrics_authentication server configuration option to
allow for the /1.0/metrics endpoint to be generally available without
client authentication.
`images_target_project`
Adds ability to copy image to a project different from the source.
`images_all_projects`
This adds support for listing images across all projects through the all-projects parameter on the GET /1.0/imagesAPI.
`cluster_migration_inconsistent_copy`
Adds allow_inconsistent field to POST /1.0/instances/<name>. Set to true to allow inconsistent copying between cluster
members.
`cluster_ovn_chassis`
Introduces a new ovn-chassis cluster role which allows for specifying what cluster member should act as an OVN chassis.
`container_syscall_intercept_sched_setscheduler`
Adds the security.syscalls.intercept.sched_setscheduler to allow advanced process priority management in containers.
`storage_lvm_thinpool_metadata_size`
Introduces the ability to specify the thin pool metadata volume size via storage.thinpool_metadata_size.
If this is not specified then the default is to let LVM pick an appropriate thin pool metadata volume size.
`storage_volume_state_total`
This adds total field to the GET /1.0/storage-pools/{name}/volumes/{type}/{volume}/state API.
`instance_file_head`
Implements HEAD on /1.0/instances/NAME/file.
`instances_nic_host_name`
This introduces the instances.nic.host_name server configuration key that can take a value of either random ormac. The default value for the key if unspecified is random. If it is set to random then use the random host interface names.
If it's set to mac, then generate a name in the form inc1122334455.
`image_copy_profile`
Adds ability to modify the set of profiles when image is copied.
`container_syscall_intercept_sysinfo`
Adds the security.syscalls.intercept.sysinfo to allow the sysinfo syscall to be populated with cgroup-based resource usage information.
`clustering_evacuation_mode`
This introduces a mode field to the evacuation request which allows
for overriding the evacuation mode traditionally set throughcluster.evacuate.
`resources_pci_vpd`
Adds a new VPD struct to the PCI resource entries.
This struct extracts vendor provided data including the full product name and additional key/value configuration pairs.
`qemu_raw_conf`
Introduces a raw.qemu.conf configuration key to override select sections of the generated qemu.conf.
`storage_cephfs_fscache`
Add support for fscache/cachefilesd on CephFS pools through a new cephfs.fscache configuration option.
`network_load_balancer`
This introduces the networking load balancer functionality. Allowing ovn networks to define port(s) on external
IP addresses that can be forwarded to one or more internal IP(s) inside their respective networks.
`vsock_api`
This introduces a bidirectional vsock interface which allows the incus-agent and the Incus server to communicate better.
`instance_ready_state`
This introduces a new Ready state for instances which can be set using /dev/incus.
`network_bgp_holdtime`
This introduces a new bgp.peers.<name>.holdtime configuration key to control the BGP hold time for a particular peer.
`storage_volumes_all_projects`
This introduces the ability to list storage volumes from all projects.
`metrics_memory_oom_total`
This introduces a new incus_memory_OOM_kills_total metric to the /1.0/metrics API.
It reports the number of times the out of memory killer (OOM) has been triggered.
`storage_buckets`
This introduces the storage bucket API. It allows the management of S3 object storage buckets for storage pools.
`storage_buckets_create_credentials`
This updates the storage bucket API to return initial admin credentials at bucket creation time.
`metrics_cpu_effective_total`
This introduces a new incus_cpu_effective_total metric to the /1.0/metrics API.
It reports the total number of effective CPUs.
`projects_networks_restricted_access`
Adds the restricted.networks.access project configuration key to indicate (as a comma-delimited list) which networks can be accessed inside the project.
If not specified, all networks are accessible (assuming it is also allowed by the restricted.devices.nic setting, described below).
This also introduces a change whereby network access is controlled by the project's restricted.devices.nic setting:
- If
restricted.devices.nicis set tomanaged(the default if not specified), only managed networks are accessible. - If
restricted.devices.nicis set toallow, all networks are accessible (dependent on therestricted.networks.accesssetting). - If
restricted.devices.nicis set toblock, no networks are accessible.
`storage_buckets_local`
This introduces the ability to use storage buckets on local storage pools by setting the new core.storage_buckets_address global configuration setting.
`loki`
This adds support for sending life cycle and logging events to a Loki server.
It adds the following global configuration keys:
loki.api.ca_cert: CA certificate which can be used when sending events to the Loki serverloki.api.url: URL to the Loki server (protocol, name or IP and port)loki.auth.usernameandloki.auth.password: Used if Loki is behind a reverse proxy with basic authentication enabledloki.labels: Comma-separated list of values which are to be used as labels for Loki events.loki.loglevel: Minimum log level for events sent to the Loki server.loki.types: Types of events which are to be sent to the Loki server (lifecycleand/orlogging).
`acme`
This adds ACME support, which allows Let's Encrypt or other ACME services to issue certificates.
It adds the following global configuration keys:
acme.domain: The domain for which the certificate should be issued.acme.email: The email address used for the account of the ACME service.acme.ca_url: The directory URL of the ACME service, defaults tohttps://acme-v02.api.letsencrypt.org/directory.
It also adds the following endpoint, which is required for the HTTP-01 challenge:
/.well-known/acme-challenge/<token>
`internal_metrics`
This adds internal metrics to the list of metrics.
These include:
- Total running operations
- Total active warnings
- Daemon uptime in seconds
- Go memory stats
- Number of goroutines
`cluster_join_token_expiry`
This adds an expiry to cluster join tokens which defaults to 3 hours, but can be changed by setting the cluster.join_token_expiry configuration key.
`remote_token_expiry`
This adds an expiry to remote add join tokens.
It can be set in the core.remote_token_expiry configuration key, and default to no expiry.
`storage_volumes_created_at`
This change adds support for storing the creation date and time of storage volumes and their snapshots.
This adds the CreatedAt field to the StorageVolume and StorageVolumeSnapshot API types.
`cpu_hotplug`
This adds CPU hotplugging for VMs.
Hotplugging is disabled when using CPU pinning, because this would require hotplugging NUMA devices as well, which is not possible.
`projects_networks_zones`
This adds support for the features.networks.zones project feature, which changes which project network zones are
associated with when they are created. Previously network zones were tied to the value of features.networks,
meaning they were created in the same project as networks were.
Now this has been decoupled from features.networks to allow projects that share a network in the default project
(i.e those with features.networks=false) to have their own project level DNS zones that give a project oriented
"view" of the addresses on that shared network (which only includes addresses from instances in their project).
This also introduces a change to the network dns.zone.forward setting, which now accepts a comma-separated of
DNS zone names (a maximum of one per project) in order to associate a shared network with multiple zones.
No change to the dns.zone.reverse.* settings have been made, they still only allow a single DNS zone to be set.
However the resulting zone content that is generated now includes PTR records covering addresses from all
projects that are referencing that network via one of their forward zones.
Existing projects that have features.networks=true will have features.networks.zones=true set automatically,
but new projects will need to specify this explicitly.
`instance_nic_txqueuelength`
Adds a txqueuelen key to control the txqueuelen parameter of the NIC device.
`cluster_member_state`
Adds GET /1.0/cluster/members/<member>/state API endpoint and associated ClusterMemberState API response type.
`instances_placement_scriptlet`
Adds support for a Starlark scriptlet to be provided to Incus to allow customized logic that controls placement of new instances in a cluster.
The Starlark scriptlet is provided to Incus via the new global configuration option instances.placement.scriptlet.
`storage_pool_source_wipe`
Adds support for a source.wipe Boolean on the storage pool, indicating
that Incus should wipe partition headers off the requested disk rather
than potentially fail due to pre-existing file systems.
`zfs_block_mode`
This adds support for using ZFS block {spellexception}filesystem volumes allowing the use of different file systems on top of ZFS.
This adds the following new configuration options for ZFS storage pools:
volume.zfs.block_modevolume.block.mount_optionsvolume.block.filesystem
`instance_generation_id`
Adds support for instance generation ID. The VM or container generation ID will change whenever the instance's place in time moves backwards. As of now, the generation ID is only exposed through to VM type instances. This allows for the VM guest OS to reinitialize any state it needs to avoid duplicating potential state that has already occurred:
volatile.uuid.generation
`disk_io_cache`
This introduces a new io.cache property to disk devices which can be used to override the VM caching behavior.
`amd_sev`
Adds support for AMD SEV (Secure Encrypted Virtualization) that can be used to encrypt the memory of a guest VM.
This adds the following new configuration options for SEV encryption:
security.sev: (bool) is SEV enabled for this VMsecurity.sev.policy.es: (bool) is SEV-ES enabled for this VMsecurity.sev.session.dh: (string) guest owner'sbase64-encoded Diffie-Hellman keysecurity.sev.session.data: (string) guest owner'sbase64-encoded session blob
`storage_pool_loop_resize`
This allows growing loop file backed storage pools by changing the size setting of the pool.
`migration_vm_live`
This adds support for performing VM QEMU to QEMU live migration for both shared storage (clustered Ceph) and
non-shared storage pools.
This also adds the CRIUType_VM_QEMU value of 3 for the migration CRIUType protobuf field.
`ovn_nic_nesting`
This adds support for nesting an ovn NIC inside another ovn NIC on the same instance.
This allows for an OVN logical switch port to be tunneled inside another OVN NIC using VLAN tagging.
This feature is configured by specifying the parent NIC name using the nested property and the VLAN ID to use for tunneling with the vlan property.
`oidc`
This adds support for OpenID Connect (OIDC) authentication.
This adds the following new configuration keys:
oidc.issueroidc.client.idoidc.audience
`network_ovn_l3only`
This adds the ability to set an ovn network into "layer 3 only" mode.
This mode can be enabled at IPv4 or IPv6 level using ipv4.l3only and ipv6.l3only configuration options respectively.
With this mode enabled the following changes are made to the network:
- The virtual router's internal port address will be configured with a single host netmask (e.g. /32 for IPv4 or /128 for IPv6).
- Static routes for active instance NIC addresses will be added to the virtual router.
- A discard route for the entire internal subnet will be added to the virtual router to prevent packets destined for inactive addresses from escaping to the uplink network.
- The DHCPv4 server will be configured to indicate that a netmask of 255.255.255.255 be used for instance configuration.
`ovn_nic_acceleration_vdpa`
This updates the ovn_nic_acceleration API extension. The acceleration configuration key for OVN NICs can now takes the value vdpa to support Virtual Data Path Acceleration (VDPA).
`cluster_healing`
This adds cluster healing which automatically evacuates offline cluster members.
This adds the following new configuration key:
cluster.healing_threshold
The configuration key takes an integer, and can be disabled by setting it to 0 (default). If set, the value represents the threshold after which an offline cluster member is to be evacuated. In case the value is lower than cluster.offline_threshold, that value will be used instead.
When the offline cluster member is evacuated, only remote-backed instances will be migrated. Local instances will be ignored as there is no way of migrating them once the cluster member is offline.
`instances_state_total`
This extension adds a new total field to InstanceStateDisk and InstanceStateMemory, both part of the instance's state API.
`auth_user`
Add current user details to the main API endpoint.
This introduces:
auth_user_nameauth_user_method
`security_csm`
Introduce a new security.csm configuration key to control the use ofCSM (Compatibility Support Module) to allow legacy operating systems to
be run in Incus VMs.
`instances_rebuild`
This extension adds the ability to rebuild an instance with the same origin image, alternate image or as empty. A new POST /1.0/instances/<name>/rebuild?project= API endpoint has been added as well as a new CLI command incus rebuild.
`numa_cpu_placement`
This adds the possibility to place a set of CPUs in a desired set of NUMA nodes.
This adds the following new configuration key:
limits.cpu.nodes: (string) comma-separated list of NUMA node IDs or NUMA node ID ranges to place the CPUs (chosen with a dynamic value oflimits.cpu) in.
`custom_volume_iso`
This adds the possibility to import ISO images as custom storage volumes.
This adds the --type flag to incus storage volume import.
`network_allocations`
This adds the possibility to list an Incus deployment's network allocations.
Through the incus network list-allocations command and the --project | --all-projects flags,
you can list all the used IP addresses, hardware addresses (for instances), resource URIs and whether it uses NAT for
each instance, network, network forward and network load-balancer.
`zfs_delegate`
This implements a new zfs.delegate volume Boolean for volumes on a ZFS storage driver.
When enabled and a suitable system is in use (requires ZFS 2.2 or higher), the ZFS dataset will be delegated to the container, allowing for its use through the zfs command line tool.
`storage_api_remote_volume_snapshot_copy`
This allows copying storage volume snapshots to and from remotes.
`operations_get_query_all_projects`
This introduces support for the all-projects query parameter for the GET API calls to both /1.0/operations and /1.0/operations?recursion=1.
This parameter allows bypassing the project name filter.
`metadata_configuration`
Adds the GET /1.0/metadata/configuration API endpoint to retrieve the generated metadata configuration in a JSON format. The JSON structure adopts the structure "configs" > `ENTITY` > `ENTITY_SECTION` > "keys" > [<CONFIG_OPTION_0>, <CONFIG_OPTION_1>, ...].
`syslog_socket`
This introduces a syslog socket that can receive syslog formatted log messages. These can be viewed in the events API and incus monitor, and can be forwarded to Loki. To enable this feature, set core.syslog_socket to true.
`event_lifecycle_name_and_project`
This adds the fields Name and Project to lifecycle events.
`instances_nic_limits_priority`
This introduces a new per-NIC limits.priority option that works with both cgroup1 and cgroup2 unlike the deprecated limits.network.priority instance setting, which only worked with cgroup1.
`disk_initial_volume_configuration`
This API extension provides the capability to set initial volume configurations for instance root devices.
Initial volume configurations are prefixed with initial. and can be specified either through profiles or directly
during instance initialization using the --device flag.
Note that these configuration are applied only at the time of instance creation and subsequent modifications have
no effect on existing devices.
`operation_wait`
This API extension indicates that the /1.0/operations/{id}/wait endpoint exists on the server. This indicates to the client
that the endpoint can be used to wait for an operation to complete rather than waiting for an operation event via the/1.0/events endpoint.
`image_restriction_privileged`
This extension adds a new image restriction, requirements.privileged which when false indicates that an image cannot be run in a privileged container.
`cluster_internal_custom_volume_copy`
This extension adds support for copying and moving custom storage volumes within a cluster with a single API call.
Calling POST /1.0/storage-pools//custom?target=<target> will copy the custom volume specified in the source part of the request.
Calling POST /1.0/storage-pools//custom/<volume>?target=<target> will move the custom volume from the source, specified in the source part of the request, to the target.
`disk_io_bus`
This introduces a new io.bus property to disk devices which can be used to override the bus the disk is attached to.
`storage_cephfs_create_missing`
This introduces the configuration keys cephfs.create_missing, cephfs.osd_pg_num, cephfs.meta_pool and cephfs.osd_pool to be used when adding a cephfs storage pool to instruct Incus to create the necessary entities for the storage pool, if they do not exist.
`instance_move_config`
This API extension provides the ability to use flags --profile, --no-profile, --device, and --config
when moving an instance between projects and/or storage pools.
`ovn_ssl_config`
This introduces new server configuration keys to provide the SSL CA and client key pair to access the OVN databases.
The new configuration keys are network.ovn.ca_cert, network.ovn.client_cert and network.ovn.client_key.
`certificate_description`
Adds a description field to certificate.
`disk_io_bus_virtio_blk`
Adds a new virtio-blk value for io.bus on disk devices which allows
for the attached disk to be connected to the virtio-blk bus.
`loki_config_instance`
Adds a new loki.instance server configuration key to customize the instance field in Loki events.
This can be used to expose the name of the cluster rather than the individual system name sending
the event as that's usually already covered by the location field.
`instance_create_start`
Adds a new start field to the POST /1.0/instances API which when set
to true will have the instance automatically start upon creation.
In this scenario, the creation and startup is part of a single background operation.
`clustering_evacuation_stop_options`
This introduces new options for the cluster.evacuate option:
stateful-stophas the instance store its state to disk to be resume on restore.force-stophas the instance immediately stopped without waiting for it to shut down.
`boot_host_shutdown_action`
This introduces a new boot.host_shutdown_action instance configuration key which can be used to override the default stop behavior on system shutdown.
It supports the value stop, stateful-stop and force-stop.
`agent_config_drive`
This introduces a new agent:config disk source which can be used to expose an ISO to the VM guest containing the agent and its configuration.
`network_state_ovn_lr`
Adds a new LogicalRouter field to the NetworkStateOVN struct which is part of the GET /1.0/networks/NAME/state API.
This is used to get the OVN logical router name.
`image_template_permissions`
This adds uid, gid and mode fields to the image metadata template entries.
`storage_bucket_backup`
Add storage bucket backup support.
This includes the following new endpoints (see RESTful API for details):
GET /1.0/storage-pools//buckets//backupsPOST /1.0/storage-pools//buckets//backupsGET /1.0/storage-pools//buckets//backups/<name>POST /1.0/storage-pools//buckets//backups/<name>DELETE /1.0/storage-pools//buckets//backups/<name>GET /1.0/storage-pools//buckets//backups/<name>/export
`storage_lvm_cluster`
This adds a new lvmcluster storage driver which makes use of LVM shared VG through lvmlockd.
With this, it's possible to have a single shared LVM pool across multiple servers so long as they all see the same backing device(s).
`shared_custom_block_volumes`
This adds a new configuration key security.shared to custom block volumes.
If unset or false, the custom block volume cannot be attached to multiple instances.
This feature was added to prevent data loss which can happen when custom block volumes are attached to multiple instances at once.
`auth_tls_jwt`
This adds the ability to use a signed JSON Web Token (JWT) instead of using the TLS client certificate directly.
In this scenario, the client derives a JWT from their own TLS client certificate providing it as a bearer token through the Authorization HTTP header.
The JWT must have the certificate's fingerprint as its Subject and must be signed by the client's private key.
`oidc_claim`
This introduces a new oidc.claim server configuration key which can be used to specify what OpenID Connect claim to use as the username.
`device_usb_serial`
This adds a new configuration key serial for device type usb.
Feature has been added, to make it possible to distinguish between devices with identical vendorid and productid.
`numa_cpu_balanced`
This adds balanced as a new value for limits.cpu.nodes.
When set to balanced, Incus will attempt to select the least busy NUMA
node at startup time for the instance, trying to keep the load spread
across NUMA nodes on the system.
`image_restriction_nesting`
This extension adds a new image restriction, requirements.nesting which when true indicates that an image cannot be run without nesting.
`network_integrations`
Adds the concept of network integrations and initial support for OVN Interconnection.
New API:
/1.0/network-integrations(GET, POST)/1.0/network-integrations/NAME(GET, PUT, PATCH, DELETE, POST)
Each integration is made of:
- name
- description
- type (only
ovnfor now) - configuration
ovn.northbound_connection(database connection string for the OVN Interconnection database)ovn.ca_cert(optional, SSL CA certificate for the OVN Interconnection database)ovn.client_cert(optional, SSL client certificate to connect to the OVN Interconnection database)ovn.client_key(optional, SSL client key to connect to the OVN Interconnection database)ovn.transit.pattern(Pongo2 template to generate the transit switch name)
Those integrations attach to network peers through some new fields:
type(localfor current behavior,remotefor integrations)target_integration(reference to the integration)
`instance_memory_swap_bytes`
This extends limits.memory.swap to allow for a total limit in bytes.
`network_bridge_external_create`
This adds the ability for bridge.external_interfaces to create a parent interface using a interface/parent/vlan syntax.
`storage_zfs_vdev`
This adds support for mirror, raidz1 and raidz2 ZFS vdev types by extending storage source configuration.
`container_migration_stateful`
A migration.stateful configuration key was introduced.
It's a Boolean flag set to true whenever the container is in a stateful mode
during the start, stop, and snapshot functions.
This makes it less likely for users to run into CRIU errors when copying
containers to another system.
`profiles_all_projects`
This adds support for listing profiles across all projects through the all-projects parameter on the GET /1.0/profilesAPI.
`instances_scriptlet_get_instances`
This allows the instance scriptlet to fetch a list of instances given an optional Project or Location filter.
`instances_scriptlet_get_cluster_members`
This allows the instance scriptlet to fetch a list of cluster members given an optional cluster group.
`instances_scriptlet_get_project`
This allows the instance scriptlet to fetch a project given name of a project.
`network_acl_stateless`
This adds support for stateless rules in network ACLs.
`instance_state_started_at`
This adds a started_at timestamp to the instance state API.
`networks_all_projects`
This adds support for listing networks across all projects through the all-projects parameter on the GET /1.0/networksAPI.
`network_acls_all_projects`
This adds support for listing network ACLs across all projects through the all-projects parameter on the GET /1.0/network-aclsAPI.
`storage_buckets_all_projects`
This adds support for listing storage buckets across all projects through the all-projects parameter on the GET /1.0/storage-pools/POOL/bucketsAPI.
`resources_load`
Add a new Load section to the resources API.
`instance_access`
This introduces a new API endpoint at GET /1.0/instances/NAME/access which exposes who can interact with the instance and what role they have.
`project_access`
This introduces a new API endpoint at GET /1.0/projects/NAME/access which exposes who can interact with the project and what role they have.
`projects_force_delete`
This extends DELETE /1.0/projects to allow ?force=true which will
delete everything inside of the project along with the project itself.
`resources_cpu_flags`
This exposes the CPU flags/extensions in our resources API to check the CPU features.
`disk_io_bus_cache_filesystem`
This adds support for both io.bus and io.cache to disks that are backed by a file system.
`instance_oci`
Adds initial support for running OCI containers.
`clustering_groups_config`
This introduces a standard key/value config option to clustering
groups which will allow placing some restrictions or configuration on
those groups.
`instances_lxcfs_per_instance`
This introduces a new instances.lxcfs.per_instance server
configuration key to control whether to run LXCFS per instance instead
of globally on the system.
`clustering_groups_vm_cpu_definition`
This introduces a few new configuration options to control the virtual machine CPU definitions through cluster group configuration.
The new configuration keys are:
instances.vm.cpu.ARCHITECTURE.baselineinstances.vm.cpu.ARCHITECTURE.flag
`disk_volume_subpath`
This introduces the ability to access the sub-path of a file system custom volume by using the source=volume/path syntax.
`projects_limits_disk_pool`
This introduces per-pool project disk limits, introducing a limits.disk.pool.NAME configuration option to the project limits.
`network_ovn_isolated`
This allows using none as the uplink network for an OVN network, making the network isolated.
`qemu_raw_qmp`
This adds new configuration options to virtual machines to directly issue QMP commands at various stages of startup:
raw.qemu.qmp.earlyraw.qemu.qmp.pre-startraw.qemu.qmp.post-start
`network_load_balancer_health_check`
This adds the ability to perform health checks for load balancer backends.
The following new configuration options are introduced:
healthcheckhealthcheck.intervalhealthcheck.timeouthealthcheck.failure_counthealthcheck.success_count
`oidc_scopes`
This introduces a new oidc.scopes server configuration key which can take a comma separate list of OIDC scopes to request from the identity provider.
`network_integrations_peer_name`
This extends ovn.transit.pattern to allow peerName as a template variable.
`qemu_scriptlet`
This adds the ability to run a scriptlet at various stages of startup: using the raw.qemu.scriptlet configuration key.
`instance_auto_restart`
This introduces a new boot.autorestart configuration key which when
set to true will have the instance automatically be restarted upon
unexpected exit for up to 10 times over a 1 minute period.
`storage_lvm_metadatasize`
This introduces a new lvm.metadata_size option for LVM storage pools
which allows overriding the default metadata size when creating a new
LVM physical volume.
`ovn_nic_promiscuous`
This implements a new security.promiscuous configuration option on OVN NICs.
`ovn_nic_ip_address_none`
This adds none as a value for ipv4.address and ipv6.address for OVN NICs.
`instances_state_os_info`
This extension adds a pointer to an InstanceStateOSInfo struct to the instance's state API.
`network_load_balancer_state`
This adds a new /1.0/networks/NAME/load-balancers/IP/state API endpoint
which returns load-balancer health check information (when configured).
`instance_nic_macvlan_mode`
This adds a mode configuration key on macvlan network interfaces which allows for configuring the Macvlan mode.
`storage_lvm_cluster_create`
Allow for creating new LVM cluster pools by setting the source to the shared block device.
`network_ovn_external_interfaces`
This adds support for bridge.external_interfaces on OVN networks.
`instances_scriptlet_get_instances_count`
This allows the instance scriptlet to fetch the count instances given an optional Project or Location filter as well as including pending instances.
`cluster_rebalance`
This adds automatic live-migration to balance load on cluster again.
As part of this, the following configuration options have been added:
cluster.rebalance.batchcluster.rebalance.cooldowncluster.rebalance.intervalcluster.rebalance.threshold
`custom_volume_refresh_exclude_older_snapshots`
This adds support for excluding source snapshots earlier than latest target snapshot.
`storage_initial_owner`
This adds ability to set the initial owner of a custom volume.
The following configuration options have been added:
initial.gidinitial.modeinitial.uid
`storage_live_migration`
This adds support for virtual-machines live-migration between storage pools.
`instance_console_screenshot`
This adds support to take screenshots of the current VGA console of a VM.
`image_import_alias`
Adds a new X-Incus-aliases HTTP header to set aliases while uploading an image.
`authorization_scriptlet`
This adds the ability to define a scriptlet in a new configuration key, authorization.scriptlet, managing authorization on the Incus cluster.
`console_force`
This adds support for forcing a connection to the console, even if there is already an active session.
It introduces the new --force flag for connecting to the instance console.
`network_ovn_state_addresses`
This adds extra fields to the OVN network state struct for the IPv4 and IPv6 addresses used on the uplink.
`qemu_scriptlet_config`
This extends the QEMU scriptlet feature by allowing to modify QEMU configuration before a VM starts, and passing information about the instance to the scriptlet.
`network_bridge_acl_devices`
This adds support for device ACLs when attached to a bridged network.
`instance_debug_memory`
Add new memory dump API at /1.0/instances/NAME/debug/memory.
`init_preseed_storage_volumes`
This API extension provides the ability to configure storage volumes in preseed init.
`init_preseed_profile_project`
This API extension provides the ability to specify the project as part of profile definitions in preseed init.
`instance_nic_routed_host_address`
Adds support for specifying the VRF to add the routes to.
`instance_smbios11`
A new category of configuration options, smbios11.XYZ has been added
which allows passing key/value pairs through SMBIOS Type 11 on systems that
support it.
`api_filtering_extended`
This extends the API filtering mechanism to all API collections.
`acme_dns01`
Adds support for DNS-01 challenge to the Incus ACME support for certificate generation.
`security_iommu`
Introduce a new security.iommu configuration key to control whether to
enable IOMMU emulation. This is done through virtio_iommu on Linux and the emulated Intel IOMMU on Windows.
`network_ipv4_dhcp_routes`
Introduces a new ipv4.dhcp.routes configuration option on bridged and OVN networks.
This allows specifying pairs of CIDR networks and gateway address to be announced by the DHCP server.
`network_state_ovn_ls`
Adds a new LogicalSwitch field to the NetworkStateOVN struct which is part of the GET /1.0/networks/NAME/state API.
This is used to get the OVN logical switch name.
`network_dns_nameservers`
Introduces the dns.nameservers configuration option on bridged and OVN networks.
This allows specifying IPv4 and IPv6 DNS server addresses to be announced by the DHCP server and via Router Advertisements.
`acme_http01_port`
Adds acme.http.port to control an alternative HTTP port for HTTP-01 validation.
`network_ovn_ipv4_dhcp_expiry`
Introduces ipv4.dhcp.expiry for OVN networks.
`instance_state_cpu_time`
This adds an allocated_time field below CPU in the instance state API.
`network_io_bus`
This introduces a new io.bus property for compatible network devices allowing to choose between virtio (default) and usb.
`disk_io_bus_usb`
Adds a new usb value for io.bus on disk devices.
`storage_driver_linstor`
This adds a LINSTOR storage driver.
`instance_oci_entrypoint`
This introduces a set of new configuration options on the container to configure the OCI entry point:
oci.entrypointoci.cwdoci.uidoci.gid
Those are initialized at creation time using the values from the OCI image.
`network_address_set`
This adds the concept of network address sets to API under the API endpoint prefix /1.0/network-address-sets.
`server_logging`
This implements a new set of logging configuration keys on the server, allowing for multiple logging targets.
The former loki configuration keys are being transitioned over as part of this.
`network_forward_snat`
Adds a snat configuration option for network forwards which will cause any DNAT to get a matching SNAT applied.
So new connections from the target will appear as coming from the network forward address.
This is limited to bridged networks as OVN doesn't support flexible enough SNAT for this.
`memory_hotplug`
This adds memory hotplugging for VMs, allowing them to add memory at runtime without rebooting.
`instance_nic_routed_host_tables`
This adds support for specifying host-routing tables on nic devices that use the routed mode.
`instance_publish_split`
This adds support for creating a split format image out of an existing instance.
`init_preseed_certificates`
This API extension provides the ability to configure certificates in preseed init.
`custom_volume_sftp`
This adds the SFTP API to custom storage volumes.
`network_ovn_external_nic_address`
This adds support for configuring a custom external IPv4 or IPv6 address
for a given instance so long as that address is available through a
network forward.
`network_physical_gateway_hwaddr`
Allows setting the MAC address of the IPv4 and IPv6 gateways when used with OVN.
`backup_s3_upload`
Adds support for immediately uploading instance or volume backups to an S3 compatible endpoint.
`snapshot_manual_expiry`
Introduces a snapshots.expiry.manual configuration key to both
instances and storage volumes which allows overriding the default expiry
value for snapshots created directly by the user as opposed to created
on schedule.
`resources_cpu_address_sizes`
This adds tracking of CPU address sizes in the resources API.
The main use of this is within clusters to calculate a cluster-wide
maximum memory amount for hotplugging into virtual machines.
`disk_attached`
This introduces a new attached property to disk devices describing whether disks are attached or ejected.
`limits_memory_hotplug`
The limits.memory.hotplug option controls how memory hotplug is handled for the virtual machine.
It can be set to false to completely disable memory hotplugging.
Alternatively, it can be set to a value that defines the maximum amount of memory the VM can reach through hotplug.
This value must be greater than or equal to limits.memory.
`disk_wwn`
Add support for setting the disk World Wide Name property through the new wwn disk configuration option.
`server_logging_webhook`
This adds support for basic webhook as a logging target.
It can be selected through logging.NAME.target.type with the webhook value.
The following target keys are supported:
logging.NAME.target.address(URL of the target)logging.NAME.target.ca_cert(Certificate when using an HTTPS target with a self-signed certificate)logging.NAME.target.username(Username for HTTP authentication)logging.NAME.target.password(Password for HTTP authentication)logging.NAME.target.retry(How many times to retry the transmission)
The webhook data matches what's sent over the existing events API.
`storage_driver_truenas`
This adds a TrueNAS storage driver.
`container_disk_tmpfs`
This adds tmpfs support for disk devices.
source=tmpfs:mounts a tmpfs file system, respectingsize,uid,gidandmodeoptionssource=tmpfs-overlay:same as tmpfs but with additional overlayfs behavior
`instance_limits_oom`
This adds a new limits.memory.oom_priority configuration option to
configure the Out Of Memory score for the container or virtual-machine.
`backup_override_config`
This adds support for overriding both configuration and devices during
backup import by using the X-Incus-config and X-Incus-devices HTTP
headers.
`network_ovn_tunnels`
This adds support for network tunnels to OVN networks.
`init_preseed_cluster_groups`
This API extension provides the ability to configure cluster groups in preseed init.
`usb_attached`
This introduces a new attached property to USB devices describing whether they are plugged in or not.
`backup_iso`
This allows to backup ISO custom volumes by simply copying them. It enables exporting ISO volumes with incus storage volume export and get an ISO back.
`instance_systemd_credentials`
This adds two categories of configuration options, systemd.credential.* and systemd.credential-binary.*, which allow passing systemd credentials through a bind-mounted directory for containers and SMBIOS Type 11 for virtual machines.
`cluster_group_usedby`
A used_by field was added to the GET /1.0/cluster/groups/{name} endpoint.used_by holds the URLs of all instances and projects using the cluster group.
`bpf_token_delegation`
This adds support for eBPF token delegation.
`file_storage_volume`
This adds file transfer API on the custom volumes.
Implements DELETE, GET, HEAD, POST operations on the /1.0/storage-pools/{poolName}/volumes/{type}/{volumeName}/files endpoint.
`network_hwaddr_pattern`
This adds network.hwaddr_pattern global and per-project configuration keys to customize MAC address allocation.
`storage_volume_full`
This adds ?recursion=1 support to /1.0/storage-pools/POOL/volumes/VOLUME and ?recursion=2 support to /1.0/storage-pools/POOL/volumes.
As well as a matching StorageVolumeFull struct.
`storage_bucket_full`
This adds ?recursion=1 support to /1.0/storage-pools/POOL/buckets/VOLUME and ?recursion=2 support to /1.0/storage-pools/POOL/buckets.
As well as a matching StorageBucketFull struct.
`device_pci_firmware`
This extension introduces a new boolean firmware option for PCI devices.
When set to false, Incus tells QEMU to disable the ROM-BAR (rombar=0) for the device.
`resources_serial`
This adds serial device tracking to the resources API.
`ovn_nic_limits`
This adds support for limits.egress, limits.ingress, limits.max and limits.priority on ovn type network devices.
`storage_lvmcluster_qcow2`
This adds support for running virtual machines from QCOW2 images. Support is currently limited to lvmcluster storage driver.
`oidc_allowed_subnets`
This indicates support by Incus for the custom incus.allowed_subnets OIDC claim.
`file_delete_force`
This adds a new X-Incus-force HTTP header that when set to true allows for recursive deletion of instance or custom volume files.
`nic_sriov_select_ext`
Adds support for selecting an SR-IOV network interface by vendor ID, product ID, or PCI address.
`network_zones_dns_contact`
Adds a dns.contact configuration key to network zones.
`nic_attached_connected`
This introduces two new properties for NICs:
attached, behaving like theattachedkey for disk and USB devices;connected, setting the up/down link state for the NIC (when supported).
`nic_sriov_security_trusted`
This introduces a new property for SR-IOV NICs:
security.trustedallows setting thetrustedflag for the virtual function if the parent NIC supports it.
`direct_backup`
This allows to perform backups of instances, custom storage volumes and storage buckets without disk buffering when the Accept header is set to application/octet-stream in the respective POST API endpoints. Doing so, said POST endpoints return the data stream instead of creating a backup entry in the database.
`instance_snapshot_disk_only_restore`
This adds support for only restoring the disk of a snapshotted instance.
`unix_hotplug_pci`
Adds a pci configuration key on the unix-hotplug device to allow filtering based on the USB controller PCI address.
`cluster_evacuating_restoring`
Introduces new Evacuating and Restoring cluster member states.
`projects_restricted_image_servers`
Introduces a new restricted.images.servers project configuration option.
This allows specifying a comma separate list of image server domains from which the user may download images.
`storage_lvmcluster_size`
Adds support for specifying the size parameter when updating lvmcluster storage pool.
`authorization_scriptlet_cert`
This adds two fields, Chain and Certificate, to the details
argument of the authorization scriptlet, to give more information about
the client to authorize.
`lvmcluster_remove_snapshots`
It is a Boolean that defaults to false. When set to true, it instructs Incus
to remove any required snapshots when attempting to restore another snapshot.
This is necessary because lvmcluster only allows restoring the latest snapshot.
`daemon_storage_logs`
This adds storage.logs_volume alongside the existing storage.backups_volume and storage.images_volume.
`instances_debug_repair`
This adds a new API at POST /1.0/instances/NAME/debug/repair to trigger low-level repair actions.
`network_io_bus_ovn`
This ports the io.bus property available on most NIC devices to non-accelerated OVN NICs.
`dependent`
This introduces a new dependent configuration key for disk devices and custom volumes.
Volumes marked as dependent are tied to the lifecycle of the instance they are attached to.
Snapshot operations on the instance are automatically propagated to the dependent volume.
Creating an instance snapshot creates a corresponding snapshot on the dependent volume,
and deleting the instance snapshot removes it as well.
Direct snapshot creation or deletion on a dependent volume is not allowed.
Exporting and importing an instance also includes dependent volumes.
`metrics_project_resources`
This adds project-level metrics to the /1.0/metrics endpoint including resource counts, configured limits, and current usage per project.
`storage_volume_nbd`
This adds a few new APIs for storage volumes and instances:
POST /1.0/storage-pools/POOL/volumes/TYPE/VOLUME/nbdGET /1.0/storage-pools/POOL/volumes/TYPE/VOLUME/bitmapsPOST /1.0/storage-pools/POOL/volumes/TYPE/VOLUME/bitmapsGET /1.0/storage-pools/POOL/volumes/TYPE/VOLUME/bitmaps/NAMEDELETE /1.0/storage-pools/POOL/volumes/TYPE/VOLUME/bitmaps/NAMEPOST /1.0/instances/NAME/bitmaps
This introduces the ability to get a raw NBD connection to an Incus block storage volume.
It also allows interacting with dirty bitmaps on those volumes which can then be used as the basis for incremental backups.
The instance level endpoint allows for consistent bitmap creation across the VM and its dependent volumes.
`projects_restricted_storage_pool_access`
Adds the restricted.storage-pools.access project configuration key to
indicate (as a comma-delimited list) which storage pools can be accessed
inside the project. If not specified, all storage pools are accessible.
Storage pools that are not in the list are treated as equivalent to
having a pool size limit of 0 (limits.disk.pool.POOLNAME=0), making
them inaccessible and hidden from the project.
`server_shutdown_action`
This adds a new core.shutdown_action server configuration option.
Its default value of shutdown keeps the current behavior butevacuate can be set to have a clustered server attempt an evacuation
on shutdown with any instance left after it getting shutdown.
`instances_placement_scriptlet_rebalance`
Add a new placement scriptlet trigger for cluster re-balancing.
`network_bridge_multicast_snooping`
This adds a new bridge.multicast_snooping configuration option for
managed bridge networks. When set to false, multicast snooping is
disabled on the bridge, which can help with IPv6 protocols that rely
on multicast such as NDP.
`storage_create_options`
This introduces a new block.create_options configuration option to
allow controlling the mkfs arguments when creating volumes on block
devices.
btrfs.create_options is also introduced to similarly controlmkfs.btrfs options when creating a new storage pool.
`instances_tpm_platform_cert`
This introduces a couple of new configuration options:
instances.tpm.platform_certinstances.tpm.platform_key
Those can be used to provide a TPM platform CA certificate.
When set, new TPM devices will be getting an Endorsement Key that's
signed by that CA. This can be used to validate that the VM is in fact
running in the expected Incus environment, providing a root of trust for
those TPM devices.
`linstor_raw`
This introduces linstor.raw.* configuration keys for both LINSTOR
storage pools and storage volumes, allowing to set low-level
properties to resource groups and resource definitions.
`network_address_set_ip_ranges`
This adds support for IP ranges (e.g. 10.0.0.120-10.0.0.130) in network
address sets, matching what's already allowed in network ACL rules.
A single range may expand to at most 256 addresses. Larger sets of
addresses should be expressed using CIDR notation instead.
`storage_volumes_rebuild`
This extension adds the ability to rebuild a custom storage volume.
The underlying volume is deleted and a new empty one is created with
the same configuration. The rebuild is only allowed when the volume
has no snapshots.
`api_fragments`
URL fragments in API paths are to be treated by clients as references
to configuration keys for the objects said paths point to.
For example, /1.0?target=foo#storage.logs_volume refers to thestorage.logs_volume configuration key for the cluster member foo.
`instance_limits_cpu_topology`
This extends the limits.cpu configuration key for virtual machines to
allow specifying an explicit CPU topology of the formsockets=2,cores=4,threads=2.
`instance_nbd`
This adds a new GET /1.0/instances/{name}/nbd endpoint which acts
similarly to the equivalent storage volume endpoint but allows concurrent
access to all disks attached to the VM.
`network_bridge_bgp_instances`
This adds the bgp.ipv4.instances and bgp.ipv6.instances configuration
keys to managed bridge networks.
When enabled, Incus advertises a /32 (IPv4) or /128 (IPv6) route over
BGP for each running instance connected to the network, withdrawing it
again when the instance stops.
`core_https_allowed_websocket_origin`
This adds a new core.https_allowed_websocket_origin server
configuration key. It can be set to a comma-separate list of allowed
origins or to the * wildcard.
`storage_btrfs_compression`
This adds a new btrfs.compression storage volume configuration key for
the btrfs driver. It maps to the Btrfs compression property and takes
the same values (for example zstd, lzo, zlib or none).
`oci_network_config`
This allows for static network configuration of OCI application containers.
The NIC ipv4.address and ipv6.address keys can now be set to a CIDR
value to statically configure the address inside the container and the newipv4.gateway and ipv6.gateway keys can be used to set the default
gateway. Setting either address to none prevents any configuration for
that address family and stops the built-in DHCP client from running on it.
For DNS, the oci.dns.nameservers, oci.dns.domain and oci.dns.search
instance configuration keys can be used to set the initial content of the
container's resolv.conf, which is then extended with any value received
over DHCP.
All of those keys are only valid for OCI containers.
`infiniband_sriov_guid`
This adds two new configuration keys, node_guid and port_guid, toinfiniband devices using the sriov nictype.
When set, the matching GUID of the allocated virtual function is changed
to the provided value when the instance starts and restored to its
original value when the instance stops.
`instance_selinux`
This adds per-instance SELinux integration for containers and virtual
machines, with automatic MCS level allocation for isolation between
instances on the same host.
The following instance configuration keys are added:
security.selinux.domain: Override the SELinux process domain.security.selinux.type: Override the SELinux file type used for the
instance storage.security.selinux.level: Override the SELinux MCS level.security.selinux.label_rootfs: Control rootfs labeling behavior
(auto,alwaysornever).
The computed context is persisted in the volatile.selinux.context key so
that MCS ranges stay stable across restarts.
`network_bgp_peer_interface`
This adds a new bgp.peers.NAME.interface configuration key to bridge
and physical networks as an alternative to bgp.peers.NAME.address.
When set, the BGP session is established over the given interface using
BGP unnumbered (the peer's IPv6 link-local address is discovered
automatically and IPv4 routes are exchanged using extended next-hop).
`projects_restricted_virtual_machines_nesting`
This adds a new restricted.virtual-machines.nesting project configuration key.
When set to block, all virtual machines in the project must havesecurity.nesting set to false, turning off nested virtualization.
`authorization_config`
This moves the authorization configuration keys under a generalauthorization.* namespace.
The following server configuration keys replace the former openfga.* keys:
authorization.openfga.api.url: URL of the OpenFGA serverauthorization.openfga.api.token: API token of the OpenFGA serverauthorization.openfga.store.id: ID of the OpenFGA permission store
Existing openfga.* values are automatically migrated to the new keys on
upgrade.
`network_allocations_network`
Adds the network field to the network allocations API response.
`gpu_native_context`
This adds a new native-context gputype for gpu devices on virtual machines.
Instead of passing through a PCI device, it gives the VM an accelerated virtio-gpu
that uses DRM native context, so the guest's own driver drives the host GPU
directly, with graphics and video acceleration. One host GPU can be shared by several
VMs and the host keeps using it. The blob.size device option sets the
host-visible blob window (default 2GiB). Requires QEMU 11.0.0 or newer.
`instance_port_forward`
This adds a new POST /1.0/instances/NAME/port-forward API endpoint which
upgrades the connection to a raw TCP connection to the specified address
and port inside of the instance.
For containers, the connection is established directly by the server from
within the container's network namespace. For virtual machines, the request
is forwarded to the incus-agent which then handles the connection, this
is controlled by the new port-forward agent feature.
A matching incus port-forward command is added to the client, providing
a local TCP listener which forwards every connection to the instance.
`unix_block_limits`
This adds the limits.read and limits.write configuration keys tounix-block devices. These behave similarly to their disk device
equivalents, accepting either a byte/s value or an IOPS value.
`authorization_client_routing`
This allows loading multiple authorization drivers at once and routing each
request to one of them based on the authentication class of the client.
The following server configuration keys are added:
authorization.client.default: driver for clients without a more specific class routeauthorization.client.unix: driver for local (unixsocket) clientsauthorization.client.tls: driver for unrestricted TLS clientsauthorization.client.tls-restricted: driver for restricted (project-scoped) TLS clientsauthorization.client.oidc: driver for OIDC-authenticated clients
Each key accepts one of allow, deny, openfga or scriptlet. A per-class
key falls back to authorization.client.default when unset.
authorization.client.tls-restricted additionally accepts tls, as the TLS
authorization method exists to enforce the per-certificate project restrictions
that only apply to restricted certificates.
The following server configuration key is also added:
authorization.openfga.tls.identifier: certificate attribute (fingerprint
orname) used as the OpenFGA user when a TLS client is authorized by
OpenFGA (defaults toname).
`instance_nvram`
This adds new endpoints to manage virtual machines’ UEFI variables:
GET /1.0/instances/{name}/nvram, to get all UEFI variablesGET /1.0/instances/{name}/nvram/{guid}, to get UEFI variables under the given GUIDGET /1.0/instances/{name}/nvram/{guid}/{var}, to get specific UEFI variablesDELETE /1.0/instances/{name}/nvram/{guid}/{var}, to delete specific UEFI variablesPUT /1.0/instances/{name}/nvram/{guid}/{var}, to set/update specific UEFI variables
It also adds rebuild-nvram as an instance debug action.
`disk_io_limits_combined`
This makes it possible to set both a byte/s limit and an IOPS limit at the
same time in the I/O limit keys of disk and unix-block devices by using
a comma separated list of values (for example, limits.read=30MiB,1000iops).
`resources_cpu_cluster`
Adds a cluster field to CPU core entries in the resources API, telling
apart cores with identical identifiers on systems where core identifiers
are only unique within a CPU cluster (ARM big.LITTLE).
`acme_eab`
Adds support for ACME External Account Binding (EAB) through two new
server configuration keys:
acme.eab.kidacme.eab.hmac
`instance_protection_start`
Adds a new security.protection.start instance configuration key which
when set to true prevents the instance from being started.
`instance_nvram_bulk_update`
This adds a new PATCH /1.0/instances/{name}/nvram endpoint to update NVRAM in bulk.
`instance_refresh_migration`
Adds support for refresh migration, where a running container is moved to another
cluster member through a series of incremental transfers, only being stopped for
the last one.
This adds a refresh field to POST /1.0/instances/{name}. When set to true on
a stateless migration (migration set to true and live set to false), a
running container is migrated this way.
It also adds refresh-migrate as a configuration option to cluster.evacuate
and as an evacuation mode, which forces refresh migration of instances during
cluster evacuation.
`image_locations`
Adds a new locations field to the image API, listing the names of the
cluster members which have a local copy of the image.
`network_ovn_multicast`
Adds multicast configuration to OVN networks through two new
configuration keys:
bridge.multicast_snoopingbridge.multicast_relay
`device_burst_limits`
This adds burst support to the I/O limits of disk and nic devices.
For disk devices (virtual machines only), the new limits.read.burst,limits.write.burst and limits.max.burst keys take the same syntax as their
sustained counterparts and define the rate the device may reach while bursting.
The new limits.read.burst.length, limits.write.burst.length andlimits.max.burst.length keys define how long the burst rate may be
sustained for, defaulting to one second.
For nic devices (bridged, p2p, routed and ovn), the newlimits.ingress.bucket, limits.egress.bucket and limits.max.bucket keys
define the amount of data, in bit, that may be sent in excess of the sustained
limit.
The bridged, p2p and routed types also take limits.ingress.burst,limits.egress.burst and limits.max.burst, defining the bit/s rate at which
that bucket may be spent. A direction needs both keys to burst.
The ovn type only takes the bucket keys, as OVN has no separate burst rate.
`network_ipv6_ra`
Adds a new ipv6.ra configuration key to both bridge and ovn networks,
controlling whether IPv6 router advertisements are sent on the network.
`qemu_scriptlet_nvram`
This extends the QEMU scriptlet feature by adding functions to explore and edit
the NVRAM:
get_nvram_varhas_nvram_varset_nvram_varunset_nvram_varget_raw_nvram_varset_raw_nvram_varlist_nvram_vars
`storage_ceph_rbd_backend`
Adds a new ceph.rbd.backend configuration key to the Ceph RBD storage driver.
When set to librbd, volumes are accessed through librbd rather than the
RBD kernel driver, with qemu-nbd being used whenever a block device is
needed on the host.
`instance_nvram_config`
This adds three categories of initial configuration options, initial.nvram.*,initial.nvram-binary.* and initial.secureboot, which allow defining default
NVRAM variables and Secure Boot certificates and keys when rebuilding the NVRAM.
`storage_cephobject_endpoint_cert`
Adds a new cephobject.radosgw.endpoint_cert configuration key to the Ceph
Object storage driver, holding the TLS certificate (PEM bundle) to trust when
communicating with the radosgw endpoint.
This replaces cephobject.radosgw.endpoint_cert_file, existing values are
converted automatically.
`device_queue_disc`
Adds new queue.discipline and queue.discipline.attach configuration keys
to nic devices of type bridged, p2p and routed, controlling the queuing
discipline used on the host side of the NIC and where it gets attached.
`network_bridge_dns_include_hosts`
Adds a new dns.include_hosts configuration key to bridge networks,
controlling whether the network's dnsmasq serves records from the host's/etc/hosts file. Setting it to false avoids exposing host-only entries
to instances while keeping AppArmor confinement.
`gpu_physical_clique`
Adds a new nvidia.clique configuration key to gpu devices of type physical
when used with virtual machines. It sets the NVIDIA GPUDirect P2P clique ID
(0 to 15) advertised to the guest driver, allowing peer-to-peer DMA between
GPUs passed through to the same virtual machine when they share a clique ID.
`authorization_scriptlet_claims`
This adds a Claims field to the details argument of the authorization
scriptlet, holding the validated OIDC token claims of the client as a
dictionary. This allows writing rules based on claims such as groups.
`instance_project_move_live`
This allows a running instance to change project as part of a live migration
to another cluster member. It also lets instances with dependent disks
attached change project.
`metrics_cluster_members`
This adds cluster member metrics to the /1.0/metrics endpoint:
incus_cluster_memberwith the member's architecture and failure domainincus_cluster_member_statuswith one sample per possible statusincus_cluster_member_rolewith one sample per role heldincus_cluster_member_groupwith one sample per group the member belongs to
`instance_security_tags`
Adds a new security.tags configuration key to instances, holding a
comma-separated list of tags. The tags are exposed to the authorization
backend, with OpenFGA maintaining a security_tag object for each tag
along with a tag relation to every instance carrying it.
`network_ovn_parent`
Adds a new parent configuration key to ovn networks, referencing anotherovn network in the same project.
`disk_initial_copy`
This adds the initial.copy property to disk devices backed by a custom storage volume.
When set to true on a container, the content already present at the device path inside
the container is copied into the volume the first time the volume is used, if it's empty.
`internal_debug_pprof`
This adds /internal/debug/pprof/ to the API, serving the same pprof
profiles as the core.debug_address listener but over the regular
listeners, restricted to trusted clients with server administration rights.
`instance_state_disk_counters`
Adds a counters field to each entry of the disk section of an instance's
state, holding bytes_read, bytes_written, reads_completed andwrites_completed.
These are only populated for virtual machines, using the block I/O
statistics reported by QEMU. Containers do not report them because cgroup
I/O accounting is keyed by host block device rather than by Incus device
name, and a container's root file system and custom volumes routinely share
a single host block device, making per-device attribution impossible.
`instances_state_tpm`
Adds a tpm section to the instance state, listing every tpm device along
with its endorsement keys, each with a type, size, SHA-256 fingerprint and
PEM encoded public key.
The endorsement keys are only known for TPM devices provisioned by Incus, that is
when instances.tpm.platform_cert was set at the time the device was first started.
`ovn_nic_security_filtering`
This adds the security.mac_filtering, security.ipv4_filtering and security.ipv6_filtering options to OVN NICs.
They are implemented through OVN port security on the instance's logical switch port,
restricting the source MAC address and, when IP filtering is enabled, the IP addresses
(including any static routes) the instance may use.
`authorization_scriptlet_request`
This adds the following fields to the details argument of the authorization scriptlet:
URL, holding the raw client request URL (?<query>)Path, holding the API path requested by the clientQuery, holding the dictionary of query parameters (note: the values are lists of strings and not single strings)Method, holding the HTTP method used in the request
`vm_boot_priority_skip`
This adds the ability to define boot.priority to skip on NIC and disk devices, to skip them from the boot sequence. The new default for NICs is to be skipped.
This additionally adds a boot.pxe VM configuration key, defaulting to false, to enable PXE on all the NICs included in the boot sequence. This doesn’t affect HTTP boot, which is always enabled for those NICs.
`network_ovn_nat_address_l2proxy`
Allows ipv4.nat.address and ipv6.nat.address on an ovn network whose uplink usesovn.ingress_mode=l2proxy, previously only supported with ovn.ingress_mode=routed.
`oidc_id_token`
This adds support for OIDC providers that issue opaque (non-JWT) access tokens.
When the access token isn't a JWT, Incus verifies the ID token instead, checking that it was issued by the configured issuer for the configured client ID.
Clients send the ID token alongside the opaque access token through the X-Incus-OIDC-idtoken header.
`certificate_ca_trust`
A CA certificate added to the trust store now also trusts the client certificates it issued.
Those clients are identified by the CA entry's fingerprint and inherit its type, restrictions and projects.
`network_bgp_communities`
This adds a bgp.communities network configuration key for bridge and ovn networks.
It takes a comma-separated list of standard BGP communities (ASN:value)
which are attached to all prefixes advertised by the network.
Doc Api (`doc/api.md`)
REST API
:maxdepth: 1
Main API documentation <rest-api>
rest-api-spec
Main API extensions <api-extensions>
Instance API documentation <dev-incus>
Events API documentation <events>
Metrics API documentation <reference/provided_metrics>Doc Architectures (`doc/architectures.md`)
(architectures)=
Architectures
Incus can run on just about any architecture that is supported by the Linux kernel and by Go.
Some entities in Incus are tied to an architecture, for example, the instances, instance snapshots and images.
The following table lists all supported architectures including their unique identifier and the name used to refer to them.
The architecture names are typically aligned with the Linux kernel architecture names.
| ID | Kernel name | Description | Personalities |
|---|---|---|---|
| 1 | i686 |
32bit Intel x86 | |
| 2 | x86_64 |
64bit Intel x86 | x86 |
| 3 | armv7l |
32bit ARMv7 little-endian | |
| 4 | aarch64 |
64bit ARMv8 little-endian | armv7l (optional) |
| 5 | ppc |
32bit PowerPC big-endian | |
| 6 | ppc64 |
64bit PowerPC big-endian | powerpc |
| 7 | ppc64le |
64bit PowerPC little-endian | |
| 8 | s390x |
64bit ESA/390 big-endian | |
| 9 | mips |
32bit MIPS | |
| 10 | mips64 |
64bit MIPS | mips |
| 11 | riscv32 |
32bit RISC-V little-endian | |
| 12 | riscv64 |
64bit RISC-V little-endian | |
| 13 | armv6l |
32bit ARMv6 little-endian | |
| 14 | armv8l |
32bit ARMv8 little-endian | |
| 15 | loongarch64 |
64bit Loongarch |
Incus cares only about the kernel architecture, not the particular userspace flavor as determined by the toolchain.
That means that Incus considers ARMv7 hard-float to be the same as ARMv7 soft-float and refers to both as `armv7l`.
If useful to the user, the exact userspace ABI may be set as an image and container property, allowing easy query.Virtual-machine support
Incus only supports running virtual-machines on the following host architectures:
x86_64aarch64ppc64les390xloongarch64
The virtual machine guest architecture can usually be the 32bit personality of the host architecture,
so long as the virtual machine firmware is capable of booting it.
Doc Authentication (`doc/authentication.md`)
(authentication)=
Remote API authentication
Remote communications with the Incus daemon happen using JSON over HTTPS.
To be able to access the remote API, clients must authenticate with the Incus server.
The following authentication methods are supported:
- {ref}
authentication-tls-certs - {ref}
authentication-openid
(authentication-tls-certs)=
TLS client certificates
When using {abbr}TLS (Transport Layer Security) client certificates for authentication, both the client and the server will generate a key pair the first time they're launched.
The server will use that key pair for all HTTPS connections to the Incus socket.
The client will use its certificate as a client certificate for any client-server communication.
To cause certificates to be regenerated, simply remove the old ones.
On the next connection, a new certificate is generated.
Communication protocol
The supported protocol must be TLS 1.3 or better.
It's possible to force Incus to accept TLS 1.2 by setting the INCUS_INSECURE_TLS environment variable on both client and server.
However this isn't a supported setup and should only ever be used when forced to use an outdated corporate proxy.
All communications must use perfect forward secrecy, and ciphers must be limited to strong elliptic curve ones (such as ECDHE-RSA or ECDHE-ECDSA).
Any generated key should be at least 4096 bit RSA, preferably 384 bit ECDSA.
When using signatures, only SHA-2 signatures should be trusted.
Since we control both client and server, there is no reason to support
any backward compatibility to broken protocol or ciphers.
(authentication-trusted-clients)=
Trusted TLS clients
You can obtain the list of TLS certificates trusted by an Incus server with incus config trust list.
Trusted clients can be added in either of the following ways:
- {ref}
authentication-add-certs - {ref}
authentication-token
The workflow to authenticate with the server is similar to that of SSH, where an initial connection to an unknown server triggers a prompt:
When the user adds a server with
incus remote add, the server is contacted over HTTPS, its certificate is downloaded and the fingerprint is shown to the user.The user is asked to confirm that this is indeed the server's fingerprint, which they can manually check by connecting to the server or by asking someone with access to the server to run the info command and compare the fingerprints.
The server attempts to authenticate the client:
- If the client certificate is in the server's trust store, the connection is granted.
- If the client certificate is not in the server's trust store, the server prompts the user for a token.
If the provided token matches, the client certificate is added to the server's trust store and the connection is granted.
Otherwise, the connection is rejected.
It is possible to restrict a TLS client's access to Incus via {ref}authorization-tls.
To revoke trust to a client, remove its certificate from the server with incus config trust remove <fingerprint>.
(authentication-tls-jwt)=
Using `JSON Web Token` (`JWT`) to perform TLS authentication
As an alternative to directly using the client's TLS certificate for
authentication, Incus also supports the user derive a bearer token and
use it through the HTTP Authorization header.
To do this, the user must generate a signed JWT which has itsSubject field set to the full fingerprint of their client certificate,
it must have valid NotBefore and NotAfter fields and be signed by
the client certificate's private key.
(authentication-add-certs)=
Adding trusted certificates to the server
The preferred way to add trusted clients is to directly add their certificates to the trust store on the server.
To do so, copy the client certificate to the server and register it using incus config trust add-certificate <file>.
(authentication-ca-certs)=
Trusting a certificate authority
Instead of adding every client certificate, you can add a CA certificate to the trust store.
Any client certificate issued by that CA is then trusted as if the CA entry itself had been presented: the client is identified by the fingerprint of the CA entry and inherits its type, restrictions and projects.
The client must present any intermediate certificate between its own certificate and the trusted CA, and its certificate must allow the clientAuth extended key usage if it specifies any.
This makes it possible to use short-lived client certificates issued by an internal PKI without updating the trust store on every renewal.
Revocation lists aren't consulted for such certificates, so remove the CA entry from the trust store to revoke all the certificates it issued.
Certificates that are directly present in the trust store always take precedence over a matching CA entry.
(authentication-token)=
Adding client certificates using tokens
You can also add new clients by using tokens. Tokens expire after a configurable time ({config:option}server-core:core.remote_token_expiry) or once they've been used.
To use this method, generate a token for each client by calling incus config trust add, which will prompt for the client name.
The clients can then add their certificates to the server's trust store by providing the generated token when prompted.
If your Incus server is behind NAT, you must specify its external public address when adding it as a remote for a client:
incus remote add <name> <IP_address>
When generating the token on the server, Incus includes a list of IP addresses that the client can use to access the server.
However, if the server is behind NAT, these addresses might be local addresses that the client cannot connect to.
In this case, you must specify the external address manually.Alternatively, the clients can provide the token directly when adding the remote: incus remote add <name> <token>.
Using a PKI system
In a {abbr}PKI (Public key infrastructure) setup, a system administrator manages a central PKI that issues client certificates for all the Incus clients and server certificates for all the Incus daemons.
To enable PKI mode, complete the following steps:
Add the {abbr}
CA (Certificate authority)certificate to all machines:- Place the
client.cafile in the clients' configuration directories (~/.config/incus). - Place the
server.cafile in the server's configuration directory (/var/lib/incus).
- Place the
Place the certificates issued by the CA on the clients and the server, replacing the automatically generated ones.
Restart the server.
In that mode, any connection to an Incus daemon will be done using the
pre-seeded CA certificate.
If the server certificate isn't signed by the CA, the connection will simply go through the normal authentication mechanism.
If the server certificate is valid and signed by the CA, then the connection continues without prompting the user for the certificate.
Note that the generated certificates are not automatically trusted. You must still add them to the server in one of the ways described in {ref}authentication-trusted-clients.
In that mode, only client certificates issued by the CA can be added to the trust store.
Alternatively, you can set {config:option}server-core:core.trust_ca_certificates to true to have the server automatically trust any valid client certificate issued by the CA.
Such certificates don't need to be added to the trust store and get full access to the server, unless they are added to the trust store as restricted certificates.
Certificates listed in a ca.crl file placed in the server's configuration directory are rejected.
Only enable `core.trust_ca_certificates` with a CA dedicated to Incus, as anyone holding a certificate issued by that CA can then administer the server.Encrypting local keys
The incus client also supports encrypted client keys. Keys generated via the methods above can be encrypted with a password, using:
ssh-keygen -p -o -f .config/incus/client.keyUnless you enable [`keepalive` mode](remote-keepalive), then every single call to Incus will cause the prompt which may get a bit annoying:
$ incus list remote-host:
Password for client.key:
┌──────┬───────┬──────┬──────┬──────┬───────────┐
│ NAME │ STATE │ IPV4 │ IPV6 │ TYPE │ SNAPSHOTS │
└──────┴───────┴──────┴──────┴──────┴───────────┘While the `incus` command line supports encrypted keys, tools such as [Ansible's connection plugin](https://docs.ansible.com/ansible/latest/collections/community/general/incus_connection.html) do not.(authentication-openid)=
OpenID Connect authentication
Incus supports using OpenID Connect to authenticate users through an {abbr}OIDC (OpenID Connect) Identity Provider.
Authentication through OpenID Connect is supported, but there is no user role handling in place so far.
Any user that authenticates through the configured OIDC Identity Provider gets full access to Incus.To configure Incus to use OIDC authentication, set the oidc.* server configuration options.
Your OIDC provider must be configured to enable the Device Authorization Grant type.
To add a remote pointing to an Incus server configured with OIDC authentication, run incus remote add <remote_name> <remote_address>.
You are then prompted to authenticate through your web browser, where you must confirm the device code that Incus uses.
The Incus client then retrieves and stores the access and refresh tokens and provides those to Incus for all interactions.
Incus verifies JWT access tokens offline using the provider's signing keys.
Providers that issue opaque access tokens are also supported, in which case Incus verifies the ID token instead and checks that it was issued for the configured client ID.
The client ID used by Incus must therefore not be shared with any other application registered with the provider.
Setting oidc.audience disables this fallback as the audience can't be verified on an opaque access token.
Incus supports a custom OIDC claim of incus.allowed_subnets (list of strings), if the claim is set,
the user will only be allowed if connecting from an IP address that's part of one of the CIDR subnets listed in the claim.
Any user that authenticates through the configured OIDC Identity Provider gets full access to Incus.
To restrict user access, you must also configure {ref}`authorization`.
Currently, the only authorization method that is compatible with OIDC is {ref}`authorization-openfga`.(authentication-server-certificate)=
TLS server certificate
Incus supports issuing server certificates using {abbr}ACME (Automatic Certificate Management Environment) services, for example, Let's Encrypt.
To enable this feature, set the relevant server configuration options.
Incus supports both HTTP-01 and DNS-01 challenges. The set of configuration option varies between the two.
For DNS-01, the relevant {config:option}server-acme:acme.provider and {config:option}server-acme:acme.provider.environment
values can be found directly in the documentation of lego,
the ACME client that Incus uses behind the scenes.
For HTTP-01, Incus will cause lego to temporarily listen on port 80 so the HTTP challenge can go through.
In a cluster, the challenge runs on the leader while the other members temporarily listen on that same port and forward the challenge requests to the leader.
This allows for a certificate covering the names of all cluster members.
If your Incus server sits behind a reverse proxy, you'll need that reverse proxy to redirect HTTP traffic to HTTPS.
For ACME services that require External Account Binding (EAB), set both
{config:option}server-acme:acme.eab.kid and {config:option}server-acme:acme.eab.hmac
to the values provided by your ACME service.
Failure scenarios
In the following scenarios, authentication is expected to fail.
Server certificate changed
The server certificate might change in the following cases:
- The server was fully reinstalled and therefore got a new certificate.
- The connection is being intercepted ({abbr}
MITM (Machine in the middle)).
In such cases, the client will refuse to connect to the server because the certificate fingerprint does not match the fingerprint in the configuration for this remote.
It is then up to the user to contact the server administrator to check if the certificate did in fact change.
If it did, the certificate can be replaced by the new one, or the remote can be removed altogether and re-added.
Server trust relationship revoked
The server trust relationship is revoked for a client if another trusted client or the local server administrator removes the trust entry for the client on the server.
In this case, the server still uses the same certificate, but all API calls return a 403 code with an error indicating that the client isn't trusted.
Doc Authorization (`doc/authorization.md`)
(authorization)=
Authorization
When interacting with Incus over the Unix socket, members of the incus-admin group will have full access to the Incus API.
Those who are only members of the incus group will instead be restricted to a single project tied to their user.
When interacting with Incus over the network (see {ref}server-expose for instructions), it is possible to further authenticate and restrict user access.
There are three supported authorization methods:
- {ref}
authorization-tls - {ref}
authorization-openfga - {ref}
authorization-scriptlet
By default, the method used for a request is determined automatically from the
client's authentication protocol. This can be customized so that different kinds
of clients are handled by different methods; see {ref}authorization-client-routing.
(authorization-tls)=
TLS authorization
Incus natively supports restricting {ref}authentication-trusted-clients to one or more projects.
When a client certificate is restricted, the client will also be prevented from performing global configuration changes or altering the configuration (limits, restrictions) of the projects it's allowed access to.
To restrict access, use incus config trust edit <fingerprint>.
Set the restricted key to true and specify a list of projects to restrict the client to.
If the list of projects is empty, the client will not be allowed access to any of them.
By default, this authorization method is used for clients authenticating with a restricted TLS certificate.
Clients using an unrestricted certificate are granted full access instead.
Both can be changed, see {ref}authorization-client-routing.
(authorization-openfga)=
Open Fine-Grained Authorization (OpenFGA)
Incus supports integrating with {abbr}OpenFGA (Open Fine-Grained Authorization).
This authorization method is highly granular.
For example, it can be used to restrict user access to a single instance.
To use OpenFGA for authorization, you must configure and run an OpenFGA server yourself.
Incus will connect to the OpenFGA server, write the {ref}openfga-model, and query this server for authorization for all subsequent requests.
To enable this authorization method in Incus, set the authorization.openfga.* server configuration options.
All options must be set in order to enable OpenFGA. Though, you do not have to create the authorization-model yourself, Incus will generate it including the initial tuple to allow only authenticated users: server:incus#authenticated@user:*.
Setting the `authorization.openfga.*` options only makes OpenFGA available.
It does not on its own cause any request to be authorized by it.
OpenFGA is only consulted for clients whose class is routed to it with an
`authorization.client.*` option, see {ref}`authorization-client-routing`.(openfga-model)=
OpenFGA model
With OpenFGA, access to a particular API resource is determined by the user's relationship to it.
These relationships are determined by an OpenFGA authorization model.
The Incus OpenFGA authorization model describes API resources in terms of their relationship to other resources, and a relationship a user or group might have with that resource.
The full Incus OpenFGA authorization model is defined in internal/server/auth/driver_openfga_model.openfga:
:language: none(openfga-security-tags)=
Security tags
Instances can be tagged through the security.tags configuration key, which holds a comma-separated list of tags.
Incus does not use those tags in its own authorization decisions.
Instead, every tag is exposed in OpenFGA as a security_tag object related to the server and holding a tag relation with every instance carrying it (for example, security_tag:pci tag instance:default/web1).
This makes the tags visible to external tooling working directly with the OpenFGA store.
Users that you do not trust with root access to the host should not be granted the following relations:
- `server -> admin`
- `server -> operator`
- `server -> can_edit`
- `server -> can_create_storage_pools`
- `server -> can_create_projects`
- `server -> can_create_certificates`
- `certificate -> can_edit`
- `storage_pool -> can_edit`
- `project -> admin`
The remaining relations may be granted.
However, you must apply appropriate {ref}`project-restrictions`.(authorization-scriptlet)=
Scriptlet authorization
Incus supports defining a scriptlet to manage fine-grained authorization, allowing to write precise authorization rules with no dependency on external tools.
Setting `authorization.scriptlet` only makes the scriptlet available.
It does not on its own cause any request to be authorized by it.
The scriptlet is only run for clients whose class is routed to it with an
`authorization.client.*` option, see {ref}`authorization-client-routing`.To use scriptlet authorization, you can write a scriptlet in the authorization.scriptlet server configuration option implementing a function authorize, which takes three arguments:
details, an object with the following attributes:Username: the user name or certificate fingerprintProtocol: the authentication protocolIsAllProjectsRequest: whether the request is made on all projectsProjectName: the project nameChain: the certificate chain as a list of dissected x509 certificatesCertificate: the certificate data stored in the databaseClaims: the validated OIDC token claims as a dictionary (empty for non-OIDC clients)URL: the raw client request URL (?<query>)Path: the API path requested by the clientQuery: the dictionary of query parameters (note: the values are lists of strings and not single strings)Method: the HTTP method used in the request
object, the object on which the user requests authorizationentitlement, the authorization level asked by the user
This function must return a Boolean indicating whether the user has access or not to the given object with the given entitlement.
Additionally, two optional functions can be defined so that users can be listed through the access API:
get_instance_access, with two arguments (project_nameandinstance_name), returning a list of users able to access a given instanceget_project_access, with one argument (project_name), returning a list of users able to access a given project
(authorization-client-routing)=
Client routing
More than one authorization method can be loaded at the same time, with each
request routed to exactly one of them based on the authentication class of the
client. This is controlled through the authorization.client.* server
configuration options, one per client class:
authorization.client.unix: local clients connecting over the Unix socketauthorization.client.tls: clients using an unrestricted client certificateauthorization.client.tls-restricted: clients using a restricted (project-scoped) client certificateauthorization.client.oidc: OIDC-authenticated clientsauthorization.client.default: any client class not set above
Each option accepts one of the following values:
allow: unconditionally grant accessdeny: unconditionally refuse accesstls: use {ref}authorization-tls, only valid forauthorization.client.tls-restrictedopenfga: use {ref}authorization-openfgascriptlet: use {ref}authorization-scriptlet
A per-class option falls back to authorization.client.default when unset.
When that is unset too, the following built-in routing applies:
| Client class | Built-in route |
|---|---|
unix |
allow |
tls |
allow |
tls-restricted |
tls |
oidc |
allow |
default |
deny |
This routing is fixed.
The per-certificate project restrictions described in {ref}`authorization-tls`
are enforced by the TLS authorization method only.
If `authorization.client.tls-restricted` is set to any value other than `tls`,
the project list of the client certificate are no longer consulted, and a restricted
certificate may gain access well beyond the projects it is limited to.
Only set this option to something other than `tls` if the method you route to
reproduces the restrictions you rely on.Always set `authorization.client.default` last, once you have confirmed that
every explicitly configured client class behaves as expected.
The default applies to every class that is not set explicitly, so a single
mistake affects all of them at once. If it is set to `openfga` or `scriptlet`
while that method is misconfigured or unreachable, or to `deny`, every remote
client is refused.
The `root` user is always allowed to interact with the API over the Unix
socket, regardless of the configured authorization method. This is what allows
a server locked out by a bad routing configuration to be recovered.For example, to have OpenFGA authorize OIDC clients while restricted TLS clients
keep using TLS authorization:
incus config set authorization.client.oidc=openfga
incus config set authorization.client.tls-restricted=scriptletDoc Backup (`doc/backup.md`)
(backups)=
How to back up an Incus server
In a production setup, you should always back up the contents of your Incus server.
The Incus server contains a variety of different entities, and when choosing
your backup strategy, you must decide which of these entities you want to
back up and how frequently you want to save them.
What to back up
The various contents of your Incus server are located on your file system and, in
addition, recorded in the {ref}Incus database <database>.
Therefore, only backing up the database or only backing up the files on disk
does not give you a full functional backup.
Your Incus server contains the following entities:
- Instances (database records and file systems)
- Images (database records, image files, and file systems)
- Networks (database records and state files)
- Profiles (database records)
- Storage volumes (database records and file systems)
Consider which of these you need to back up.
For example, if you don't use custom images, you don't need to back up your
images since they are available on the image server.
If you use only the default profile, or only the standard incusbr0 network bridge,
you might not need to worry about backing them up, because they can easily be re-created.
Full backup
To create a full backup of all contents of your Incus server,
back up the /var/lib/incus directory.
This directory contains your local storage, the Incus database, and your configuration.
It does not contain separate storage devices, however.
That means that whether the directory also contains the data of your
instances depends on the storage drivers that you use.
If your Incus server uses any external storage
(for example, LVM volume groups, ZFS zpools, or any other resource that isn't
directly self-contained to Incus), you must back this up separately.To back up your data, create a tarball of /var/lib/incus.
If your system uses /etc/subuid and /etc/subgid file, you
should also back up these files.
Restoring them avoids needless shifting of instance file systems.
To restore your data, complete the following steps:
- Stop Incus on your server (for example, with
sudo systemctl stop incus.service incus.socket). - Delete the directory (
/var/lib/incus/). - Restore the directory from the backup.
- Delete and restore any external storage devices.
- Restore the
/etc/subuidand/etc/subgidfiles if present. - Restart Incus (for example, with
sudo systemctl start incus.socket incus.serviceor by restarting your machine).
Partial backup
If you decide to only back up specific entities, you
have different options for how to do this.
You should consider doing some of these partial backups even
if you are doing full backups in addition.
It can be easier and safer to, for example, restore a single instance
or reconfigure a profile than to restore the full Incus server.
Back up instances and volumes
Instances and storage volumes are backed up in a very similar
way (because when backing up an instance, you basically back up
its instance volume, see {ref}storage-volume-types).
See {ref}instances-backup and {ref}howto-storage-backup-volume for detailed information.
The following sections give a brief summary of the options you have
for backing up instances and volumes.
Secondary backup Incus server
Incus supports copying and moving instances and storage volumes between two hosts.
See {ref}move-instances and {ref}howto-storage-move-volume for instructions.
So if you have a spare server, you can regularly copy your
instances and storage volumes to that secondary server to back them up.
If needed, you can either switch over to the secondary server or
copy your instances or storage volumes back from it.
If you use the secondary server as a pure storage server, it doesn't
need to be as powerful as your main Incus server.
Export tarballs
You can use the export command to export instances and volumes to a backup tarball.
By default, those tarballs include all snapshots.
You can use an optimized export option, which is usually quicker
and results in a smaller size of the tarball.
However, you must then use the same storage driver when restoring the backup tarball.
See {ref}instances-backup-export and {ref}storage-backup-export for instructions.
Snapshots
Snapshots save the state of an instance or volume at a specific point in time.
However, they are stored in the same storage pool and are therefore likely
to be lost if the original data is deleted or lost.
This means that while snapshots are very quick and easy to create
and restore, they don't constitute a secure backup.
See {ref}instances-snapshots and {ref}storage-backup-snapshots for more information.
(backup-database)=
Back up the database
While there is no trivial method to restore the contents of the
{ref}Incus database <database>, it can still be very convenient
to keep a backup of its content.
Such a backup can make it much easier to re-create, for example,
networks or profiles if the need arises.
Use the following command to dump the content of the local database to a file:
incus admin sql local .dump > <output_file>Use the following command to dump the content of the global database to a file:
incus admin sql global .dump > <output_file>You should include these two commands in your regular Incus backup.
Doc Client Config (`doc/client-config.md`)
(client-config)=
CLI configuration file
The Incus CLI client uses a configuration file to store environment data and modify its behavior. This documentation describes the file structure and its options.
Changing this configuration file manually may leave the CLI in an inconsistent state, so you should only edit it via CLI commands such as [`incus remote`](incus_remote.md) and [`incus alias`](incus_alias.md).The configuration file
By default, the Incus CLI will use the $HOME/.config/incus/config.yml, but it can also use the config.yml in an arbitrary directory provided by the INCUS_CONF environment variable.
If the file or its path don't exist, it will use the default:
default-remote: local
remotes:
images:
protocol: simplestreams
public: true
addr: https://images.linuxcontainers.org
local:
protocol: incus
public: false
addr: unix://
aliases: {}
defaults:
list_format: ""
console_type: ""
console_spice_command: ""
no_color: false`remotes`
Incus remote information managed by incus remote commands is stored in the remotes section. Remotes may have the following configuration keys.
`addr`
Address of the remote server. Accepts IPs, FQDNs and URLs. Multiple addresses can be provided, separated with commas addr1,addr2,....
`last_working_address`
Used by the CLI to register the last working address of a remote, if the remote has multiple addresses.
`auth_type`
Method that the client will use to authenticate to the server API. Accepts tls and oidc.
`keepalive`
Timeout in seconds that the keepalive feature will maintain the connection opened.
`project`
Default project used by the CLI when using that remote. It's defined by the incus project switch command. It's overwritten by the --project flag and the INCUS_PROJECT environment variable.
`protocol`
The protocol the CLI will use to communicate with the remote. This defines if the remote will be used as an Incus or image server. Accepts the following options:
incus: private Incus server accessible over the networkoci: Open Container Initiative (OCI) server that provides application container imagespublic: Incus server accessible over the network to provide images onlysimplestream: Simple Stream server that provide images
`credentials_helper`
Defines a helper command that will handle OCI service authentication.
`public`
Defines if the remote is an image-only server (public).
`default_remotes`
Defines the default Incus remote used by the CLI to execute commands. It's defined by the incus remote switch command. This configuration is overwritten by the environment variable INCUS_REMOTE or by the <remote>: prefix.
`aliases`
Stores the alias managed by the incus alias command. Each alias is a key/value pair that consists of the alias name and the alias command (enclosed by quotes).
`defaults`
Determines the default CLI behavior for certain CLI commands.
`list_format`
Defines how list outputs will be displayed. Equivalent to the --format (-f) flag. Accepts csv, json, table, yaml, compact and markdown formats.
`console_type`
Defines the default console type used by the incus console command. Available options are:
console: text based consolevga: graphic UI console
`console_spice_command`
Defines an alternative SPICE command to provide the VGA console used by incus console.
`no_color`
Disables CLI colors.
Doc Client (`doc/client.md`)
(incus-client)=
Incus client
:maxdepth: 1
Add remote servers <remotes>
Add command aliases <howto/incus_alias>
CLI configuration file <client-config>
/reference/manpagesDoc Cloud Init (`doc/cloud-init.md`)
relatedlinks: https://cloudinit.readthedocs.org/
(cloud-init)=
How to use `cloud-init`
cloud-init is a tool for automatically initializing and customizing an instance of a Linux distribution.
By adding cloud-init configuration to your instance, you can instruct cloud-init to execute specific actions at the first start of an instance.
Possible actions include, for example:
- Updating and installing packages
- Applying certain configurations
- Adding users
- Enabling services
- Running commands or scripts
- Automatically growing the file system of a VM to the size of the disk
See the {ref}cloud-init:index for detailed information.
The `cloud-init` actions are run only once on the first start of the instance.
Rebooting the instance does not re-trigger the actions.`cloud-init` support in images
To use cloud-init, you must base your instance on an image that has cloud-init installed.
Images from the images remote have cloud-init-enabled variants, which are usually bigger in size than the default variant.
The cloud variants use the /cloud suffix, for example, images:debian/12/cloud.
`cloud-init` and virtual machines
For cloud-init to work inside of a virtual machine, you need to either have a functional incus-agent in the VM or need to provide the cloud-init data through a special extra disk.
All images coming from the images: remote will have the agent already setup and so are good to go from the start.
For instances that do not have the incus-agent, you can pass in the extra cloud-init disk with:
incus config device add INSTANCE cloud-init disk source=cloud-init:configWhen relying on the `incus-agent` to apply the `cloud-init` configuration, the instance needs to have a set of file templates in place for:
* `/var/lib/cloud/seed/nocloud-net/meta-data`
* `/var/lib/cloud/seed/nocloud-net/network-config`
* `/var/lib/cloud/seed/nocloud-net/user-data`
* `/var/lib/cloud/seed/nocloud-net/vendor-data`
When making a new image, it's easiest to replicate those from one of our own `cloud-init` enabled images.
Those file templates get applied by the `incus-agent` on first boot. The
agent then triggers a reboot, causing `cloud-init` to run cleanly and
apply the configuration to the virtual machine.Configuration options
Incus supports two different sets of configuration options for configuring cloud-init: cloud-init.* and user.*.
Which of these sets you must use depends on the cloud-init support in the image that you use.
As a rule of thumb, newer images support the cloud-init.* configuration options, while older images support user.*.
However, there might be exceptions to that rule.
The following configuration options are supported:
cloud-init.vendor-dataoruser.vendor-data(see {ref}cloud-init:vendor-data)cloud-init.user-dataoruser.user-data(see {ref}cloud-init:user_data_formats)cloud-init.network-configoruser.network-config(see {ref}cloud-init:network_config)
For more information about the configuration options, see the cloud-init instance options.
Vendor data and user data
Both vendor-data and user-data are used to provide cloud configuration data to cloud-init.
The main idea is that vendor-data is used for the general default configuration, while user-data is used for instance-specific configuration.
This means that you should specify vendor-data in a profile and user-data in the instance configuration.
Incus does not enforce this method, but allows using both vendor-data and user-data in profiles and in the instance configuration.
If both vendor-data and user-data are supplied for an instance, cloud-init merges the two configurations.
However, if you use the same keys in both configurations, merging might not be possible.
In this case, configure how cloud-init should merge the provided data.
See the {ref}cloud-init documentation <cloud-init:merging_user_data> for instructions.
How to configure `cloud-init`
To configure cloud-init for an instance, add the corresponding configuration options to a {ref}profile that the instance uses or directly to the {ref}instance configuration .
When configuring cloud-init directly for an instance, keep in mind that cloud-init runs only on the first start of the instance.
That means that you must configure cloud-init before you start the instance.
To do so, create the instance with incus init instead of incus launch, and then start it after completing the configuration.
YAML format for `cloud-init` configuration
The cloud-init options require YAML's literal style format.
You use a pipe symbol (|) to indicate that all indented text after the pipe should be passed to cloud-init as a single string, with new lines and indentation preserved.
The vendor-data and user-data options usually start with #cloud-config.
For example:
config:
cloud-init.user-data: |
#cloud-config
package_upgrade: true
packages:
- package1
- package2See {ref}`How to validate user data <cloud-init:check_user_data_cloud_config>` for information on how to check whether the syntax is correct.How to check the `cloud-init` status
cloud-init runs automatically on the first start of an instance.
Depending on the configured actions, it might take a while until it finishes.
To check the cloud-init status, log on to the instance and enter the following command:
cloud-init statusIf the result is status: running, cloud-init is still working. If the result is status: done, it has finished.
Alternatively, use the --wait flag to be notified only when cloud-init is finished:
:input: cloud-init status --wait
:user: root
:host: instance
.....................................
status: doneHow to specify user or vendor data
The user-data and vendor-data configuration can be used to, for example, upgrade or install packages, add users, or run commands.
The provided values must have a first line that indicates what type of {ref}user data format <cloud-init:user_data_formats> is being passed to cloud-init.
For activities like upgrading packages or setting up a user, #cloud-config is the data format to use.
The configuration data is stored in the following files in the instance's root file system:
/var/lib/cloud/instance/cloud-config.txt/var/lib/cloud/instance/user-data.txt
Examples
See the following sections for the user data (or vendor data) configuration for different example use cases.
You can find more advanced {ref}examples <cloud-init:yaml_examples> in the cloud-init documentation.
Upgrade packages
To trigger a package upgrade from the repositories for the instance right after the instance is created, use the package_upgrade key:
config:
cloud-init.user-data: |
#cloud-config
package_upgrade: trueInstall packages
To install specific packages when the instance is set up, use the packages key and specify the package names as a list:
config:
cloud-init.user-data: |
#cloud-config
packages:
- git
- openssh-serverSet the time zone
To set the time zone for the instance on instance creation, use the timezone key:
config:
cloud-init.user-data: |
#cloud-config
timezone: Europe/RomeRun commands
To run a command (such as writing a marker file), use the runcmd key and specify the commands as a list:
config:
cloud-init.user-data: |
#cloud-config
runcmd:
- [touch, /run/cloud.init.ran]Add a user account
To add a user account, use the users key.
See the {ref}cloud-init:reference/examples:including users and groups example in the cloud-init documentation for details about default users and which keys are supported.
config:
cloud-init.user-data: |
#cloud-config
users:
- name: documentation_exampleHow to specify network configuration data
By default, cloud-init configures a DHCP client on an instance's eth0 interface.
You can define your own network configuration using the network-config option to override the default configuration (this is due to how the template is structured).
cloud-init then renders the relevant network configuration on the system using either ifupdown or netplan, depending on the distribution.
The configuration data is stored in the following files in the instance's root file system:
/var/lib/cloud/seed/nocloud-net/network-config/etc/network/interfaces.d/50-cloud-init.cfg(if usingifupdown)/etc/netplan/50-cloud-init.yaml(if usingnetplan)
Example
To configure a specific network interface with a static IPv4 address and also use a custom name server, use the following configuration:
config:
cloud-init.network-config: |
version: 2
ethernets:
eth1:
addresses:
- 10.10.101.20/24
gateway4: 10.10.101.1
nameservers:
addresses:
- 10.10.10.254Doc Clustering (`doc/clustering.md`)
(clustering)=
Clustering
:titlesonly:
explanation/clustering.md
Form a cluster <howto/cluster_form>
Access a cluster <howto/cluster_access>
Manage a cluster <howto/cluster_manage>
Recover a cluster <howto/cluster_recover>
Manage cluster groups <howto/cluster_groups>
Manage instances <howto/cluster_manage_instance>
Configure storage <howto/cluster_config_storage>
Configure networks <howto/cluster_config_networks>
reference/cluster_member_configDoc Config Options (`doc/config_options.txt`)
// Code generated by generate-config from the incus project; DO NOT EDIT.
:defaultdesc: "`all`"
:shortdesc: "Controls how instances are scheduled to run on this member"
:type: "string"
Possible values are `all`, `manual`, and `group`. See
{ref}`clustering-instance-placement` for more information.:shortdesc: "Free form user key/value storage"
:type: "string"
User keys can be used in search.:shortdesc: "CPU base architecture name"
:type: "string"
The CPU base architecture name as can be found through `qemu -cpu ?`.
This can be a generic definition like `qemu64` or `kvm64`, or it can be a specific hardware architecture like `EPYC-v2`.
It's important to ensure that all servers in the group match that baseline.:shortdesc: "CPU flags to add/remove to/from the baseline"
:type: "string"
A comma separated list of CPU flags to add on top of CPU baseline or a list of flags to remove from it.
To remove a flag, use `-flag`.:shortdesc: "Free form user key/value storage"
:type: "string"
User keys can be used in search.:default: "`true`"
:required: "no"
:shortdesc: "Only for VMs: Whether the disk is attached or ejected"
:type: "bool":default: "`0`"
:required: "no"
:shortdesc: "Boot priority for VMs (higher value boots first), `skip` to skip"
:type: "string":default: "`ceph`"
:required: "no"
:shortdesc: "The cluster name of the Ceph cluster (required for Ceph or CephFS sources)"
:type: "string":default: "`admin`"
:required: "no"
:shortdesc: "The user name of the Ceph cluster (required for Ceph or CephFS sources)"
:type: "string":default: "`false`"
:required: "no"
:shortdesc: "Specifies if the disk is instance dependent"
:type: "bool":required: "no"
:shortdesc: "Initial volume configuration for instance root disk devices"
:type: "string"
For root disk devices, this is used to override the storage pool's default volume
configuration when creating the instance's root volume.
For custom volumes, only `initial.uid`, `initial.gid`, `initial.mode` and
`initial.copy` are accepted. The first three are used when auto-creating
sub-directories inside the custom volume (when the `source` includes a sub-path
that doesn't exist). `initial.copy` copies the container's existing content at
`path` into the volume the first time it's used, if the volume is empty.
`initial.uid`, `initial.gid` and `initial.mode` are also used to set the ownership
and mode of the file system when the `source` is `tmpfs:` or `tmpfs-overlay:`.:default: "`virtio-scsi` for block, `auto` for file system"
:required: "no"
:shortdesc: "Only for VMs: Override the bus for the device"
:type: "string"
This controls what bus a disk device should be attached to.
For block devices (disks), this is one of:
- `nvme`
- `virtio-blk`
- `virtio-scsi` (default)
- `usb`
For file systems (shared directories or custom volumes), this is one of:
- `9p`
- `auto` (default) (`virtiofs` if possible, else `9p`)
- `virtiofs`
`9p` doesn't support hotplugging and `virtiofs` doesn't support live migration. `auto` tries
to use `virtiofs` if possible (`migration.stateful` not set to `true` and host support for
`virtiofsd`) and falls back to `9p` otherwise.:default: "`none`"
:required: "no"
:shortdesc: "Only for VMs: Override the caching mode for the device"
:type: "string"
This controls what bus a disk device should be attached to.
For block devices (disks), this is one of:
- `none` (default)
- `writeback`
- `unsafe`
For file systems (shared directories or custom volumes), this is one of:
- `none` (default)
- `metadata`
- `unsafe`:required: "no"
:shortdesc: "I/O limit in byte/s and/or IOPS for both read and write (same as setting both `limits.read` and `limits.write`)"
:type: "string":required: "no"
:shortdesc: "I/O limit in byte/s and/or IOPS that both reads and writes may burst up to (same as setting both `limits.read.burst` and `limits.write.burst`)"
:type: "string":default: "`1s`"
:required: "no"
:shortdesc: "How long the burst limits may be sustained for (same as setting both `limits.read.burst.length` and `limits.write.burst.length`)"
:type: "string":required: "no"
:shortdesc: "I/O limit in byte/s (various suffixes supported, see {ref}`instances-limit-units`) and/or in IOPS (must be suffixed with `iops`), comma separated when specifying both - see also {ref}`storage-configure-IO`"
:type: "string":required: "no"
:shortdesc: "I/O limit in byte/s and/or IOPS that reads may burst up to for `limits.read.burst.length` (only for virtual machines) - see also {ref}`storage-configure-IO`"
:type: "string":default: "`1s`"
:required: "no"
:shortdesc: "How long `limits.read.burst` may be sustained for before falling back to the sustained limit"
:type: "string":required: "no"
:shortdesc: "I/O limit in byte/s (various suffixes supported, see {ref}`instances-limit-units`) and/or in IOPS (must be suffixed with `iops`), comma separated when specifying both - see also {ref}`storage-configure-IO`"
:type: "string":required: "no"
:shortdesc: "I/O limit in byte/s and/or IOPS that writes may burst up to for `limits.write.burst.length` (only for virtual machines) - see also {ref}`storage-configure-IO`"
:type: "string":default: "`1s`"
:required: "no"
:shortdesc: "How long `limits.write.burst` may be sustained for before falling back to the sustained limit"
:type: "string":required: "yes"
:shortdesc: "Path inside the instance where the disk will be mounted (only for file system disk devices)"
:type: "string"
This controls which path inside the instance the disk should be mounted on.
With containers, this option supports mounting file system disk devices, and paths and single files within them.
With VMs, this option supports mounting file system disk devices and paths within them. Mounting single files is not supported.:required: "no"
:shortdesc: "The storage pool to which the disk device belongs (only applicable for storage volumes managed by Incus)"
:type: "string":required: "no"
:shortdesc: "Controls how a bind-mount is shared between the instance and the host (can be one of `private`, the default, or `shared`, `slave`, `unbindable`, `rshared`, `rslave`, `runbindable`, `rprivate`; see the Linux Kernel [shared subtree](https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt) documentation for a full explanation)"
:type: "string":required: "no"
:shortdesc: "File system specific mount options"
:type: "string":default: "`false`"
:required: "no"
:shortdesc: "Controls whether to make the mount read-only"
:type: "bool":default: "`false`"
:required: "no"
:shortdesc: "Controls whether to recursively mount the source path"
:type: "bool":default: "`true`"
:required: "no"
:shortdesc: "Controls whether to fail if the source doesn't exist"
:type: "bool":default: "`false`"
:required: "no"
:shortdesc: "Sets up a shifting overlay to translate the source UID/GID to match the instance (only for containers)"
:type: "bool":required: "no"
:shortdesc: "Disk size in bytes (various suffixes supported, see {ref}`instances-limit-units`) - only supported for the `rootfs` (`/`)"
:type: "string":required: "no"
:shortdesc: "Same as `size`, but applies to the file-system volume used for saving runtime state in VMs"
:type: "string":required: "yes"
:shortdesc: "Source of a file system or block device (see {ref}`devices-disk-types` for details)"
:type: "string":default: "``"
:required: "no"
:shortdesc: "Only for VMs: Set the disk World Wide Name (only supported on `virtio-scsi` bus)"
:type: "bool":required: "no"
:shortdesc: "The DRM card ID of the GPU device"
:type: "string":required: "yes"
:shortdesc: "The mediated device profile to use (required - for example, `i915-GVTg_V5_4`)"
:type: "string":required: "no"
:shortdesc: "The product ID of the GPU device"
:type: "string":required: "no"
:shortdesc: "The vendor ID of the GPU device"
:type: "string":required: "no"
:shortdesc: "The DRM card ID of the GPU device"
:type: "string":required: "no"
:shortdesc: "Existing MIG compute instance ID"
:type: "int":required: "no"
:shortdesc: "Existing MIG GPU instance ID"
:type: "int":required: "no"
:shortdesc: "Existing MIG device UUID (MIG- prefix can be omitted)"
:type: "string":required: "no"
:shortdesc: "The PCI address of the GPU device"
:type: "string":required: "no"
:shortdesc: "The product ID of the GPU device"
:type: "string":required: "no"
:shortdesc: "The vendor ID of the GPU device"
:type: "string":default: "2GiB"
:required: "no"
:shortdesc: "Size of the host-visible blob memory window for the `virtio-gpu` device"
:type: "string":required: "no"
:shortdesc: "The DRM card ID of the GPU device"
:type: "string":required: "no"
:shortdesc: "The PCI address of the GPU device"
:type: "string":required: "no"
:shortdesc: "The product ID of the GPU device"
:type: "string":required: "no"
:shortdesc: "The vendor ID of the GPU device"
:type: "string":default: "0"
:required: "no"
:shortdesc: "GID of the device owner in the instance (container only)"
:type: "int":required: "no"
:shortdesc: "The DRM card ID of the GPU device"
:type: "string":default: "0660"
:required: "no"
:shortdesc: "Mode of the device in the instance (container only)"
:type: "int":required: "no"
:shortdesc: "NVIDIA GPUDirect P2P clique ID (0 to 15) shared by GPUs allowed to DMA to each other (VM only)"
:type: "int":required: "no"
:shortdesc: "The PCI address of the GPU device"
:type: "string":required: "no"
:shortdesc: "The product ID of the GPU device"
:type: "string":default: "0"
:required: "no"
:shortdesc: "UID of the device owner in the instance (container only)"
:type: "int":required: "no"
:shortdesc: "The vendor ID of the GPU device"
:type: "string":required: "no"
:shortdesc: "The DRM card ID of the parent GPU device"
:type: "string":required: "no"
:shortdesc: "The PCI address of the parent GPU device"
:type: "string":required: "no"
:shortdesc: "The product ID of the parent GPU device"
:type: "string":required: "no"
:shortdesc: "The vendor ID of the parent GPU device"
:type: "string":defaultdesc: "randomly assigned"
:required: "no"
:shortdesc: "The MAC address of the new interface (can be either the full 20-byte variant or the short 8-byte variant, which will only modify the last 8 bytes of the parent device)"
:type: "string":defaultdesc: "parent MTU"
:required: "no"
:shortdesc: "The MTU of the new interface"
:type: "integer":defaultdesc: "kernel assigned"
:required: "no"
:shortdesc: "The name of the interface inside the instance"
:type: "string":required: "yes"
:shortdesc: "The device type (one of `physical` or `sriov`)"
:type: "string":defaultdesc: "kernel assigned"
:required: "no"
:shortdesc: "The node GUID to assign to the virtual function (8 bytes of hex separated by colons)"
:type: "string":defaultdesc: "kernel assigned"
:required: "no"
:shortdesc: "The name of the interface inside the instance"
:type: "string":defaultdesc: "kernel assigned"
:required: "no"
:shortdesc: "The port GUID to assign to the virtual function (8 bytes of hex separated by colons)"
:type: "string":default: "`true`"
:required: "no"
:shortdesc: "Whether the NIC is plugged in or not"
:type: "bool":default: "`skip`"
:managed: "no"
:shortdesc: "Boot priority for VMs (higher value boots first), `skip` to skip"
:type: "string":default: "`true`"
:required: "no"
:shortdesc: "Whether the NIC is connected to the host network"
:type: "bool":default: "randomly assigned"
:managed: "no"
:shortdesc: "The name of the interface on the host"
:type: "string":default: "randomly assigned"
:managed: "no"
:shortdesc: "The MAC address of the new interface"
:type: "string":default: "`virtio`"
:managed: "no"
:shortdesc: "Override the bus for the device (can be `virtio` or `usb`) (VM only)"
:type: "string":managed: "no"
:shortdesc: "An IPv4 address to assign to the instance through DHCP (can be `none` to disable DHCPv4 inside an OCI container and restrict all IPv4 traffic when `security.ipv4_filtering` is set, or a CIDR value to statically configure the address inside an OCI container)"
:type: "string":managed: "no"
:shortdesc: "IPv4 default gateway to statically configure inside an OCI container (`none` to prevent a default gateway from being applied)"
:type: "string":managed: "no"
:shortdesc: "Comma-delimited list of IPv4 static routes to add on host to NIC"
:type: "string":managed: "no"
:shortdesc: "Comma-delimited list of IPv4 static routes to route to the NIC and publish on uplink network (BGP)"
:type: "string":managed: "no"
:shortdesc: "An IPv6 address to assign to the instance through DHCP (can be `none` to disable DHCPv6 and SLAAC inside an OCI container and restrict all IPv6 traffic when `security.ipv6_filtering` is set, or a CIDR value to statically configure the address inside an OCI container)"
:type: "string":managed: "no"
:shortdesc: "IPv6 default gateway to statically configure inside an OCI container (`none` to prevent a default gateway from being applied)"
:type: "string":managed: "no"
:shortdesc: "Comma-delimited list of IPv6 static routes to add on host to NIC"
:type: "string":managed: "no"
:shortdesc: "Comma-delimited list of IPv6 static routes to route to the NIC and publish on uplink network (BGP)"
:type: "string":managed: "no"
:shortdesc: "I/O limit in bit/s for outgoing traffic (various suffixes supported, see {ref}`instances-limit-units`)"
:type: "string":managed: "no"
:shortdesc: "Amount of data in bit that outgoing traffic may send in excess of `limits.egress`, requires `limits.egress.burst`"
:type: "string":managed: "no"
:shortdesc: "I/O limit in bit/s that outgoing traffic may burst up to, requires `limits.egress.bucket`"
:type: "string":managed: "no"
:shortdesc: "I/O limit in bit/s for incoming traffic (various suffixes supported, see {ref}`instances-limit-units`)"
:type: "string":managed: "no"
:shortdesc: "Amount of data in bit that incoming traffic may send in excess of `limits.ingress`, requires `limits.ingress.burst`"
:type: "string":managed: "no"
:shortdesc: "I/O limit in bit/s that incoming traffic may burst up to, requires `limits.ingress.bucket`"
:type: "string":managed: "no"
:shortdesc: "I/O limit in bit/s for both incoming and outgoing traffic (same as setting both limits.ingress and limits.egress)"
:type: "string":managed: "no"
:shortdesc: "Amount of data in bit that traffic may send in excess of the sustained limit (same as setting both `limits.ingress.bucket` and `limits.egress.bucket`)"
:type: "string":managed: "no"
:shortdesc: "I/O limit in bit/s that both incoming and outgoing traffic may burst up to (same as setting both `limits.ingress.burst` and `limits.egress.burst`)"
:type: "string":managed: "no"
:shortdesc: "The priority for outgoing traffic, to be used by the kernel queuing discipline to prioritize network packets"
:type: "integer":default: "MTU of the parent device"
:managed: "yes"
:shortdesc: "The Maximum Transmit Unit (MTU) of the new interface"
:type: "integer":default: "kernel assigned"
:managed: "no"
:shortdesc: "The name of the interface inside the instance"
:type: "string":managed: "no"
:shortdesc: "The managed network to link the device to (instead of specifying the `nictype` directly)"
:type: "string":managed: "yes"
:shortdesc: "The name of the parent host device (required if specifying the `nictype` directly)"
:type: "string":managed: "no"
:shortdesc: "The queuing discipline to set on the NIC, applied to the rate limit's class when a limit is set"
:type: "string":default: "`queue`"
:managed: "no"
:shortdesc: "Only for VMs: Whether to attach the queuing discipline to each transmit queue (`queue`) or to the interface root (`root`)"
:type: "string":managed: "no"
:shortdesc: "The transmit queue length for the NIC"
:type: "integer":managed: "no"
:shortdesc: "Comma-separated list of network ACLs to apply"
:type: "string":default: "drop"
:managed: "no"
:shortdesc: "Action to use for egress traffic that doesn't match any ACL rule"
:type: "string":default: "false"
:managed: "no"
:shortdesc: "Whether to log egress traffic that doesn't match any ACL rule"
:type: "bool":default: "drop"
:managed: "no"
:shortdesc: "Action to use for ingress traffic that doesn't match any ACL rule"
:type: "string":default: "false"
:managed: "no"
:shortdesc: "Whether to log ingress traffic that doesn't match any ACL rule"
:type: "bool":default: "false"
:managed: "no"
:shortdesc: "Prevent the instance from spoofing another instance's IPv4 address (enables `security.mac_filtering`)"
:type: "bool":default: "false"
:managed: "no"
:shortdesc: "Prevent the instance from spoofing another instance's IPv6 address (enables `security.mac_filtering`)"
:type: "bool":default: "false"
:managed: "no"
:shortdesc: "Prevent the instance from spoofing another instance's MAC address"
:type: "bool":default: "false"
:managed: "no"
:shortdesc: "Prevent the NIC from communicating with other NICs in the network that have port isolation enabled"
:type: "bool":managed: "no"
:shortdesc: "The VLAN ID to use for non-tagged traffic (can be none to remove port from default VLAN)"
:type: "integer":managed: "no"
:shortdesc: "Comma-delimited list of VLAN IDs or VLAN ranges to join for tagged traffic"
:type: "integer":default: "`true`"
:required: "no"
:shortdesc: "Whether the NIC is plugged in or not"
:type: "bool":default: "false"
:shortdesc: "Register VLAN using GARP VLAN Registration Protocol"
:type: "bool":default: "randomly assigned"
:shortdesc: "The MAC address of the new interface"
:type: "string":shortdesc: "Comma-delimited list of IPv4 static addresses to add to the instance (in l2 mode, these can be specified as CIDR values or singular addresses using a subnet of /24)"
:type: "string":default: "`auto` (in `l3s` mode), `-` (in `l2` mode)"
:shortdesc: "In `l3s` mode, whether to add an automatic default IPv4 gateway (can be `auto` or `none`). In `l2` mode, the IPv4 address of the gateway"
:type: "string":shortdesc: "The custom policy routing table ID to add IPv4 static routes to (in addition to the main routing table)"
:type: "integer":shortdesc: "Comma-delimited list of IPv6 static addresses to add to the instance (in `l2` mode, these can be specified as CIDR values or singular addresses using a subnet of /64)"
:type: "string":default: "`auto` (in `l3s` mode), `-` (in `l2` mode)"
:shortdesc: "In `l3s` mode, whether to add an automatic default IPv6 gateway (can be `auto` or `none`). In `l2` mode, the IPv6 address of the gateway"
:type: "string":shortdesc: "The custom policy routing table ID to add IPv6 static routes to (in addition to the main routing table)"
:type: "integer":default: "`l3s`"
:shortdesc: "The IPVLAN mode (either `l2` or `l3s`)"
:type: "string":default: "MTU of the parent device"
:shortdesc: "The Maximum Transmit Unit (MTU) of the new interface"
:type: "integer":default: "kernel assigned"
:shortdesc: "The name of the interface inside the instance"
:type: "string":shortdesc: "The name of the host device (required)"
:type: "string":shortdesc: "The VLAN ID to attach to"
:type: "integer":default: "`true`"
:required: "no"
:shortdesc: "Whether the NIC is plugged in or not"
:type: "bool":default: "`skip`"
:managed: "no"
:shortdesc: "Boot priority for VMs (higher value boots first), `skip` to skip"
:type: "string":default: "`true`"
:required: "no"
:shortdesc: "Whether the NIC is connected to the host network (VM only)"
:type: "bool":default: "false"
:managed: "no"
:shortdesc: "Register VLAN using GARP VLAN Registration Protocol"
:type: "bool":default: "randomly assigned"
:managed: "no"
:shortdesc: "The MAC address of the new interface"
:type: "string":default: "`virtio`"
:managed: "no"
:shortdesc: "Override the bus for the device (can be `virtio` or `usb`) (VM only)"
:type: "string":default: "bridge"
:managed: "no"
:shortdesc: "Macvlan mode (one of `bridge`, `vepa`, `passthru` or `private`)"
:type: "string":default: "MTU of the parent device"
:managed: "yes"
:shortdesc: "The Maximum Transmit Unit (MTU) of the new interface"
:type: "integer":default: "kernel assigned"
:managed: "no"
:shortdesc: "The name of the interface inside the instance"
:type: "string":managed: "no"
:shortdesc: "The managed network to link the device to (instead of specifying the `nictype` directly)"
:type: "string":managed: "yes"
:shortdesc: "The name of the parent host device (required if specifying the `nictype` directly)"
:type: "string":managed: "no"
:shortdesc: "The VLAN ID to attach to"
:type: "integer":default: "none"
:managed: "no"
:shortdesc: "Enable hardware offloading (either `none`, `sriov` or `vdpa`)"
:type: "string":default: "`true`"
:required: "no"
:shortdesc: "Whether the NIC is plugged in or not"
:type: "bool":default: "`skip`"
:managed: "no"
:shortdesc: "Boot priority for VMs (higher value boots first), `skip` to skip"
:type: "string":default: "`true`"
:required: "no"
:shortdesc: "Whether the NIC is connected to the host network (requires `acceleration` set to `none`)"
:type: "bool":default: "randomly assigned"
:managed: "no"
:shortdesc: "The name of the interface inside the host"
:type: "string":default: "randomly assigned"
:managed: "no"
:shortdesc: "The MAC address of the new interface"
:type: "string":default: "`virtio`"
:managed: "no"
:shortdesc: "Override the bus for the device (can be `virtio` or `usb`, requires `acceleration` set to `none`) (VM only)"
:type: "string":managed: "no"
:shortdesc: "An IPv4 address to assign to the instance through DHCP, `none` can be used to disable IP allocation (or a CIDR value to statically configure the address inside an OCI container)"
:type: "string":managed: "no"
:shortdesc: "Select a specific external address (typically from a network forward)"
:type: "string":managed: "no"
:shortdesc: "IPv4 default gateway to statically configure inside an OCI container (`none` to prevent a default gateway from being applied)"
:type: "string":managed: "no"
:shortdesc: "Comma-delimited list of IPv4 static routes to route to the NIC"
:type: "string":managed: "no"
:shortdesc: "Comma-delimited list of IPv4 static routes to route to the NIC and publish on uplink network"
:type: "string":managed: "no"
:shortdesc: "An IPv6 address to assign to the instance through DHCP, `none` can be used to disable IP allocation (or a CIDR value to statically configure the address inside an OCI container)"
:type: "string":managed: "no"
:shortdesc: "Select a specific external address (typically from a network forward)"
:type: "string":managed: "no"
:shortdesc: "IPv6 default gateway to statically configure inside an OCI container (`none` to prevent a default gateway from being applied)"
:type: "string":managed: "no"
:shortdesc: "Comma-delimited list of IPv6 static routes to route to the NIC"
:type: "string":managed: "no"
:shortdesc: "Comma-delimited list of IPv6 static routes to route to the NIC and publish on uplink network"
:type: "string":managed: "no"
:shortdesc: "I/O limit in bit/s for outgoing traffic (various suffixes supported, see {ref}`instances-limit-units`)"
:type: "string":managed: "no"
:shortdesc: "Amount of data in bit that outgoing traffic may send in excess of `limits.egress` (mutually exclusive with `limits.max.bucket`)"
:type: "string":managed: "no"
:shortdesc: "I/O limit in bit/s for incoming traffic (various suffixes supported, see {ref}`instances-limit-units`)"
:type: "string":managed: "no"
:shortdesc: "Amount of data in bit that incoming traffic may send in excess of `limits.ingress` (mutually exclusive with `limits.max.bucket`)"
:type: "string":managed: "no"
:shortdesc: "I/O limit in bit/s for both incoming and outgoing traffic. (same as setting both limits.ingress and limits.egress / mutually exclusive with limits.ingress and limits.egress)"
:type: "string":managed: "no"
:shortdesc: "Amount of data in bit that traffic may send in excess of the sustained limit (same as setting both `limits.ingress.bucket` and `limits.egress.bucket` / mutually exclusive with them)"
:type: "string":default: "100"
:managed: "no"
:shortdesc: "The priority for outgoing traffic, to be used by the kernel queuing discipline to prioritize network packets"
:type: "integer":default: "MTU of the parent network"
:managed: "yes"
:shortdesc: "The Maximum Transmit Unit (MTU) of the new interface"
:type: "integer":default: "kernel assigned"
:managed: "no"
:shortdesc: "The name of the interface inside the instance"
:type: "string":managed: "no"
:shortdesc: "The parent NIC name to nest this NIC under (see also `vlan`)"
:type: "string":managed: "yes"
:shortdesc: "The managed network to link the device to (required)"
:type: "string":managed: "no"
:shortdesc: "Comma-separated list of network ACLs to apply"
:type: "string":default: "reject"
:managed: "no"
:shortdesc: "Action to use for egress traffic that doesn't match any ACL rule"
:type: "string":default: "false"
:managed: "no"
:shortdesc: "Whether to log egress traffic that doesn't match any ACL rule"
:type: "bool":default: "reject"
:managed: "no"
:shortdesc: "Action to use for ingress traffic that doesn't match any ACL rule"
:type: "string":default: "false"
:managed: "no"
:shortdesc: "Whether to log ingress traffic that doesn't match any ACL rule"
:type: "bool":default: "false"
:managed: "no"
:shortdesc: "Prevent the instance from spoofing another instance's IPv4 address (enables `security.mac_filtering`)"
:type: "bool":default: "false"
:managed: "no"
:shortdesc: "Prevent the instance from spoofing another instance's IPv6 address (enables `security.mac_filtering`)"
:type: "bool":default: "false"
:managed: "no"
:shortdesc: "Prevent the instance from spoofing another instance's MAC address"
:type: "bool":default: "false"
:managed: "no"
:shortdesc: "Have OVN send unknown network traffic to this network interface (required for some nesting cases)"
:type: "bool":managed: "no"
:shortdesc: "The VLAN ID to use when nesting (see also `nested`)"
:type: "integer":default: "`true`"
:required: "no"
:shortdesc: "Whether the NIC is plugged in or not"
:type: "bool":default: "`skip`"
:shortdesc: "Boot priority for VMs (higher value boots first), `skip` to skip"
:type: "string":default: "`true`"
:required: "no"
:shortdesc: "Whether the NIC is connected to the host network"
:type: "bool":default: "randomly assigned"
:shortdesc: "The name of the interface on the host"
:type: "string":default: "randomly assigned"
:shortdesc: "The MAC address of the new interface"
:type: "string":default: "`virtio`"
:shortdesc: "Override the bus for the device (can be `virtio` or `usb`) (VM only)"
:type: "string":shortdesc: "Comma-delimited list of IPv4 static routes to add on host to NIC"
:type: "string":shortdesc: "Comma-delimited list of IPv6 static routes to add on host to NIC"
:type: "string":shortdesc: "I/O limit in bit/s for outgoing traffic (various suffixes supported, see {ref}`instances-limit-units`)"
:type: "string":managed: "no"
:shortdesc: "Amount of data in bit that outgoing traffic may send in excess of `limits.egress`, requires `limits.egress.burst`"
:type: "string":managed: "no"
:shortdesc: "I/O limit in bit/s that outgoing traffic may burst up to, requires `limits.egress.bucket`"
:type: "string":shortdesc: "I/O limit in bit/s for incoming traffic (various suffixes supported, see {ref}`instances-limit-units`)"
:type: "string":managed: "no"
:shortdesc: "Amount of data in bit that incoming traffic may send in excess of `limits.ingress`, requires `limits.ingress.burst`"
:type: "string":managed: "no"
:shortdesc: "I/O limit in bit/s that incoming traffic may burst up to, requires `limits.ingress.bucket`"
:type: "string":shortdesc: "I/O limit in bit/s for both incoming and outgoing traffic (same as setting both limits.ingress and limits.egress)"
:type: "string":managed: "no"
:shortdesc: "Amount of data in bit that traffic may send in excess of the sustained limit (same as setting both `limits.ingress.bucket` and `limits.egress.bucket`)"
:type: "string":managed: "no"
:shortdesc: "I/O limit in bit/s that both incoming and outgoing traffic may burst up to (same as setting both `limits.ingress.burst` and `limits.egress.burst`)"
:type: "string":shortdesc: "The priority for outgoing traffic, to be used by the kernel queuing discipline to prioritize network packets"
:type: "integer":default: "kernel assigned"
:shortdesc: "The Maximum Transmit Unit (MTU) of the new interface"
:type: "integer":default: "kernel assigned"
:shortdesc: "The name of the interface inside the instance"
:type: "string":shortdesc: "The queuing discipline to set on the NIC, applied to the rate limit's class when a limit is set"
:type: "string":default: "`queue`"
:shortdesc: "Only for VMs: Whether to attach the queuing discipline to each transmit queue (`queue`) or to the interface root (`root`)"
:type: "string":shortdesc: "The transmit queue length for the NIC"
:type: "integer":default: "`true`"
:required: "no"
:shortdesc: "Whether the NIC is plugged in or not"
:type: "bool":default: "`skip`"
:managed: "no"
:shortdesc: "Boot priority for VMs (higher value boots first), `skip` to skip"
:type: "string":condition: "container"
:default: "false"
:managed: "no"
:shortdesc: "Register VLAN using GARP VLAN Registration Protocol"
:type: "bool":condition: "container"
:default: "randomly assigned"
:managed: "no"
:shortdesc: "The MAC address of the new interface"
:type: "string":condition: "container"
:default: "MTU of the parent device"
:managed: "no"
:shortdesc: "The Maximum Transmit Unit (MTU) of the new interface"
:type: "integer":default: "kernel assigned"
:managed: "no"
:shortdesc: "The name of the interface inside the instance"
:type: "string":managed: "no"
:shortdesc: "The managed network to link the device to (instead of specifying the `nictype` directly)"
:type: "string":managed: "yes"
:shortdesc: "The name of the parent host device (required if specifying the `nictype` directly)"
:type: "string":condition: "container"
:managed: "no"
:shortdesc: "The VLAN ID to attach to"
:type: "integer":condition: "container"
:managed: "no"
:shortdesc: "Comma-delimited list of VLAN IDs or VLAN ranges to join for tagged traffic"
:type: "integer":default: "`true`"
:required: "no"
:shortdesc: "Whether the NIC is plugged in or not"
:type: "bool":default: "`true`"
:required: "no"
:shortdesc: "Whether the NIC is connected to the host network"
:type: "bool":default: "false"
:shortdesc: "Register VLAN using GARP VLAN Registration Protocol"
:type: "bool":default: "randomly assigned"
:shortdesc: "The name of the interface on the host"
:type: "string":default: "randomly assigned"
:shortdesc: "The MAC address of the new interface"
:type: "string":default: "`virtio`"
:shortdesc: "Override the bus for the device (can be `virtio` or `usb`) (VM only)"
:type: "string":shortdesc: "Comma-delimited list of IPv4 static addresses to add to the instance"
:type: "string":default: "auto"
:shortdesc: "Whether to add an automatic default IPv4 gateway (can be `auto` or `none`)"
:type: "string":default: "`169.254.0.1`"
:shortdesc: "The IPv4 address to add to the host-side `veth` interface"
:type: "string":shortdesc: "Deprecated: Use `ipv4.host_tables` instead"
:type: "integer"
The custom policy routing table ID to add IPv4 static routes to (in addition to the main routing table):default: "254"
:shortdesc: "Comma-delimited list of routing tables IDs to add IPv4 static routes to"
:type: "string":default: "true"
:shortdesc: "Whether to probe the parent network for IP address availability"
:type: "bool":shortdesc: "Comma-delimited list of IPv4 static routes to add on host to NIC (without L2 ARP/NDP proxy)"
:type: "string":shortdesc: "Comma-delimited list of IPv6 static addresses to add to the instance"
:type: "string":default: "auto"
:shortdesc: "Whether to add an automatic default IPv6 gateway (can be `auto` or `none`)"
:type: "string":default: "`fe80::1`"
:shortdesc: "The IPv6 address to add to the host-side `veth` interface"
:type: "string":shortdesc: "Deprecated: Use `ipv6.host_tables` instead"
:type: "integer"
The custom policy routing table ID to add IPv6 static routes to (in addition to the main routing table):default: "254"
:shortdesc: "Comma-delimited list of routing tables IDs to add IPv6 static routes to"
:type: "string":default: "true"
:shortdesc: "Whether to probe the parent network for IP address availability"
:type: "bool":shortdesc: "Comma-delimited list of IPv6 static routes to add on host to NIC (without L2 ARP/NDP proxy)"
:type: "string":shortdesc: "I/O limit in bit/s for outgoing traffic (various suffixes supported, see {ref}`instances-limit-units`)"
:type: "string":managed: "no"
:shortdesc: "Amount of data in bit that outgoing traffic may send in excess of `limits.egress`, requires `limits.egress.burst`"
:type: "string":managed: "no"
:shortdesc: "I/O limit in bit/s that outgoing traffic may burst up to, requires `limits.egress.bucket`"
:type: "string":shortdesc: "I/O limit in bit/s for incoming traffic (various suffixes supported, see {ref}`instances-limit-units`)"
:type: "string":managed: "no"
:shortdesc: "Amount of data in bit that incoming traffic may send in excess of `limits.ingress`, requires `limits.ingress.burst`"
:type: "string":managed: "no"
:shortdesc: "I/O limit in bit/s that incoming traffic may burst up to, requires `limits.ingress.bucket`"
:type: "string":shortdesc: "I/O limit in bit/s for both incoming and outgoing traffic (same as setting both limits.ingress and limits.egress)"
:type: "string":managed: "no"
:shortdesc: "Amount of data in bit that traffic may send in excess of the sustained limit (same as setting both `limits.ingress.bucket` and `limits.egress.bucket`)"
:type: "string":managed: "no"
:shortdesc: "I/O limit in bit/s that both incoming and outgoing traffic may burst up to (same as setting both `limits.ingress.burst` and `limits.egress.burst`)"
:type: "string":shortdesc: "The priority for outgoing traffic, to be used by the kernel queuing discipline to prioritize network packets"
:type: "integer":default: "parent MTU"
:shortdesc: "The Maximum Transmit Unit (MTU) of the new interface"
:type: "integer":default: "kernel assigned"
:shortdesc: "The name of the interface inside the instance"
:type: "string":shortdesc: "The name of the parent host device to join the instance to"
:type: "string":shortdesc: "The queuing discipline to set on the NIC, applied to the rate limit's class when a limit is set"
:type: "string":default: "`queue`"
:shortdesc: "Only for VMs: Whether to attach the queuing discipline to each transmit queue (`queue`) or to the interface root (`root`)"
:type: "string":shortdesc: "The transmit queue length for the NIC"
:type: "integer":shortdesc: "The VLAN ID to attach to"
:type: "integer":shortdesc: "The VRF on the host in which the host-side interface and routes are created"
:type: "string":default: "`true`"
:required: "no"
:shortdesc: "Whether the NIC is plugged in or not"
:type: "bool":default: "`skip`"
:managed: "no"
:shortdesc: "Boot priority for VMs (higher value boots first), `skip` to skip"
:type: "string":default: "randomly assigned"
:managed: "no"
:shortdesc: "The MAC address of the new interface"
:type: "string":default: "kernel assigned"
:managed: "yes"
:shortdesc: "The Maximum Transmit Unit (MTU) of the new interface"
:type: "integer":default: "kernel assigned"
:managed: "no"
:shortdesc: "The name of the interface inside the instance"
:type: "string":managed: "no"
:shortdesc: "The managed network to link the device to (instead of specifying the `nictype` directly)"
:type: "string":managed: "yes"
:shortdesc: "The name of the parent host device (required if specifying the `nictype` directly)"
:type: "string":required: "no"
:shortdesc: "The PCI address of the parent host device"
:type: "string":required: "no"
:shortdesc: "The product ID of the parent host device"
:type: "string":default: "false"
:managed: "no"
:shortdesc: "Prevent the instance from spoofing another instance's MAC address"
:type: "bool":default: "false, if supported by parent device"
:managed: "no"
:shortdesc: "Allows the instance to configure the NIC in ways that may negatively impact security."
:type: "bool":required: "no"
:shortdesc: "The vendor ID of the parent host device"
:type: "string":managed: "no"
:shortdesc: "The VLAN ID to attach to"
:type: "integer":required: "yes"
:shortdesc: "PCI address of the device"
:type: "string":default: "true"
:required: "no"
:shortdesc: "Whether to expose the device's option ROM to the VM"
:type: "bool":default: "`host`"
:required: "no"
:shortdesc: "Which side to bind on (`host`/`instance`)"
:type: "string":required: "yes"
:shortdesc: "The address and port to connect to (`<type>:<addr>:<port>[-<port>][,<port>]`)"
:type: "string":default: "`0`"
:required: "no"
:shortdesc: "GID of the owner of the listening Unix socket"
:type: "int":required: "yes"
:shortdesc: "The address and port to bind and listen (`<type>:<addr>:<port>[-<port>][,<port>]`)"
:type: "string":default: "`0644`"
:required: "no"
:shortdesc: "Mode for the listening Unix socket"
:type: "int":default: "`false`"
:required: "no"
:shortdesc: "Whether to optimize proxying via NAT"
:type: "bool":default: "`false`"
:required: "no"
:shortdesc: "Whether to use the HAProxy PROXY protocol to transmit sender information"
:type: "bool":default: "`0`"
:required: "no"
:shortdesc: "What GID to drop privilege to"
:type: "int":default: "`0`"
:required: "no"
:shortdesc: "What UID to drop privilege to"
:type: "int":default: "`0`"
:required: "no"
:shortdesc: "UID of the owner of the listening Unix socket"
:type: "int":default: "-"
:required: "for containers"
:shortdesc: "Only for containers: path inside the instance (for example, `/dev/tpm0`)"
:type: "string":default: "-"
:required: "for containers"
:shortdesc: "Only for containers: resource manager path inside the instance (for example, `/dev/tpmrm0`)"
:type: "string":default: "0"
:shortdesc: "GID of the device owner in the instance"
:type: "int":shortdesc: "I/O limit in byte/s and/or IOPS (comma separated) for read operations"
:type: "string":shortdesc: "I/O limit in byte/s and/or IOPS (comma separated) for write operations"
:type: "string":default: "device on host"
:shortdesc: "Device major number"
:type: "int":default: "device on host"
:shortdesc: "Device minor number"
:type: "int":default: "0660"
:shortdesc: "Mode of the device in the instance"
:type: "int":shortdesc: "Path inside the instance (one of `source` and `path` must be set)"
:type: "string":default: "true"
:shortdesc: "Whether this device is required to start the instance"
:type: "bool":shortdesc: "Path on the host (one of `source` and `path` must be set)"
:type: "string":default: "0"
:shortdesc: "UID of the device owner in the instance"
:type: "int":default: "0"
:shortdesc: "GID of the device owner in the instance"
:type: "int":default: "0660"
:shortdesc: "Mode of the device in the instance"
:type: "int":shortdesc: "The PCI address of a USB controller to monitor"
:type: "string":shortdesc: "The product ID of the USB device"
:type: "string":default: "true"
:shortdesc: "Whether this device is required to start the instance"
:type: "bool":default: "0"
:shortdesc: "UID of the device owner in the instance"
:type: "int":shortdesc: "The vendor ID of the USB device"
:type: "string":default: "`true`"
:required: "no"
:shortdesc: "Whether the USB device is plugged in or not"
:type: "bool":shortdesc: "The bus number of which the USB device is attached"
:type: "int":shortdesc: "The device number of the USB device"
:type: "int":defaultdesc: "`0`"
:shortdesc: "Only for containers: GID of the device owner in the instance"
:type: "int":defaultdesc: "`0660`"
:shortdesc: "Only for containers: Mode of the device in the instance"
:type: "int":shortdesc: "The product ID of the USB device"
:type: "string":defaultdesc: "`false`"
:shortdesc: "Whether this device is required to start the instance (the default is `false`, and all devices can be hotplugged)"
:type: "bool":shortdesc: "The serial number of the USB device"
:type: "string":defaultdesc: "`0`"
:shortdesc: "Only for containers: UID of the device owner in the instance"
:type: "int":shortdesc: "The vendor ID of the USB device"
:type: "string":shortdesc: "If set to `true`, indicates that the VM requires an `agent:config` disk be added."
:type: "bool":shortdesc: "If set to `true`, indicates that the VM requires a `cloud-init:config` disk be present every time `cloud-init` should be run."
:type: "bool":shortdesc: "If set to `v1`, indicates that the image requires the host to run cgroup v1."
:type: "string":shortdesc: "If set to `true`, indicates that the image cannot work without nesting enabled."
:type: "bool":shortdesc: "If set to `false`, indicates that the image cannot work as a privileged container."
:type: "bool":shortdesc: "If set to `false`, indicates that the image cannot boot under secure boot."
:type: "bool":liveupdate: "no"
:shortdesc: "Whether to automatically restart an instance on unexpected exit"
:type: "bool"
If set to `true` will attempt up to 10 restarts over a 1 minute period upon unexpected instance exit.:liveupdate: "no"
:shortdesc: "Whether to always start the instance when the daemon starts"
:type: "bool"
If unset or set to `last-state`, restores the last state.:defaultdesc: "0"
:liveupdate: "no"
:shortdesc: "Delay after starting the instance"
:type: "integer"
The number of seconds to wait after the instance started before starting the next one.:liveupdate: "no"
:shortdesc: "What order to start the instances in"
:type: "integer"
The instance with the highest value is started first.
Instances without a priority set will be started (with some parallelism) ahead of
instances with a priority set.:defaultdesc: "stop"
:liveupdate: "yes"
:shortdesc: "What action to take on the instance when the host is shut down"
:type: "string"
Action to take on host shut down
Valid values are: `stop`, `force-stop` or `stateful-stop`:defaultdesc: "30"
:liveupdate: "yes"
:shortdesc: "How long to wait for the instance to shut down"
:type: "integer"
Number of seconds to wait for the instance to shut down before it is force-stopped.:defaultdesc: "no"
:liveupdate: "yes"
:shortdesc: "Whether to enable PXE boot"
:type: "bool":defaultdesc: "0"
:liveupdate: "no"
:shortdesc: "What order to shut down the instances in"
:type: "integer"
The instance with the highest value is shut down first.:condition: "If supported by image"
:defaultdesc: "`DHCP on eth0`"
:liveupdate: "no"
:shortdesc: "Network configuration for `cloud-init`"
:type: "string"
The content is used as seed value for `cloud-init`.:condition: "If supported by image"
:defaultdesc: "`#cloud-config`"
:liveupdate: "no"
:shortdesc: "User data for `cloud-init`"
:type: "string"
The content is used as seed value for `cloud-init`.:condition: "If supported by image"
:defaultdesc: "`#cloud-config`"
:liveupdate: "no"
:shortdesc: "Vendor data for `cloud-init`"
:type: "string"
The content is used as seed value for `cloud-init`.:condition: "If supported by image"
:defaultdesc: "`DHCP on eth0`"
:liveupdate: "no"
:shortdesc: "Legacy version of `cloud-init.network-config`"
:type: "string":condition: "If supported by image"
:defaultdesc: "`#cloud-config`"
:liveupdate: "no"
:shortdesc: "Legacy version of `cloud-init.user-data`"
:type: "string":condition: "If supported by image"
:defaultdesc: "`#cloud-config`"
:liveupdate: "no"
:shortdesc: "Legacy version of `cloud-init.vendor-data`"
:type: "string":condition: "container"
:defaultdesc: "`false`"
:liveupdate: "yes"
:shortdesc: "Whether to use incremental memory transfer"
:type: "bool"
Using incremental memory transfer of the instance's memory can reduce downtime.:condition: "container"
:defaultdesc: "`70`"
:liveupdate: "yes"
:shortdesc: "Percentage of memory to have in sync before stopping the instance"
:type: "integer":condition: "container"
:defaultdesc: "`10`"
:liveupdate: "yes"
:shortdesc: "Maximum number of transfer operations to go through before stopping the instance"
:type: "integer":defaultdesc: "`false`"
:liveupdate: "no"
:shortdesc: "Whether to allow for stateful stop/start and snapshots"
:type: "bool"
Enabling this option prevents the use of some features that are incompatible with it.:condition: "virtual machine"
:defaultdesc: "`false`"
:liveupdate: "no"
:shortdesc: "Whether to use the name and MTU of the default network interfaces"
:type: "bool"
For containers, the name and MTU of the default network interfaces is used for the instance devices.
For virtual machines, set this option to `true` to set the name and MTU of the default network interfaces to be the same as the instance devices./* Detailed source-code truncated for AI context efficiency. */:liveupdate: "yes"
:shortdesc: "Free-form environment key/value"
:type: "string"
Extra environment variables to set on boot and during exec.:condition: "container"
:liveupdate: "yes"
:shortdesc: "Kernel modules to load before starting the instance"
:type: "string"
Specify the kernel modules as a comma-separated list.:condition: "container"
:liveupdate: "no"
:shortdesc: "Override for the corresponding `sysctl` setting in the container"
:type: "string":liveupdate: "yes"
:shortdesc: "Free-form `SMBIOS Type 11` key/value"
:type: "string"
`SMBIOS Type 11` configuration keys.:liveupdate: "yes"
:shortdesc: "Systemd credential key/value, where value is Base64 encoded"
:type: "string"
Systemd credential key/value pair passed as a read-only bind mount in containers and as `SMBIOS Type 11` data in virtual machines. The value is Base64 encoded.:liveupdate: "yes"
:shortdesc: "Systemd credential key/value"
:type: "string"
Systemd credential key/value pair passed as a read-only bind mount in containers and as `SMBIOS Type 11` data in virtual machines.:liveupdate: "yes"
:shortdesc: "Free-form user key/value storage"
:type: "string"
User keys can be used in search.:condition: "container"
:defaultdesc: "`compute,utility`"
:liveupdate: "no"
:shortdesc: "What driver capabilities the instance needs"
:type: "string"
The specified driver capabilities are used to set `libnvidia-container NVIDIA_DRIVER_CAPABILITIES`.:condition: "container"
:liveupdate: "no"
:shortdesc: "Required CUDA version"
:type: "string"
The specified version expression is used to set `libnvidia-container NVIDIA_REQUIRE_CUDA`.:condition: "container"
:liveupdate: "no"
:shortdesc: "Required driver version"
:type: "string"
The specified version expression is used to set `libnvidia-container NVIDIA_REQUIRE_DRIVER`.:condition: "container"
:defaultdesc: "`false`"
:liveupdate: "no"
:shortdesc: "Whether to pass the host NVIDIA and CUDA runtime libraries into the instance"
:type: "bool":condition: "OCI container"
:liveupdate: "no"
:shortdesc: "Working directory"
:type: "string"
Override the working directory of an OCI container.:condition: "OCI container"
:liveupdate: "no"
:shortdesc: "DNS domain"
:type: "string"
Domain name for `resolv.conf`.
When set, the domain name received over DHCP is ignored.:condition: "OCI container"
:liveupdate: "no"
:shortdesc: "DNS name servers"
:type: "string"
Comma-separated list of name server addresses for `resolv.conf`.
When set, name servers received over DHCP are ignored.:condition: "OCI container"
:liveupdate: "no"
:shortdesc: "DNS search domains"
:type: "string"
Comma-separated list of search domains for `resolv.conf`.
When set, search domains received over DHCP are ignored.:condition: "OCI container"
:liveupdate: "no"
:shortdesc: "Entry point"
:type: "string"
Override the entry point of an OCI container.:condition: "OCI container"
:liveupdate: "no"
:shortdesc: "Process GID"
:type: "string"
Override the GID of the process run in an OCI container.:condition: "OCI container"
:liveupdate: "no"
:shortdesc: "Process UID"
:type: "string"
Override the UID of the process run in an OCI container.:condition: "virtual machine"
:liveupdate: "yes"
:shortdesc: "Base64-encoded NVRAM variable value to set when generating the NVRAM, optionally prefixed by its attributes"
:type: "blob"
Base64-encoded variable value to set when generating the NVRAM, optionally prefixed by `<attributes>:`, with `<attributes>` an integer.:condition: "virtual machine"
:liveupdate: "yes"
:shortdesc: "Dissected NVRAM variable value to set when generating the NVRAM"
:type: "blob":liveupdate: "yes"
:shortdesc: "AppArmor profile entries"
:type: "blob"
The specified entries are appended to the generated profile.:condition: "unprivileged container"
:liveupdate: "no"
:shortdesc: "Raw idmap configuration"
:type: "blob"
For example: `both 1000 1000`:condition: "container"
:liveupdate: "no"
:shortdesc: "Raw LXC configuration to be appended to the generated one"
:type: "blob":condition: "virtual machine"
:liveupdate: "no"
:shortdesc: "Raw QEMU configuration to be appended to the generated command line"
:type: "blob":condition: "virtual machine"
:liveupdate: "no"
:shortdesc: "Addition/override to the generated `qemu.conf` file"
:type: "blob"
See {ref}`instance-options-qemu` for more information.:condition: "virtual machine"
:liveupdate: "no"
:shortdesc: "QMP commands to run before Incus QEMU initialization"
:type: "blob":condition: "virtual machine"
:liveupdate: "no"
:shortdesc: "QMP commands to run after the VM has started"
:type: "blob":condition: "virtual machine"
:liveupdate: "no"
:shortdesc: "QMP commands to run after Incus QEMU initialization and before the VM has started"
:type: "blob":condition: "virtual machine"
:liveupdate: "no"
:shortdesc: "QEMU scriptlet to run at early, pre-start and post-start stages"
:type: "string":condition: "container"
:liveupdate: "no"
:shortdesc: "Raw Seccomp configuration"
:type: "blob":defaultdesc: "1 (VMs)"
:liveupdate: "yes"
:shortdesc: "Which CPUs to expose to the instance"
:type: "string"
A number or a specific range of CPUs to expose to the instance.
For virtual machines, a CPU topology of the form `sockets=2,cores=4,threads=2` may also be provided.
See {ref}`instance-options-limits-cpu` for more information.:condition: "container"
:defaultdesc: "100%"
:liveupdate: "yes"
:shortdesc: "How much of the CPU can be used"
:type: "string"
To control how much of the CPU can be used, specify either a percentage (`50%`) for a soft limit
or a chunk of time (`25ms/100ms`) for a hard limit.
See {ref}`instance-options-limits-cpu-container` for more information.:liveupdate: "yes"
:shortdesc: "Which NUMA nodes to place the instance CPUs on"
:type: "string"
A comma-separated list of NUMA node IDs or ranges to place the instance CPUs on.
Alternatively, the value `balanced` may be used to have Incus pick the least busy NUMA node on startup.
See {ref}`instance-options-limits-cpu-container` for more information.:condition: "container"
:defaultdesc: "`10` (maximum)"
:liveupdate: "yes"
:shortdesc: "CPU scheduling priority compared to other instances"
:type: "integer"
When overcommitting resources, specify the CPU scheduling priority compared to other instances that share the same CPUs.
Specify an integer between 0 and 10.
See {ref}`instance-options-limits-cpu-container` for more information.:defaultdesc: "`5` (medium)"
:liveupdate: "yes"
:shortdesc: "Priority of the instance's I/O requests"
:type: "integer"
Controls how much priority to give to the instance's I/O requests when under load.
Specify an integer between 0 and 10.:condition: "container"
:liveupdate: "yes"
:shortdesc: "Limit for the number of 1 GB huge pages"
:type: "string"
Fixed value (in bytes) to limit the number of 1 GB huge pages.
Various suffixes are supported (see {ref}`instances-limit-units`).
See {ref}`instance-options-limits-hugepages` for more information.:condition: "container"
:liveupdate: "yes"
:shortdesc: "Limit for the number of 1 MB huge pages"
:type: "string"
Fixed value (in bytes) to limit the number of 1 MB huge pages.
Various suffixes are supported (see {ref}`instances-limit-units`).
See {ref}`instance-options-limits-hugepages` for more information.:condition: "container"
:liveupdate: "yes"
:shortdesc: "Limit for the number of 2 MB huge pages"
:type: "string"
Fixed value (in bytes) to limit the number of 2 MB huge pages.
Various suffixes are supported (see {ref}`instances-limit-units`).
See {ref}`instance-options-limits-hugepages` for more information.:condition: "container"
:liveupdate: "yes"
:shortdesc: "Limit for the number of 64 KB huge pages"
:type: "string"
Fixed value (in bytes) to limit the number of 64 KB huge pages.
Various suffixes are supported (see {ref}`instances-limit-units`).
See {ref}`instance-options-limits-hugepages` for more information.:defaultdesc: "`1GiB` (VMs)"
:liveupdate: "yes"
:shortdesc: "Usage limit for the host's memory"
:type: "string"
Percentage of the host's memory or a fixed value in bytes.
Various suffixes are supported.
See {ref}`instances-limit-units` for details.:condition: "container"
:defaultdesc: "`hard`"
:liveupdate: "yes"
:shortdesc: "Whether the memory limit is `hard` or `soft`"
:type: "string"
If the instance's memory limit is `hard`, the instance cannot exceed its limit.
If it is `soft`, the instance can exceed its memory limit when extra host memory is available.:condition: "virtual machine"
:defaultdesc: "`true`"
:liveupdate: "yes"
:shortdesc: "Control upper limit for hotplugged memory or disable memory hotplug."
:type: "string"
If this option is set to `false`, disable memory hotplug entirely.
Alternatively, it can be set to a bytes value which will define an upper limit for hotplugged memory.
The value must be greater than or equal to limits.memory.:condition: "virtual machine"
:defaultdesc: "`false`"
:liveupdate: "no"
:shortdesc: "Whether to back the instance using huge pages"
:type: "bool"
If this option is set to `false`, regular system memory is used.:defaultdesc: "`0`"
:liveupdate: "yes"
:shortdesc: "Out Of Memory killer priority adjustment for the instance"
:type: "integer"
Specify an integer between -1000 and 1000.
A negative value makes the instance less likely to be killed by the Out Of Memory killer,
while a positive value makes it more likely to be killed.
The default value of 0 means no adjustment to the Out Of Memory score.:condition: "container"
:defaultdesc: "`true`"
:liveupdate: "yes"
:shortdesc: "Control swap usage by the instance"
:type: "string"
When set to `true` or `false`, it controls whether the container is likely to get some of
its memory swapped by the kernel. Alternatively, it can be set to a bytes value which will
then allow the container to make use of additional memory through swap.
Support for this is limited on cgroup2 systems due to lack of swap priority control.:condition: "container"
:defaultdesc: "`10` (maximum)"
:liveupdate: "yes"
:shortdesc: "Prevents the instance from being swapped to disk"
:type: "integer"
Specify an integer between 0 and 10.
The higher the value, the less likely the instance is to be swapped to disk.
This currently doesn't have any effect on cgroup2 systems.:condition: "container"
:defaultdesc: "empty"
:liveupdate: "yes"
:shortdesc: "Maximum number of processes that can run in the instance"
:type: "integer"
If left empty, no limit is set.:condition: "virtual machine"
:liveupdate: "yes"
:shortdesc: "Initial authorized signature database entries to enroll when generating the NVRAM (PEM certificate and signature bundle)"
:type: "string"
This option accepts signatures armored with `SIGNATURE` in addition to certificates.:condition: "virtual machine"
:liveupdate: "yes"
:shortdesc: "Initial authorized timestamp signature database certificates to enroll when generating the NVRAM (PEM certificate bundle)"
:type: "string":condition: "virtual machine"
:liveupdate: "yes"
:shortdesc: "Initial forbidden signature database entries to enroll when generating the NVRAM (PEM certificate and signature bundle)"
:type: "string"
This option accepts signatures armored with `SIGNATURE` in addition to certificates.:condition: "virtual machine"
:liveupdate: "yes"
:shortdesc: "Initial key exchange keys to enroll when generating the NVRAM (PEM certificate bundle)"
:type: "string":condition: "virtual machine"
:liveupdate: "yes"
:shortdesc: "Initial machine owner key entries to enroll when generating the NVRAM (PEM certificate and signature bundle)"
:type: "string"
This option accepts signatures armored with `SIGNATURE` in addition to certificates.:condition: "virtual machine"
:liveupdate: "yes"
:shortdesc: "Initial platform key to enroll when generating the NVRAM (PEM certificate)"
:type: "string":condition: "virtual machine"
:defaultdesc: "`true`"
:liveupdate: "no"
:shortdesc: "Whether the `incus-agent` is queried for state information and metrics"
:type: "bool":condition: "unprivileged container"
:liveupdate: "no"
:shortdesc: "What BPF attach types to delegate"
:type: "string"
See {ref}`bpf-tokens` for more information.:condition: "unprivileged container"
:liveupdate: "no"
:shortdesc: "What BPF command types to delegate"
:type: "string"
See {ref}`bpf-tokens` for more information.:condition: "unprivileged container"
:liveupdate: "no"
:shortdesc: "What BPF map types to delegate"
:type: "string"
See {ref}`bpf-tokens` for more information.:condition: "unprivileged container"
:liveupdate: "no"
:shortdesc: "What BPF program types to delegate"
:type: "string"
See {ref}`bpf-tokens` for more information.:condition: "unprivileged container"
:defaultdesc: "`/sys/fs/bpf`"
:liveupdate: "no"
:shortdesc: "The path to mount the BPF file system at"
:type: "string"
The specified path must exist in the container.
The BPF file system is only mounted if any of the `security.bpffs.delegate_*` options are set.
See {ref}`bpf-tokens` for more information.:condition: "virtual machine"
:defaultdesc: "`false`"
:liveupdate: "no"
:shortdesc: "Whether to use a firmware that supports UEFI-incompatible operating systems"
:type: "bool"
When enabling this option, set {config:option}`instance-security:security.secureboot` to `false`.:defaultdesc: "`true`"
:liveupdate: "no"
:shortdesc: "Whether `/dev/incus` is present in the instance"
:type: "bool"
See {ref}`dev-incus` for more information.:condition: "container"
:defaultdesc: "`false`"
:liveupdate: "no"
:shortdesc: "Controls the availability of the `/1.0/images` API over `guestapi`"
:type: "bool":condition: "unprivileged container"
:liveupdate: "no"
:shortdesc: "The base host ID to use for the ID map"
:type: "integer"
The range can be shared by other containers using the same base and can't be combined with `security.idmap.isolated`.:condition: "unprivileged container"
:defaultdesc: "`false`"
:liveupdate: "no"
:shortdesc: "Whether to use a unique idmap for this instance"
:type: "bool"
If specified, the idmap used for this instance is unique among instances that have this option set.:condition: "unprivileged container"
:liveupdate: "no"
:shortdesc: "The size of the idmap to use"
:type: "integer":condition: "virtual machine"
:defaultdesc: "`false`"
:liveupdate: "no"
:shortdesc: "Whether to enable virtual IOMMU, useful for device passthrough and nesting"
:type: "bool":defaultdesc: "`false` (containers), `true` (VMs)"
:liveupdate: "yes (containers only)"
:shortdesc: "Whether to allow nesting inside of the instance"
:type: "bool"
For containers, this controls whether Incus (nested) can be run inside of the instance.
For virtual machines, setting this to `false` disables nested virtualization (turns off the `svm` and `vmx` CPU flags).
Explicitly setting this to `true` on a virtual machine also makes it use non-shared memory (allowing transparent huge pages) unless a device requires shared memory, see {ref}`performance-tuning-vm-memory`.:condition: "container"
:defaultdesc: "`false`"
:liveupdate: "no"
:shortdesc: "Whether to run the instance in privileged mode"
:type: "bool":defaultdesc: "`false`"
:liveupdate: "yes"
:shortdesc: "Prevents the instance from being deleted"
:type: "bool":condition: "container"
:defaultdesc: "`false`"
:liveupdate: "yes"
:shortdesc: "Whether to protect the file system from being UID/GID shifted"
:type: "bool"
Set this option to `true` to prevent the instance's file system from being UID/GID shifted on startup.:defaultdesc: "`false`"
:liveupdate: "yes"
:shortdesc: "Prevents the instance from being started"
:type: "bool":condition: "virtual machine"
:defaultdesc: "`true`"
:liveupdate: "no"
:shortdesc: "Whether UEFI secure boot is enforced with the default Microsoft keys"
:type: "bool"
When disabling this option, consider enabling {config:option}`instance-security:security.csm`.:condition: "container or virtual machine"
:defaultdesc: "auto-detected (`container_init_t` for containers, `qemu_t` for VMs)"
:liveupdate: "no"
:shortdesc: "SELinux process domain override"
:type: "string"
Override the SELinux process domain for the instance.:condition: "container"
:defaultdesc: "`auto`"
:liveupdate: "no"
:shortdesc: "SELinux rootfs labeling mode (auto, always, never)"
:type: "string"
Control SELinux rootfs labeling behavior.
The default (`auto`) will label rootfs files if it is required. Labeling will be skipped
only if `security.selinux.level` is explicitly set for the instance, it is not started for
the first time and the persisted SELinux context is still valid.
Setting to `always` will label rootfs files on every start and `never` will never touch any
file labels in the rootfs.:condition: "container or virtual machine"
:defaultdesc: "auto-generated"
:liveupdate: "no"
:shortdesc: "SELinux MCS level override"
:type: "string"
Override the SELinux MCS level for the instance.
This key must only be set on individual instances, never on profiles,
since using the same MCS level across instances breaks isolation.
Values set via profiles are ignored.:condition: "container or virtual machine"
:defaultdesc: "auto-detected (`container_file_t` for containers, `qemu_image_t` for VMs)"
:liveupdate: "no"
:shortdesc: "SELinux file type override"
:type: "string"
Override the SELinux file type used for labeling instance storage.:condition: "virtual machine"
:defaultdesc: "`false`"
:liveupdate: "no"
:shortdesc: "Whether AMD SEV (Secure Encrypted Virtualization) is enabled for this VM"
:type: "bool":condition: "virtual machine"
:defaultdesc: "`false`"
:liveupdate: "no"
:shortdesc: "Whether AMD SEV-ES (SEV Encrypted State) is enabled for this VM"
:type: "bool":condition: "virtual machine"
:defaultdesc: "`true`"
:liveupdate: "no"
:shortdesc: "The guest owner's `base64`-encoded session blob"
:type: "string":condition: "virtual machine"
:defaultdesc: "`true`"
:liveupdate: "no"
:shortdesc: "The guest owner's `base64`-encoded Diffie-Hellman key"
:type: "string":condition: "container"
:liveupdate: "no"
:shortdesc: "List of syscalls to allow"
:type: "string"
A `\n`-separated list of syscalls to allow.
This list must be mutually exclusive with `security.syscalls.deny*`.:condition: "container"
:liveupdate: "no"
:shortdesc: "List of syscalls to deny"
:type: "string"
A `\n`-separated list of syscalls to deny.
This list must be mutually exclusive with `security.syscalls.allow`.:condition: "container"
:defaultdesc: "`false`"
:liveupdate: "no"
:shortdesc: "Whether to block `compat_*` syscalls (`x86_64` only)"
:type: "bool"
On `x86_64`, this option controls whether to block `compat_*` syscalls.
On other architectures, the option is ignored.:condition: "container"
:defaultdesc: "`true`"
:liveupdate: "no"
:shortdesc: "Whether to enable the default syscall deny"
:type: "bool":condition: "container"
:defaultdesc: "`false`"
:liveupdate: "no"
:shortdesc: "Whether to handle the `bpf()` system call"
:type: "bool":condition: "container"
:defaultdesc: "`false`"
:liveupdate: "no"
:shortdesc: "Whether to allow BPF programs"
:type: "bool"
This option controls whether to allow BPF programs for the devices cgroup in the unified hierarchy to be loaded.:condition: "container"
:defaultdesc: "`false`"
:liveupdate: "no"
:shortdesc: "Whether to handle the `mknod` and `mknodat` system calls"
:type: "bool"
These system calls allow creation of a limited subset of char/block devices.:condition: "container"
:defaultdesc: "`false`"
:liveupdate: "no"
:shortdesc: "Whether to handle the `mount` system call"
:type: "bool":condition: "container"
:liveupdate: "yes"
:shortdesc: "File systems that can be mounted"
:type: "string"
Specify a comma-separated list of file systems that are safe to mount for processes inside the instance.:condition: "container"
:liveupdate: "yes"
:shortdesc: "File system that should be redirected to FUSE implementation"
:type: "string"
Specify the mounts of a given file system that should be redirected to their FUSE implementation (for example, `ext4=fuse2fs`).:condition: "container"
:defaultdesc: "`false`"
:liveupdate: "yes"
:shortdesc: "Whether to use idmapped mounts for syscall interception"
:type: "bool":condition: "container"
:defaultdesc: "`false`"
:liveupdate: "no"
:shortdesc: "Whether to handle the `sched_setscheduler` system call"
:type: "bool"
This system call allows increasing process priority.:condition: "container"
:defaultdesc: "`false`"
:liveupdate: "no"
:shortdesc: "Whether to handle the `setxattr` system call"
:type: "bool"
This system call allows setting a limited subset of restricted extended attributes.:condition: "container"
:defaultdesc: "`false`"
:liveupdate: "no"
:shortdesc: "Whether to handle the `sysinfo` system call"
:type: "bool"
This system call can be used to get cgroup-based resource usage information.:liveupdate: "yes"
:shortdesc: "Comma-separated list of security tags for the authorization backend"
:type: "string"
Tags are made of lowercase letters, digits, dots, dashes and underscores and are at most 64 characters long.
They are exposed to the authorization backend but don't affect Incus' own authorization decisions.:liveupdate: "no"
:shortdesc: "When newly created snapshots are to be deleted"
:type: "string"
Specify an expression like `1M 2H 3d 4w 5m 6y`.
This value is used to compute the expiry date of newly created snapshots.
It is added to the current time when a snapshot is taken, and the resulting timestamp is stored as that snapshot's individual expiry date.
Changing this value only affects snapshots created after the change; the expiry date of existing snapshots is not modified.
The supported units are `S` (seconds), `M` (minutes), `H` (hours), `d` (days), `w` (weeks), `m` (months) and `y` (years).:liveupdate: "no"
:shortdesc: "When newly created snapshots are to be deleted (for those not created through scheduling)"
:type: "string"
Specify an expression like `1M 2H 3d 4w 5m 6y`.
This value is used to compute the expiry date of newly created snapshots that are not created through scheduling.
It is added to the current time when a snapshot is taken, and the resulting timestamp is stored as that snapshot's individual expiry date.
Changing this value only affects snapshots created after the change; the expiry date of existing snapshots is not modified.
See {config:option}`instance-snapshots:snapshots.expiry` for the supported units.:defaultdesc: "`snap%d`"
:liveupdate: "no"
:shortdesc: "Template for the snapshot name"
:type: "string"
Specify a Pongo2 template string that represents the snapshot name.
This template is used for scheduled snapshots and for unnamed snapshots.
See {ref}`instance-options-snapshots-names` for more information.:defaultdesc: "empty"
:liveupdate: "no"
:shortdesc: "Schedule for automatic instance snapshots"
:type: "string"
Specify either a cron expression (`<minute> <hour> <dom> <month> <dow>`), a comma-and-space-separated list of schedule aliases (`@startup`, `@hourly`, `@daily`, `@midnight`, `@weekly`, `@monthly`, `@annually`, `@yearly`), or leave empty to disable automatic snapshots.
Note that unlike most other configuration keys, this one must be comma-and-space-separated and not just comma-separated as cron expression can themselves contain commas.:defaultdesc: "`false`"
:liveupdate: "no"
:shortdesc: "Whether to automatically snapshot stopped instances"
:type: "bool":shortdesc: "Disk quota"
:type: "string"
The disk quota is applied the next time the instance starts.:shortdesc: "RBD device path for Ceph disk devices"
:type: "string":shortdesc: "Network device name on the host"
:type: "string":shortdesc: "Network device MAC address"
:type: "string"
The network device MAC address is used when no `hwaddr` property is set on the device itself.:shortdesc: "IO bus in use"
:type: "string"
The IO bus stores the actual IO bus being used, checked in case `io.bus=auto`.:shortdesc: "Whether the network device physical device was created"
:type: "string"
Possible values are `true` or `false`.:shortdesc: "Network device original MAC"
:type: "string"
The original MAC that was used when moving a physical device into an instance.:shortdesc: "Last used IP addresses"
:type: "string"
Comma-separated list of the last used IP addresses of the network device.:shortdesc: "Network device original MTU"
:type: "string"
The original MTU that was used when moving a physical device into an instance.:shortdesc: "PCI original host driver"
:type: "string"
The original host driver for the PCI device.:shortdesc: "PCI parent host device"
:type: "string"
The parent host device used when allocating a PCI device to an instance.:shortdesc: "PCI parent slot name"
:type: "string"
The parent host device PCI slot name.:shortdesc: "USB bus address"
:type: "string"
The original USB bus address.:shortdesc: "USB device identifier"
:type: "string"
The original USB device identifier.:shortdesc: "VDPA device name"
:type: "string"
The VDPA device name used when moving a VDPA device file descriptor into an instance.:shortdesc: "SR-IOV virtual function original MAC"
:type: "string"
The original MAC used when moving a VF into an instance.:shortdesc: "SR-IOV virtual function ID"
:type: "string"
The ID used when moving a VF into an instance.:shortdesc: "SR-IOV parent host device"
:type: "string"
The parent host device used when allocating a VF into an instance.:shortdesc: "SR-IOV virtual function original spoof check setting"
:type: "string"
The original spoof check setting used when moving a VF into an instance.:shortdesc: "SR-IOV virtual function original trusted setting"
:type: "string"
The original trusted setting used when moving a VF into an instance.:shortdesc: "SR-IOV virtual function original VLAN"
:type: "string"
The original VLAN used when moving a VF into an instance.:shortdesc: "MIG instance UUID"
:type: "string"
The NVIDIA MIG instance UUID.:shortdesc: "Network interface name inside of the instance"
:type: "string"
The network interface name inside of the instance when no `name` property is set on the device itself.:shortdesc: "virtual GPU instance UUID"
:type: "string"
The NVIDIA virtual GPU instance UUID.:shortdesc: "Whether to regenerate VM NVRAM the next time the instance starts"
:type: "bool":shortdesc: "Template hook"
:type: "string"
The template with the given name is triggered upon next startup.:shortdesc: "Hash of the base image"
:type: "string"
The hash of the image that the instance was created from (empty if the instance was not created from an image).:shortdesc: "`instance-id` (UUID) exposed to `cloud-init`"
:type: "string":shortdesc: "The original cluster group for the instance"
:type: "string"
The cluster group(s) that the instance was restricted to at creation time.
This is used during re-scheduling events like an evacuation to keep the instance within the requested set.:defaultdesc: "`false`"
:shortdesc: "Whether the container is an OCI application container"
:type: "bool":shortdesc: "Instance NUMA node"
:type: "string"
The NUMA node that was selected for the instance.:shortdesc: "The origin of the evacuated instance"
:type: "string"
The cluster member that the instance lived on before evacuation.:shortdesc: "The first ID in the instance's primary idmap range"
:type: "integer":shortdesc: "The idmap currently in use by the instance"
:type: "string":shortdesc: "The idmap to use the next time the instance starts"
:type: "string":shortdesc: "Last recorded instance agent state"
:type: "string":shortdesc: "Whether the agent has been seen at least once since last boot"
:type: "bool":shortdesc: "Serialized instance UID/GID map"
:type: "string":shortdesc: "Instance state as of last host shutdown"
:type: "string":shortdesc: "Instance marked itself as ready"
:type: "string":shortdesc: "Timestamp of last move by automatic live-migration"
:type: "integer":shortdesc: "Instance UUID"
:type: "string"
The instance UUID is globally unique across all servers and projects.:shortdesc: "Instance generation UUID"
:type: "string"
The instance generation UUID changes whenever the instance's place in time moves backwards.
It is globally unique across all servers and projects.:shortdesc: "JSON encoded VM properties used during live migration and other state restoration."
:type: "string":shortdesc: "Indicates that the VM needs a full reset on next reboot"
:type: "bool":shortdesc: "Real Time Clock change adjustment"
:type: "int64"
Real Time Clock adjustment time to allow virtual machines to run on a different base than the host.:shortdesc: "Real Time Clock change offset"
:type: "int64"
Real Time Clock offset to allow virtual machines to run on a different base than the host.:shortdesc: "Instance `vsock ID` used as of last start"
:type: "string":resource: "`RLIMIT_AS`"
:shortdesc: "Maximum size of the process's virtual memory"
:type: "string":resource: "`RLIMIT_CORE`"
:shortdesc: "Maximum size of the process's core dump file"
:type: "string":resource: "`RLIMIT_CPU`"
:shortdesc: "Limit in seconds on the amount of CPU time the process can consume"
:type: "string":resource: "`RLIMIT_DATA`"
:shortdesc: "Maximum size of the process's data segment"
:type: "string":resource: "`RLIMIT_FSIZE`"
:shortdesc: "Maximum size of files the process may create"
:type: "string":resource: "`RLIMIT_LOCKS`"
:shortdesc: "Limit on the number of file locks that this process may establish"
:type: "string":resource: "`RLIMIT_MEMLOCK`"
:shortdesc: "Limit on the number of bytes of memory that the process may lock in RAM"
:type: "string":resource: "`RLIMIT_NICE`"
:shortdesc: "Maximum value to which the process's nice value can be raised"
:type: "string":resource: "`RLIMIT_NOFILE`"
:shortdesc: "Maximum number of open files for the process"
:type: "string":resource: "`RLIMIT_NPROC`"
:shortdesc: "Maximum number of processes that can be created for the user of the calling process"
:type: "string":resource: "`RLIMIT_RTPRIO`"
:shortdesc: "Maximum value on the real-time-priority that may be set for this process"
:type: "string":resource: "`RLIMIT_SIGPENDING`"
:shortdesc: "Limit on the number of bytes of memory that the process may lock in RAM"
:type: "string":shortdesc: "Free form user key/value storage"
:type: "string"
User keys can be used in search.:condition: "BGP server"
:defaultdesc: "-"
:shortdesc: "Peer address (IPv4 or IPv6) for use by `ovn` downstream networks"
:type: "string":condition: "BGP server"
:defaultdesc: "-"
:shortdesc: "Peer AS number for use by `ovn` downstream networks"
:type: "integer":condition: "BGP server"
:defaultdesc: "`180`"
:shortdesc: "Peer session hold time (in seconds; optional)"
:type: "integer":condition: "BGP server"
:defaultdesc: "-"
:shortdesc: "Interface name for BGP unnumbered peering (alternative to the peer address)"
:type: "string":condition: "BGP server"
:defaultdesc: "- (no password)"
:shortdesc: "Peer session password (optional) for use by `ovn` downstream networks"
:type: "string":condition: "BGP server"
:default: "-"
:scope: "global"
:shortdesc: "Comma-separated BGP communities to attach to advertised prefixes"
:type: "string":condition: "BGP server"
:default: "`false`"
:shortdesc: "Whether to advertise a /32 route for the IPv4 address of each running instance"
:type: "bool":condition: "BGP server"
:default: "local address"
:scope: "local"
:shortdesc: "Override the next-hop for advertised prefixes"
:type: "string":condition: "BGP server"
:default: "`false`"
:shortdesc: "Whether to advertise a /128 route for the IPv6 address of each running instance"
:type: "bool":condition: "BGP server"
:default: "local address"
:scope: "local"
:shortdesc: "Override the next-hop for advertised prefixes"
:type: "string":condition: "-"
:default: "`native`"
:shortdesc: "Bridge driver: `native` or `openvswitch`"
:type: "string":condition: "-"
:default: "-"
:shortdesc: "Comma-separated list of unconfigured network interfaces to include in the bridge"
:type: "string":condition: "-"
:default: "-"
:shortdesc: "MAC address for the bridge"
:type: "string":condition: "-"
:default: "`1500`"
:shortdesc: "Bridge MTU (default varies if tunnel in use)"
:type: "integer":condition: "native bridge"
:default: "`true`"
:shortdesc: "Whether to enable multicast snooping on the bridge"
:type: "bool":condition: "-"
:default: "`incus`"
:shortdesc: "Domain to advertise to DHCP clients and use for DNS resolution"
:type: "string":condition: "-"
:default: "`true`"
:shortdesc: "Whether to serve records from the host's `/etc/hosts` file"
:type: "bool":condition: "-"
:default: "`managed`"
:shortdesc: "DNS registration mode: none for no DNS record, managed for Incus-generated static records or dynamic for client-generated records"
:type: "string":condition: "-"
:default: "IPv4 and IPv6 address"
:shortdesc: "DNS server IPs to advertise to DHCP clients and via Router Advertisements. Both IPv4 and IPv6 addresses get pushed via DHCP, and IPv6 addresses are also advertised as RDNSS via RA."
:type: "string":condition: "-"
:default: "-"
:shortdesc: "Full comma-separated domain search list, defaulting to `dns.domain` value"
:type: "string":condition: "-"
:default: "`managed`"
:shortdesc: "Comma-separated list of DNS zone names for forward DNS records"
:type: "string":condition: "-"
:default: "`managed`"
:shortdesc: "DNS zone name for IPv4 reverse DNS records"
:type: "string":condition: "-"
:default: "`managed`"
:shortdesc: "DNS zone name for IPv6 reverse DNS records"
:type: "string":condition: "standard mode"
:default: "- (initial value on creation: `auto`)"
:shortdesc: "IPv4 address for the bridge (use `none` to turn off IPv4 or `auto` to generate a new random unused subnet) (CIDR)"
:type: "string":condition: "IPv4 address"
:default: "`true`"
:shortdesc: "Whether to allocate addresses using DHCP"
:type: "bool":condition: "IPv4 DHCP"
:default: "`1h`"
:shortdesc: "When to expire DHCP leases"
:type: "string":condition: "IPv4 DHCP"
:default: "IPv4 address"
:shortdesc: "Address of the gateway for the subnet (use `none` to turn off gateway announcement)"
:type: "string":condition: "IPv4 DHCP"
:default: "all addresses"
:shortdesc: "Comma-separated list of IP ranges to use for DHCP (FIRST-LAST format)"
:type: "string":condition: "IPv4 DHCP"
:default: "-"
:shortdesc: "Static routes to provide via DHCP option 121, as a comma-separated list of alternating subnets (CIDR) and gateway addresses (same syntax as dnsmasq)"
:type: "string":condition: "IPv4 address"
:default: "`true`"
:shortdesc: "Whether to generate filtering firewall rules for this network"
:type: "bool":condition: "IPv4 address"
:default: "`false`(initial value on creation if `ipv4.address` is set to `auto`: `true`)"
:shortdesc: "Whether to NAT"
:type: "bool":condition: "IPv4 address"
:default: "-"
:shortdesc: "The source address used for outbound traffic from the bridge"
:type: "string":condition: "IPv4 address"
:default: "`before`"
:shortdesc: "Whether to add the required NAT rules before or after any pre-existing rules (no effect with the `nftables` firewall driver)"
:type: "string":condition: "-"
:default: "-"
:shortdesc: "Comma-separated list of IPv4 ranges to use for child OVN network routers (FIRST-LAST format)"
:type: "string":condition: "IPv4 address"
:default: "-"
:shortdesc: "Comma-separated list of additional IPv4 CIDR subnets to route to the bridge"
:type: "string":condition: "IPv4 DHCP"
:default: "`true`"
:shortdesc: "Whether to route traffic in and out of the bridge"
:type: "bool":condition: "standard mode"
:default: "- (initial value on creation: `auto`)"
:shortdesc: "IPv6 address for the bridge (use `none` to turn off IPv6 or `auto` to generate a new random unused subnet) (CIDR)"
:type: "string":condition: "IPv6 DHCP"
:default: "`true`"
:shortdesc: "Whether to provide additional network configuration over DHCP"
:type: "bool":condition: "IPv6 DHCP"
:default: "`1h`"
:shortdesc: "When to expire DHCP leases"
:type: "string":condition: "IPv6 stateful DHCP"
:default: "all addresses"
:shortdesc: "Comma-separated list of IPv6 ranges to use for DHCP (FIRST-LAST format)"
:type: "string":condition: "IPv6 DHCP"
:default: "`false`"
:shortdesc: "Whether to allocate addresses using DHCP"
:type: "bool":condition: "IPv6 address"
:default: "`true`"
:shortdesc: "Whether to generate filtering firewall rules for this network"
:type: "bool":condition: "IPv6 address"
:default: "`false` (initial value on creation if `ipv6.address` is set to `auto`: `true`)"
:shortdesc: "Whether to NAT"
:type: "bool":condition: "IPv6 address"
:default: "-"
:shortdesc: "The source address used for outbound traffic from the bridge"
:type: "string":condition: "IPv6 address"
:default: "`before`"
:shortdesc: "Whether to add the required NAT rules before or after any pre-existing rules (no effect with the `nftables` firewall driver)"
:type: "string":condition: "-"
:default: "-"
:shortdesc: "Comma-separated list of IPv6 ranges to use for child OVN network routers (FIRST-LAST format)"
:type: "string":condition: "IPv6 address"
:default: "`true`"
:shortdesc: "Whether to send IPv6 router advertisements"
:type: "bool":condition: "IPv6 address"
:default: "-"
:shortdesc: "Comma-separated list of additional IPv6 CIDR subnets to route to the bridge"
:type: "string":condition: "IPv6 address"
:default: "`true`"
:shortdesc: "Whether to route traffic in and out of the bridge"
:type: "bool":condition: "-"
:default: "-"
:shortdesc: "Additional dnsmasq configuration to append to the configuration file"
:type: "string":condition: "-"
:default: "-"
:shortdesc: "Comma-separated list of Network ACLs to apply to NICs connected to this network (see {ref}`network-acls-bridge-limitations`)"
:type: "string":condition: "`security.acls`"
:default: "`reject`"
:shortdesc: "Action to use for egress traffic that doesn't match any ACL rule"
:type: "string":condition: "`security.acls`"
:default: "`false`"
:shortdesc: "Whether to log egress traffic that doesn't match any ACL rule"
:type: "bool":condition: "`security.acls`"
:default: "`reject`"
:shortdesc: "Action to use for ingress traffic that doesn't match any ACL rule"
:type: "string":condition: "`security.acls`"
:default: "`false`"
:shortdesc: "Whether to log ingress traffic that doesn't match any ACL rule"
:type: "bool":condition: "`vxlan`"
:default: "`239.0.0.1`"
:shortdesc: "Multicast address for `vxlan` (used if local and remote aren't set)"
:type: "string":condition: "`vxlan`"
:default: "`0`"
:shortdesc: "Specific tunnel ID to use for the `vxlan` tunnel"
:type: "integer":condition: "`vxlan`"
:default: "-"
:shortdesc: "Specific host interface to use for the tunnel"
:type: "string":condition: "`gre` or `vxlan`"
:default: "-"
:shortdesc: "Local address for the tunnel (not necessary for multicast `vxlan`)"
:type: "string":condition: "`vxlan`"
:default: "`0`"
:shortdesc: "Specific port to use for the `vxlan` tunnel"
:type: "integer":condition: "standard mode"
:default: "-"
:shortdesc: "Tunneling protocol: `vxlan` or `gre`"
:type: "string":condition: "`gre` or `vxlan`"
:default: "-"
:shortdesc: "Remote address for the tunnel (not necessary for multicast `vxlan`)"
:type: "string":condition: "`vxlan`"
:default: "`1`"
:shortdesc: "Specific TTL to use for multicast routing topologies"
:type: "integer":condition: "-"
:default: "-"
:shortdesc: "User-provided free-form key/value pairs"
:type: "string":shortdesc: "Default target address for anything not covered through a port definition"
:type: "string":shortdesc: "User defined key/value configuration"
:type: "string":shortdesc: "Free form user key/value storage"
:type: "string"
User keys can be used in search.:scope: "global"
:shortdesc: "OVN SSL certificate authorities for the inter-connection database (PEM bundle)"
:type: "string":scope: "global"
:shortdesc: "OVN SSL client certificate (PEM bundle)"
:type: "string":scope: "global"
:shortdesc: "OVN SSL client key (PEM private key)"
:type: "string":scope: "global"
:shortdesc: "OVN northbound inter-connection connection string"
:type: "string":scope: "global"
:shortdesc: "OVN southbound inter-connection connection string"
:type: "string":defaultdesc: "`ts-incus-{{ integrationName }}-{{ projectName }}-{{ networkName }}`"
:shortdesc: "Template for the transit switch name"
:type: "string"
Specify a Pongo2 template string that represents the transit switch name.
This template gets access to the project name (`projectName`),
integration name (`integrationName`), network name (`networkName`)
and peer name (`peerName`).:defaultdesc: "`false`"
:shortdesc: "Whether to perform checks on the backends"
:type: "bool":defaultdesc: "`3`"
:shortdesc: "Number of failed tests to consider the backend offline"
:type: "integer":defaultdesc: "`10`"
:shortdesc: "Interval in seconds between health checks"
:type: "integer":defaultdesc: "`3`"
:shortdesc: "Number of successful tests to consider the backend online"
:type: "integer":defaultdesc: "`30`"
:shortdesc: "Test timeout"
:type: "integer":shortdesc: "Free form user key/value storage"
:type: "string"
User keys can be used in search.:condition: "-"
:default: "`false`"
:shortdesc: "Register VLAN using GARP VLAN Registration Protocol"
:type: "bool":condition: "-"
:shortdesc: "The MTU of the new interface"
:type: "int":condition: "-"
:scope: "local"
:shortdesc: "Parent interface to create macvlan NICs on"
:type: "string":shortdesc: "User-provided free-form key/value pairs"
:type: "string":condition: "-"
:shortdesc: "The VLAN ID to attach to"
:type: "int":condition: "BGP server"
:default: "-"
:shortdesc: "Comma-separated BGP communities to attach to advertised prefixes"
:type: "string":scope: "local"
:shortdesc: "Comma-separated list of unconfigured network interfaces to include in the bridge"
:type: "string":shortdesc: "MAC address for the virtual bridge interface"
:type: "string":default: "`1442`"
:shortdesc: "Bridge MTU (default allows host to host Geneve tunnels)"
:type: "integer":default: "`false`"
:shortdesc: "Whether to relay multicast traffic through the network's logical router"
:type: "bool":default: "`true`"
:shortdesc: "Whether to enable multicast snooping on the virtual network"
:type: "bool":default: "`incus`"
:shortdesc: "Domain to advertise to DHCP clients and use for DNS resolution"
:type: "string":condition: "-"
:default: "`managed`"
:shortdesc: "DNS registration mode: none for no DNS record, managed for OVN managed records"
:type: "string":default: "Uplink DNS servers (IPv4 and IPv6 address if no uplink is configured)"
:shortdesc: "DNS server IPs to advertise to DHCP clients and via Router Advertisements. Both IPv4 and IPv6 addresses get pushed via DHCP, and the first IPv6 address is also advertised as RDNSS via RA."
:type: "string":shortdesc: "Full comma-separated domain search list, defaulting to `dns.domain` value"
:type: "string":shortdesc: "Comma-separated list of DNS zone names for forward DNS records"
:type: "string":shortdesc: "DNS zone name for IPv4 reverse DNS records"
:type: "string":shortdesc: "DNS zone name for IPv6 reverse DNS records"
:type: "string":condition: "standard mode"
:default: "(initial value on creation: `auto`)"
:shortdesc: "IPv4 address for the bridge (use `none` to turn off IPv4 or `auto` to generate a new random unused subnet) (CIDR)"
:type: "string":condition: "IPv4 address"
:default: "`true`"
:shortdesc: "Whether to allocate addresses using DHCP"
:type: "bool":condition: "IPv4 DHCP"
:default: "`1h`"
:shortdesc: "When to expire DHCP leases"
:type: "string":condition: "IPv4 DHCP"
:default: "IPv4 address"
:shortdesc: "Address of the gateway for the subnet (use `none` to turn off gateway announcement)"
:type: "string":condition: "IPv4 DHCP"
:default: "all addresses"
:shortdesc: "Comma-separated list of IP ranges to use for DHCP (FIRST-LAST format)"
:type: "string":condition: "IPv4 DHCP"
:shortdesc: "Static routes to provide via DHCP option 121, as a comma-separated list of alternating subnets (CIDR) and gateway addresses (same syntax as dnsmasq and OVN)"
:type: "string":condition: "IPv4 address"
:default: "`false`"
:shortdesc: "Whether to enable layer 3 only mode."
:type: "bool":condition: "IPv4 address"
:default: "`false` initial value on creation if `ipv4.address` is set to `auto: true`)"
:shortdesc: "Whether to NAT"
:type: "bool":condition: "IPv4 address"
:shortdesc: "The source address used for outbound traffic from the network"
:type: "string":condition: "standard mode"
:default: "(initial value on creation: `auto`)"
:shortdesc: "IPv6 address for the bridge (use `none` to turn off IPv6 or `auto` to generate a new random unused subnet) (CIDR)"
:type: "string":condition: "IPv6 address"
:default: "`true`"
:shortdesc: "Whether to provide additional network configuration over DHCP"
:type: "bool":condition: "IPv6 DHCP"
:default: "`false`"
:shortdesc: "Whether to allocate addresses using DHCP"
:type: "bool":condition: "IPv6 DHCP stateful"
:default: "`false`"
:shortdesc: "Whether to enable layer 3 only mode."
:type: "bool":condition: "IPv6 address"
:default: "`false` (initial value on creation if `ipv6.address` is set to `auto: true`)"
:shortdesc: "Whether to NAT"
:type: "bool":condition: "IPv6 address"
:shortdesc: "The source address used for outbound traffic from the network"
:type: "string":condition: "IPv6 address"
:default: "`true`"
:shortdesc: "Whether to send IPv6 router advertisements"
:type: "bool":shortdesc: "Uplink network to use for external network access or `none` to keep isolated"
:type: "string":shortdesc: "Parent OVN network whose logical router and uplink to share"
:type: "string":shortdesc: "Comma-separated list of Network ACLs to apply to NICs connected to this network"
:type: "string":condition: "`security.acls`"
:default: "`reject`"
:shortdesc: "Action to use for egress traffic that doesn't match any ACL rule"
:type: "string":condition: "`security.acls`"
:default: "`false`"
:shortdesc: "Whether to log egress traffic that doesn't match any ACL rule"
:type: "bool":condition: "`security.acls`"
:default: "`reject`"
:shortdesc: "Action to use for ingress traffic that doesn't match any ACL rule"
:type: "string":condition: "`security.acls`"
:default: "`false`"
:shortdesc: "Whether to log ingress traffic that doesn't match any ACL rule"
:type: "bool":condition: "`vxlan`"
:default: "`239.0.0.1`"
:shortdesc: "Multicast address for `vxlan`"
:type: "string":condition: "`vxlan`"
:default: "`0`"
:shortdesc: "Specific tunnel ID to use for the `vxlan` tunnel"
:type: "integer":condition: "`vxlan`"
:default: "-"
:shortdesc: "Specific host interface to use for the tunnel"
:type: "string":condition: "`gre`"
:default: "-"
:shortdesc: "Local address for the tunnel"
:type: "string":condition: "`vxlan`"
:default: "`0`"
:shortdesc: "Specific port to use for the `vxlan` tunnel"
:type: "integer":condition: "standard mode"
:default: "-"
:shortdesc: "Tunneling protocol: `vxlan` or `gre`"
:type: "string":condition: "`gre`"
:default: "-"
:shortdesc: "Remote address for the tunnel"
:type: "string":condition: "`vxlan`"
:default: "`1`"
:shortdesc: "Specific TTL to use for multicast routing topologies"
:type: "integer":shortdesc: "User-provided free-form key/value pairs"
:type: "string":condition: "BGP server"
:defaultdesc: "-"
:shortdesc: "Peer address (IPv4 or IPv6) for use by `ovn` downstream networks"
:type: "string":condition: "BGP server"
:defaultdesc: "-"
:shortdesc: "Peer AS number for use by `ovn` downstream networks"
:type: "integer":condition: "BGP server"
:defaultdesc: "`180`"
:shortdesc: "Peer session hold time (in seconds; optional)"
:type: "integer":condition: "BGP server"
:defaultdesc: "-"
:shortdesc: "Interface name for BGP unnumbered peering (alternative to the peer address)"
:type: "string":condition: "BGP server"
:defaultdesc: "- (no password)"
:shortdesc: "Peer session password (optional) for use by `ovn` downstream networks"
:type: "string":condition: "-"
:defaultdesc: "'false'"
:shortdesc: "Register VLAN using GARP VLAN Registration Protocol"
:type: "bool":condition: "-"
:shortdesc: "The MTU of the new interface"
:type: "integer":condition: "-"
:scope: "local"
:shortdesc: "Existing interface to use for network"
:type: "string":condition: "-"
:shortdesc: "The VLAN ID to attach to"
:type: "integer":condition: "Parent must be an existing bridge"
:shortdesc: "Comma-delimited list of VLAN IDs or VLAN ranges to join for tagged traffic"
:type: "integer":condition: "standard mode"
:shortdesc: "List of DNS server IPs on `physical` network"
:type: "string":condition: "standard mode"
:shortdesc: "IPv4 address for the gateway and network (CIDR)"
:type: "string":shortdesc: "MAC address of the gateway (to avoid discovery)"
:type: "string":condition: "-"
:shortdesc: "Comma-separated list of IPv4 ranges to use for child OVN network routers (FIRST-LAST format)"
:type: "string":condition: "IPv4 address"
:shortdesc: "Comma-separated list of additional IPv4 CIDR subnets that can be used with child OVN networks `ipv4.routes.external` setting"
:type: "string":condition: "IPv4 address"
:defaultdesc: "'false'"
:shortdesc: "Allow the overlapping routes to be used on multiple networks/NIC at the same time"
:type: "bool":condition: "standard mode"
:shortdesc: "IPv6 address for the gateway and network (CIDR)"
:type: "string":shortdesc: "MAC address of the gateway (to avoid discovery)"
:type: "string":condition: "-"
:shortdesc: "Comma-separated list of IPv6 ranges to use for child OVN network routers (FIRST-LAST format)"
:type: "string":condition: "IPv6 address"
:shortdesc: "Comma-separated list of additional IPv6 CIDR subnets that can be used with child OVN networks `ipv6.routes.external` setting"
:type: "string":condition: "IPv6 address"
:defaultdesc: "'false'"
:shortdesc: "Allow the overlapping routes to be used on multiple networks/NIC at the same time"
:type: "bool":condition: "standard mode"
:defaultdesc: "`l2proxy`"
:shortdesc: "Sets the method how OVN NIC external IPs will be advertised on uplink network: `l2proxy` (proxy ARP/NDP) or `routed`"
:type: "string":condition: "-"
:shortdesc: "The MTU of the new interface"
:type: "integer":condition: "-"
:scope: "local"
:shortdesc: "Parent interface to create `sriov` NICs on"
:type: "string":condition: "-"
:shortdesc: "User-provided free-form key/value pairs"
:type: "string":condition: "-"
:shortdesc: "The VLAN ID to attach to"
:type: "integer":required: "no"
:shortdesc: "Admin contact email for DNS server"
:type: "string":required: "no"
:shortdesc: "Comma-separated list of DNS server FQDNs (for NS records)"
:type: "string set":defaultdesc: "`true`"
:required: "no"
:shortdesc: "Whether to generate records for NAT-ed subnets"
:type: "bool":required: "no"
:shortdesc: "IP address of a DNS server"
:type: "string":required: "no"
:shortdesc: "TSIG key for the server"
:type: "string":required: "no"
:shortdesc: "User-provided free-form key/value pairs"
:type: "string":defaultdesc: "`false`"
:initialvaluedesc: "`true`"
:shortdesc: "Whether to use a separate set of images for the project"
:type: "bool"
This setting applies to both images and image aliases.:defaultdesc: "`false`"
:initialvaluedesc: "`false`"
:shortdesc: "Whether to use a separate set of networks for the project"
:type: "bool"
This feature requires the server to be configured for OVN.:defaultdesc: "`false`"
:initialvaluedesc: "`false`"
:shortdesc: "Whether to use a separate set of network zones for the project"
:type: "bool":defaultdesc: "`false`"
:initialvaluedesc: "`true`"
:shortdesc: "Whether to use a separate set of profiles for the project"
:type: "bool":defaultdesc: "`false`"
:initialvaluedesc: "`true`"
:shortdesc: "Whether to use a separate set of storage buckets for the project"
:type: "bool":defaultdesc: "`false`"
:initialvaluedesc: "`true`"
:shortdesc: "Whether to use a separate set of storage volumes for the project"
:type: "bool":shortdesc: "Maximum number of containers that can be created in the project"
:type: "integer":shortdesc: "Maximum number of CPUs to use in the project"
:type: "integer"
This value is the maximum value for the sum of the individual {config:option}`instance-resource-limits:limits.cpu` configurations set on the instances of the project.:shortdesc: "Maximum disk space used by the project"
:type: "string"
This value is the maximum value of the aggregate disk space used by all instance volumes, custom volumes, and images of the project.:shortdesc: "Maximum disk space used by the project on this pool"
:type: "string"
This value is the maximum value of the aggregate disk
space used by all instance volumes, custom volumes, and images of the
project on this specific storage pool.:shortdesc: "Maximum number of instances that can be created in the project"
:type: "integer":shortdesc: "Usage limit for the host's memory for the project"
:type: "string"
The value is the maximum value for the sum of the individual {config:option}`instance-resource-limits:limits.memory` configurations set on the instances of the project.:shortdesc: "Maximum number of networks that the project can have"
:type: "integer":shortdesc: "Maximum number of processes within the project"
:type: "integer"
This value is the maximum value for the sum of the individual {config:option}`instance-resource-limits:limits.processes` configurations set on the instances of the project.:shortdesc: "Maximum number of VMs that can be created in the project"
:type: "integer":defaultdesc: "`false`"
:shortdesc: "Whether to block access to security-sensitive features"
:type: "bool"
This option must be enabled to allow the `restricted.*` keys to take effect.
To temporarily remove the restrictions, you can disable this option instead of clearing the related keys.:defaultdesc: "`block`"
:shortdesc: "Whether to prevent creating instance or volume backups"
:type: "string"
Possible values are `allow` or `block`.:shortdesc: "Cluster groups that can be targeted"
:type: "string"
If specified, this option prevents targeting cluster groups other than the provided ones.:defaultdesc: "`block`"
:shortdesc: "Whether to prevent targeting of cluster members"
:type: "string"
Possible values are `allow` or `block`.
When set to `allow`, this option allows targeting of cluster members (either directly or via a group) when creating or moving instances.:defaultdesc: "`block`"
:shortdesc: "Whether to prevent using system call interception options"
:type: "string"
Possible values are `allow`, `block`, or `full`.
When set to `allow`, interception options that are usually safe are allowed.
File system mounting remains blocked.:defaultdesc: "`block`"
:shortdesc: "Whether to prevent using low-level container options"
:type: "string"
Possible values are `allow` or `block`.
When set to `allow`, low-level container options like {config:option}`instance-raw:raw.lxc`, {config:option}`instance-raw:raw.idmap`, `volatile.*`, etc. can be used.:defaultdesc: "`block`"
:shortdesc: "Whether to prevent running nested Incus"
:type: "string"
Possible values are `allow` or `block`.
When set to `allow`, {config:option}`instance-security:security.nesting` can be set to `true` for an instance.:defaultdesc: "`unprivileged`"
:shortdesc: "Which settings for privileged containers to prevent"
:type: "string"
Possible values are `unprivileged`, `isolated`, and `allow`.
- When set to `unprivileged`, this option prevents setting {config:option}`instance-security:security.privileged` to `true`.
- When set to `isolated`, this option prevents setting {config:option}`instance-security:security.privileged` to `true` and {config:option}`instance-security:security.idmap.isolated` to `false`.
- When set to `allow`, there is no restriction.:defaultdesc: "`managed`"
:shortdesc: "Which disk devices can be used"
:type: "string"
Possible values are `allow`, `block`, or `managed`.
- When set to `block`, this option prevents using all disk devices except the root one.
- When set to `managed`, this option allows using disk devices only if `pool=` is set.
- When set to `allow`, there is no restriction on which disk devices can be used.:shortdesc: "Which `source` can be used for `disk` devices"
:type: "string"
If {config:option}`project-restricted:restricted.devices.disk` is set to `allow`, this option controls which `source` can be used for `disk` devices.
Specify a comma-separated list of path prefixes that restrict the `source` setting.
If this option is left empty, all paths are allowed.:defaultdesc: "`block`"
:shortdesc: "Whether to prevent using devices of type `gpu`"
:type: "string"
Possible values are `allow` or `block`.:defaultdesc: "`block`"
:shortdesc: "Whether to prevent using devices of type `infiniband`"
:type: "string"
Possible values are `allow` or `block`.:defaultdesc: "`managed`"
:shortdesc: "Which network devices can be used"
:type: "string"
Possible values are `allow`, `block`, or `managed`.
- When set to `block`, this option prevents using all network devices.
- When set to `managed`, this option allows using network devices only if `network=` is set.
- When set to `allow`, there is no restriction on which network devices can be used.:defaultdesc: "`block`"
:shortdesc: "Whether to prevent using devices of type `pci`"
:type: "string"
Possible values are `allow` or `block`.:defaultdesc: "`block`"
:shortdesc: "Whether to prevent using devices of type `proxy`"
:type: "string"
Possible values are `allow` or `block`.:defaultdesc: "`block`"
:shortdesc: "Whether to prevent using devices of type `unix-block`"
:type: "string"
Possible values are `allow` or `block`.:defaultdesc: "`block`"
:shortdesc: "Whether to prevent using devices of type `unix-char`"
:type: "string"
Possible values are `allow` or `block`.:defaultdesc: "`block`"
:shortdesc: "Whether to prevent using devices of type `unix-hotplug`"
:type: "string"
Possible values are `allow` or `block`.:defaultdesc: "`block`"
:shortdesc: "Whether to prevent using devices of type `usb`"
:type: "string"
Possible values are `allow` or `block`.:shortdesc: "Which host GID ranges are allowed in `raw.idmap`"
:type: "string"
This option specifies the host GID ranges that are allowed in the instance's {config:option}`instance-raw:raw.idmap` setting.:shortdesc: "Which host UID ranges are allowed in `raw.idmap`"
:type: "string"
This option specifies the host UID ranges that are allowed in the instance's {config:option}`instance-raw:raw.idmap` setting.:shortdesc: "Which image servers (HTTP host) are allowed for us in this project"
:type: "string"
Specify a comma-delimited list of image servers domains that are allowed for use in this project.
If this option is not set, all image servers are accessible.:shortdesc: "Which network names are allowed for use in this project"
:type: "string"
Specify a comma-delimited list of network names that are allowed for use in this project.
If this option is not set, all networks are accessible.
In restricted projects with {config:option}`project-features:features.networks` enabled,
the listed networks from the default project are shared into the project and their names
can't be used for the project's own networks.
Note that this setting depends on the {config:option}`project-restricted:restricted.devices.nic` setting.:shortdesc: "Which network integrations can be used in this project"
:type: "string"
Specify a comma-delimited list of network integrations that can be used by networks in this project.:defaultdesc: "`block`"
:shortdesc: "Which network subnets are allocated for use in this project"
:type: "string"
Specify a comma-delimited list of network subnets from the uplink networks that are allocated for use in this project.
Use the form `<uplink>:<subnet>`.:shortdesc: "Which network names can be used as uplink in this project"
:type: "string"
Specify a comma-delimited list of network names that can be used as uplink for networks in this project.:defaultdesc: "`block`"
:shortdesc: "Which network zones can be used in this project"
:type: "string"
Specify a comma-delimited list of network zones that can be used (or something under them) in this project.:defaultdesc: "`block`"
:shortdesc: "Whether to prevent creating instance or volume snapshots"
:type: "string":shortdesc: "Which storage pool names are allowed for use in this project"
:type: "string"
Specify a comma-delimited list of storage pool names that are allowed for use in this project.
If this option is not set, all storage pools are accessible.:defaultdesc: "`block`"
:shortdesc: "Whether to prevent using low-level VM options"
:type: "string"
Possible values are `allow` or `block`.
When set to `allow`, low-level VM options like {config:option}`instance-raw:raw.qemu`, `volatile.*`, etc. can be used.:defaultdesc: "`allow`"
:shortdesc: "Whether to prevent using nested virtualization"
:type: "string"
Possible values are `allow` or `block`.
When set to `block`, {config:option}`instance-security:security.nesting` must be set to `false` on all virtual machines, turning off nested virtualization.:shortdesc: "Compression algorithm to use for backups"
:type: "string"
Specify which compression algorithm to use for backups in this project.
Possible values are `bzip2`, `gzip`, `lz4`, `lzma`, `xz`, `zstd` or `none`.:shortdesc: "Whether to automatically update cached images in the project"
:type: "bool":shortdesc: "Interval at which to look for updates to cached images"
:type: "integer"
Specify the interval in hours.
To disable looking for updates to cached images, set this option to `0`.:shortdesc: "Compression algorithm to use for new images in the project"
:type: "string"
Possible values are `bzip2`, `gzip`, `lz4`, `lzma`, `xz`, `zstd` or `none`.:shortdesc: "Default architecture to use in a mixed-architecture cluster"
:type: "string":shortdesc: "When an unused cached remote image is flushed in the project"
:type: "integer"
Specify the number of days after which the unused cached image expires.:scope: "global"
:shortdesc: "MAC address template"
:type: "string"
Specify a MAC address template, e.g. `10:66:6a:xx:xx:xx`, to use within the cluster.
Every `x` in the template will be replaced by a random character in `0`–`f`.
Beware of the birthday paradox! A single `xx` block leads to a 10% collision probability with only 8 addresses; for a double `xx:xx` block, 118 addresses; for a triple `xx:xx:xx` block, 1881; for a quadruple `xx:xx:xx:xx` block, 30084. We provide absolutely no guardrail against that.:shortdesc: "User-provided free-form key/value pairs"
:type: "string":defaultdesc: "`false`"
:scope: "global"
:shortdesc: "Agree to ACME terms of service"
:type: "bool":defaultdesc: "`https://acme-v02.api.letsencrypt.org/directory`"
:scope: "global"
:shortdesc: "URL to the directory resource of the ACME service"
:type: "string":defaultdesc: "`HTTP-01`"
:scope: "global"
:shortdesc: "ACME challenge type to use"
:type: "string"
Possible values are `DNS-01` and `HTTP-01`.:scope: "global"
:shortdesc: "Domain for which the certificate is issued"
:type: "string"
Comma separated list of domains, wildcard domains (`*.example.com`) require the `DNS-01` challenge.:scope: "global"
:shortdesc: "HMAC key for External Account Binding"
:type: "string":scope: "global"
:shortdesc: "Key identifier for External Account Binding"
:type: "string":scope: "global"
:shortdesc: "Email address used for the account registration"
:type: "string":defaultdesc: "`:80`"
:scope: "global"
:shortdesc: "Port and interface for HTTP server (used by HTTP-01)"
:type: "string"
Set the port and interface to use for HTTP-01 based challenges to listen on:defaultdesc: "``"
:scope: "global"
:shortdesc: "Backend provider for the challenge (used by DNS-01)"
:type: "string":defaultdesc: "``"
:scope: "global"
:shortdesc: "Environment variables to set during the challenge (used by DNS-01)"
:type: "string":defaultdesc: "``"
:scope: "global"
:shortdesc: "Comma-separated list of DNS resolvers (used by DNS-01)"
:type: "string"
DNS resolvers to use for performing (recursive) `CNAME` resolving and apex domain determination during DNS-01 challenge.:scope: "global"
:shortdesc: "Authorization driver for clients without a more specific class route"
:type: "string"
Routes clients that do not match a more specific class to an authorization driver.
Possible values are `allow`, `deny`, `openfga` and `scriptlet`.:scope: "global"
:shortdesc: "Authorization driver for OIDC-authenticated clients"
:type: "string"
Routes OIDC-authenticated clients to an authorization driver.
Possible values are `allow`, `deny`, `openfga` and `scriptlet`.:scope: "global"
:shortdesc: "Authorization driver for unrestricted TLS clients"
:type: "string"
Routes clients using an unrestricted client certificate to an authorization driver.
Possible values are `allow`, `deny`, `openfga` and `scriptlet`.:scope: "global"
:shortdesc: "Authorization driver for restricted TLS clients"
:type: "string"
Routes clients using a restricted (project-scoped) client certificate to an authorization driver.
Possible values are `allow`, `deny`, `tls`, `openfga` and `scriptlet`.:scope: "global"
:shortdesc: "Authorization driver for local (`unix` socket) clients"
:type: "string"
Routes local clients connecting over the `unix` socket to an authorization driver.
Possible values are `allow`, `deny`, `openfga` and `scriptlet`.:scope: "global"
:shortdesc: "API token of the OpenFGA server"
:type: "string":scope: "global"
:shortdesc: "URL of the OpenFGA server"
:type: "string":scope: "global"
:shortdesc: "ID of the OpenFGA permission store"
:type: "string":defaultdesc: "`name`"
:scope: "global"
:shortdesc: "Certificate attribute used as the OpenFGA user for TLS clients"
:type: "string"
When a TLS client is authorized by OpenFGA, this selects the certificate
attribute used as the OpenFGA user: `fingerprint` or `name`.:scope: "global"
:shortdesc: "Authorization scriptlet"
:type: "string"
When using scriptlet-based authorization, this option stores the scriptlet.:defaultdesc: "`0`"
:scope: "global"
:shortdesc: "Threshold when to evacuate an offline cluster member"
:type: "integer"
Specify the number of seconds after which an offline cluster member is to be evacuated.
To disable evacuating offline members, set this option to `0`.:scope: "local"
:shortdesc: "Address to use for clustering traffic"
:type: "string"
See {ref}`cluster-https-address`.:defaultdesc: "`3`"
:scope: "global"
:shortdesc: "Number of cluster members that replicate an image"
:type: "integer"
Specify the minimal number of cluster members that keep a copy of a particular image.
Set this option to `1` for no replication, or to `-1` to replicate images on all members.:defaultdesc: "`3H`"
:scope: "global"
:shortdesc: "Time after which a cluster join token expires"
:type: "string":defaultdesc: "`2`"
:scope: "global"
:shortdesc: "Number of database stand-by members"
:type: "integer"
Specify the maximum number of cluster members that are assigned the database stand-by role.
This must be a number between `0` and `5`.:defaultdesc: "`3`"
:scope: "global"
:shortdesc: "Number of database voter members"
:type: "integer"
Specify the maximum number of cluster members that are assigned the database voter role.
This must be an odd number >= `3`.:defaultdesc: "`20`"
:scope: "global"
:shortdesc: "Threshold when an unresponsive member is considered offline"
:type: "integer"
Specify the number of seconds after which an unresponsive member is considered offline.:defaultdesc: "`1`"
:scope: "global"
:shortdesc: "Maximum number of instances to move during one re-balancing run"
:type: "integer":defaultdesc: "`6H`"
:scope: "global"
:shortdesc: "Amount of time during which an instance will not be moved again"
:type: "string":defaultdesc: "`0`"
:scope: "global"
:shortdesc: "How often (in minutes) to consider re-balancing things. 0 to disable (default)"
:type: "integer":defaultdesc: "`20`"
:scope: "global"
:shortdesc: "Percentage load difference between most and least busy server needed to trigger a migration"
:type: "integer":scope: "local"
:shortdesc: "Address to bind the BGP server to"
:type: "string"
See {ref}`network-bgp`.:scope: "global"
:shortdesc: "BGP Autonomous System Number for the local server"
:type: "string":scope: "local"
:shortdesc: "A unique identifier for the BGP server"
:type: "string"
The identifier must be formatted as an IPv4 address.:scope: "local"
:shortdesc: "Address to bind the `pprof` debug server to (HTTP)"
:type: "string":scope: "local"
:shortdesc: "Address to bind the authoritative DNS server to"
:type: "string"
See {ref}`network-dns-server`.:scope: "local"
:shortdesc: "Address to bind for the remote API (HTTPS)"
:type: "string"
See {ref}`server-expose`.:defaultdesc: "`false`"
:scope: "global"
:shortdesc: "Whether to set `Access-Control-Allow-Credentials`"
:type: "bool"
If enabled, the `Access-Control-Allow-Credentials` HTTP header value is set to `true`.:scope: "global"
:shortdesc: "`Access-Control-Allow-Headers` HTTP header value"
:type: "string":scope: "global"
:shortdesc: "`Access-Control-Allow-Methods` HTTP header value"
:type: "string":scope: "global"
:shortdesc: "`Access-Control-Allow-Origin` HTTP header value"
:type: "string":scope: "global"
:shortdesc: "Allowed `Origin` values for WebSocket connections"
:type: "string":scope: "global"
:shortdesc: "Trusted servers to provide the client's address"
:type: "string"
Specify a comma-separated list of IP addresses of trusted servers that provide the client's address through the proxy connection header.:scope: "local"
:shortdesc: "Address to bind the metrics server to (HTTPS)"
:type: "string"
See {ref}`metrics`.:defaultdesc: "`true`"
:scope: "global"
:shortdesc: "Whether to enforce authentication on the metrics endpoint"
:type: "bool":scope: "global"
:shortdesc: "HTTP proxy to use"
:type: "string"
If this option is not specified, the daemon falls back to the `HTTP_PROXY` environment variable (if set).:scope: "global"
:shortdesc: "HTTPS proxy to use"
:type: "string"
If this option is not specified, the daemon falls back to the `HTTPS_PROXY` environment variable (if set).:scope: "global"
:shortdesc: "Hosts that don't need the proxy"
:type: "string"
Specify this option in a similar format to `NO_PROXY` (for example, `1.2.3.4,1.2.3.5`)
If this option is not specified, the daemon falls back to the `NO_PROXY` environment variable (if set).:defaultdesc: "no expiry"
:scope: "global"
:shortdesc: "Time after which a remote add token expires"
:type: "string":defaultdesc: "`shutdown`"
:scope: "global"
:shortdesc: "Action to perform on server shutdown"
:type: "string"
Specify the action to take when the daemon is being shut down.
Supported values are `shutdown` (stop all instances) and `evacuate` (attempt to evacuate the clustered server).:defaultdesc: "`5`"
:scope: "global"
:shortdesc: "How long to wait before shutdown"
:type: "integer"
Specify the number of minutes to wait for running operations to complete before the daemon shuts down.:scope: "local"
:shortdesc: "Address to bind the storage object server to (HTTPS)"
:type: "string"
See {ref}`howto-storage-buckets`.:defaultdesc: "`false`"
:scope: "local"
:shortdesc: "Whether to enable the syslog unixgram socket listener"
:type: "bool"
Set this option to `true` to enable the syslog unixgram socket to receive log messages from external processes.:defaultdesc: "`false`"
:scope: "global"
:shortdesc: "Whether to automatically trust clients signed by the CA"
:type: "bool"
This only applies when a `server.ca` file is present.
When enabled, any valid client certificate issued by the CA and not listed in `ca.crl` is trusted without being added to the trust store.
Such certificates get full access to the server unless they are added to the trust store as restricted certificates.
When disabled, certificates issued by the CA still need to be added to the trust store.:defaultdesc: "`true`"
:scope: "global"
:shortdesc: "Whether to automatically update cached images"
:type: "bool":defaultdesc: "`6`"
:scope: "global"
:shortdesc: "Interval at which to look for updates to cached images"
:type: "integer"
Specify the interval in hours.
To disable looking for updates to cached images, set this option to `0`.:defaultdesc: "`gzip`"
:scope: "global"
:shortdesc: "Compression algorithm to use for new images"
:type: "string"
Possible values are `bzip2`, `gzip`, `lz4`, `lzma`, `xz`, `zstd` or `none`.:shortdesc: "Default architecture to use in a mixed-architecture cluster"
:type: "string":defaultdesc: "`10`"
:scope: "global"
:shortdesc: "When an unused cached remote image is flushed"
:type: "integer"
Specify the number of days after which the unused cached image expires.:scope: "global"
:shortdesc: "Comma separate list of projects, empty means all"
:type: "string":scope: "global"
:shortdesc: "E.g., `instance`, comma separate, empty means all"
:type: "string":defaultdesc: "`info`"
:scope: "global"
:shortdesc: "Minimum log level to send to the logger"
:type: "string":scope: "global"
:shortdesc: "Address of the logger"
:type: "string"
Specify the protocol, name or IP and port. For example `tcp://syslog01.int.example.net:514`.:scope: "global"
:shortdesc: "CA certificates for the server (PEM bundle)"
:type: "string":scope: "global"
:shortdesc: "The syslog facility defines the category of the log message"
:type: "string":defaultdesc: "Local server host name or cluster member name"
:scope: "global"
:shortdesc: "Name to use as the instance field in Loki events."
:type: "string"
This allows replacing the default instance value (server host name) by a more relevant value like a cluster identifier.:scope: "global"
:shortdesc: "Labels for a Loki log entry"
:type: "string"
Specify a comma-separated list of values that should be used as labels for a Loki log entry.:scope: "global"
:shortdesc: "Password used for authentication"
:type: "string":scope: "global"
:shortdesc: "number of delivery retries, default 3"
:type: "integer":scope: "global"
:shortdesc: "The type of the logger. One of `loki`, `syslog` or `webhook`."
:type: "string":scope: "global"
:shortdesc: "User name used for authentication"
:type: "string":defaultdesc: "`lifecycle,logging`"
:scope: "global"
:shortdesc: "Events to send to the logger"
:type: "string"
Specify a comma-separated list of events to send to the logger.
The events can be any combination of `lifecycle`, `logging`, and `network-acl`.:scope: "global"
:shortdesc: "CA certificates for the Loki server (PEM bundle)"
:type: "string":scope: "global"
:shortdesc: "URL to the Loki server"
:type: "string"
Specify the protocol, name or IP and port. For example `https://loki.example.com:3100`. Incus will automatically add the `/loki/api/v1/push` suffix so there's no need to add it here.:scope: "global"
:shortdesc: "Password used for Loki authentication"
:type: "string":scope: "global"
:shortdesc: "User name used for Loki authentication"
:type: "string":defaultdesc: "Local server host name or cluster member name"
:scope: "global"
:shortdesc: "Name to use as the instance field in Loki events."
:type: "string"
This allows replacing the default instance value (server host name) by a more relevant value like a cluster identifier.:scope: "global"
:shortdesc: "Labels for a Loki log entry"
:type: "string"
Specify a comma-separated list of values that should be used as labels for a Loki log entry.:defaultdesc: "`info`"
:scope: "global"
:shortdesc: "Minimum log level to send to the Loki server"
:type: "string":defaultdesc: "`lifecycle,logging`"
:scope: "global"
:shortdesc: "Events to send to the Loki server"
:type: "string"
Specify a comma-separated list of events to send to the Loki server.
The events can be any combination of `lifecycle`, `logging`, and `network-acl`.:defaultdesc: "`gzip`"
:scope: "global"
:shortdesc: "Compression algorithm to use for backups"
:type: "string"
Possible values are `bzip2`, `gzip`, `lz4`, `lzma`, `xz`, `zstd` or `none`.:defaultdesc: "`false`"
:scope: "global"
:shortdesc: "Whether to run LXCFS on a per-instance basis"
:type: "bool"
LXCFS is used to provide overlays for common `/proc` and `/sys`
files which reflect the resource limits applied to the container.
It normally operates through a single file system mount on the host which is then shared by all containers.
This is very efficient but comes with the downside that a crash of LXCFS will break all containers.
With this option, it's now possible to run a LXCFS instance per
container instead, using more system resources but reducing the impact
of a crash.:defaultdesc: "`random`"
:scope: "global"
:shortdesc: "How to set the host name for a NIC"
:type: "string"
Possible values are `random` and `mac`.
If set to `random`, use the random host interface name as the host name.
If set to `mac`, generate a host name in the form `inc<mac_address>` (MAC without leading two digits).:scope: "global"
:shortdesc: "Instance placement scriptlet for automatic instance placement"
:type: "string"
When using custom automatic instance placement logic, this option stores the scriptlet.
See {ref}`clustering-instance-placement-scriptlet` for more information.:scope: "global"
:shortdesc: "Platform CA certificate used to provision TPM Endorsement Keys (PEM bundle)"
:type: "string"
PEM encoded platform CA certificate used to sign the Endorsement
Key and platform certificate of newly created TPM devices.
Must be set together with `instances.tpm.platform_key`.:scope: "global"
:shortdesc: "Private key for the TPM platform CA certificate (PEM private key)"
:type: "string"
PEM encoded private key matching `instances.tpm.platform_cert`.
Used to sign the Endorsement Key and platform certificate of newly
created TPM devices.:defaultdesc: "Content of `/etc/ovn/ovn-central.crt` if present"
:scope: "global"
:shortdesc: "OVN SSL certificate authorities (PEM bundle)"
:type: "string":defaultdesc: "Content of `/etc/ovn/cert_host` if present"
:scope: "global"
:shortdesc: "OVN SSL client certificate (PEM bundle)"
:type: "string":defaultdesc: "Content of `/etc/ovn/key_host` if present"
:scope: "global"
:shortdesc: "OVN SSL client key (PEM private key)"
:type: "string":defaultdesc: "`br-int`"
:scope: "global"
:shortdesc: "OVS integration bridge to use for OVN networks"
:type: "string":defaultdesc: "`unix:/run/ovn/ovnnb_db.sock`"
:scope: "global"
:shortdesc: "OVN northbound database connection string"
:type: "string":defaultdesc: "`unix:/run/openvswitch/db.sock`"
:scope: "global"
:shortdesc: "OVS socket path"
:type: "string":scope: "local"
:shortdesc: "Volume to use to store backup tarballs"
:type: "string"
Specify the volume using the syntax `POOL/VOLUME`.:scope: "local"
:shortdesc: "Volume to use to store the image tarballs"
:type: "string"
Specify the volume using the syntax `POOL/VOLUME`.:scope: "global"
:shortdesc: "LINSTOR SSL certificate authorities (PEM bundle)"
:type: "string":scope: "global"
:shortdesc: "LINSTOR SSL client certificate (PEM bundle)"
:type: "string":scope: "global"
:shortdesc: "LINSTOR SSL client key (PEM private key)"
:type: "string":scope: "global"
:shortdesc: "LINSTOR controller connection string"
:type: "string":scope: "global"
:shortdesc: "LINSTOR satellite node name override"
:type: "string"
Set this option to the name of the local LINSTOR satellite node, should it be different from the Incus server name.:scope: "local"
:shortdesc: "Volume to use to store instance log directories"
:type: "string"
Specify the volume using the syntax `POOL/VOLUME`.:defaultdesc: "`10:66:6a:xx:xx:xx`"
:scope: "global"
:shortdesc: "MAC address template"
:type: "string"
Specify a MAC address template, e.g. `10:66:6a:xx:xx:xx`, to use within the cluster.
Every `x` in the template will be replaced by a random character in `0`–`f`.
Beware of the birthday paradox! A single `xx` block leads to a 10% collision probability with only 8 addresses; for a double `xx:xx` block, 118 addresses; for a triple `xx:xx:xx` block, 1881; for a quadruple `xx:xx:xx:xx` block, 30084. We provide absolutely no guardrail against that.:scope: "global"
:shortdesc: "Expected audience value for the application"
:type: "string"
This value is required by some providers.
Opaque access tokens are rejected when set as the audience can't be verified on those.:scope: "global"
:shortdesc: "OpenID Connect claim to use as the username"
:type: "string"
Note that the claim must be contained in the access token or, for opaque access tokens, in the ID token.:scope: "global"
:shortdesc: "OpenID Connect client ID"
:type: "string":scope: "global"
:shortdesc: "OpenID Connect Discovery URL for the provider"
:type: "string":scope: "global"
:shortdesc: "Comma separated list of OpenID Connect scopes"
:type: "string":default: "-"
:scope: "global"
:shortdesc: "Additional options to pass to `mkfs.btrfs` when creating the pool"
:type: "string":default: "`user_subvol_rm_allowed`"
:scope: "global"
:shortdesc: "Mount options for block devices"
:type: "string":default: "auto (20% of free disk space, >= 5 GiB and <= 30 GiB)"
:scope: "local"
:shortdesc: "Size of the storage pool when creating loop-based pools (in bytes, suffixes supported, can be increased to grow storage pool)"
:type: "string":default: "-"
:scope: "local"
:shortdesc: "Path to an existing block device, loop file or Btrfs subvolume"
:type: "string":default: "`false`"
:scope: "local"
:shortdesc: "Wipe the block device specified in `source` prior to creating the storage pool"
:type: "bool":condition: "appropriate driver"
:default: "same as `volume.size`"
:shortdesc: "Size/quota of the storage bucket"
:type: "string":default: "-"
:shortdesc: "Quota of the storage bucket"
:type: "string":condition: "appropriate driver"
:default: "same as `volume.size`"
:shortdesc: "Size/quota of the storage bucket"
:type: "string":condition: "appropriate driver"
:default: "same as `volume.size`"
:shortdesc: "Size/quota of the storage bucket"
:type: "string":default: "`ceph`"
:scope: "global"
:shortdesc: "Name of the Ceph cluster in which to create new storage pools"
:type: "string":default: "-"
:scope: "global"
:shortdesc: "Name of the OSD data pool"
:type: "string":default: "-"
:scope: "global"
:shortdesc: "Deprecated, should not be used."
:type: "bool":default: "`32`"
:scope: "global"
:shortdesc: "Number of placement groups for the OSD storage pool"
:type: "string":default: "name of the pool"
:scope: "global"
:shortdesc: "Name of the OSD storage pool"
:type: "string":default: "`krbd`"
:scope: "global"
:shortdesc: "Whether to use the RBD kernel driver (`krbd`) or `librbd` through `qemu-nbd` (`librbd`)"
:type: "string":default: "`true`"
:scope: "global"
:shortdesc: "Whether to use RBD lightweight clones rather than full dataset copies"
:type: "bool"
When disabled, new volumes are still cloned from their source but flattened in the
background right after creation, so the source can only be fully removed once that
has completed.:default: "`true`"
:scope: "global"
:shortdesc: "Whether to use RBD `du` to obtain disk usage data for stopped instances"
:type: "bool":default: "`layering`"
:scope: "global"
:shortdesc: "Comma-separated list of RBD features to enable on the volumes"
:type: "string":default: "`admin`"
:scope: "global"
:shortdesc: "The Ceph user to use when creating storage pools and volumes"
:type: "string":default: "-"
:scope: "local"
:shortdesc: "Existing OSD storage pool to use"
:type: "string":default: "`true`"
:scope: "global"
:shortdesc: "Whether the pool was empty on creation time"
:type: "string":default: "`ceph`"
:scope: "global"
:shortdesc: "Name of the Ceph cluster that contains the CephFS file system"
:type: "string":default: "`false`"
:scope: "global"
:shortdesc: "Create the file system and the missing data and metadata OSD pools"
:type: "bool":default: "-"
:scope: "global"
:shortdesc: "Data OSD pool name to create for the file system"
:type: "string":default: "`false`"
:scope: "global"
:shortdesc: "Enable use of kernel `fscache` and `cachefilesd`"
:type: "bool":default: "-"
:scope: "global"
:shortdesc: "Metadata OSD pool name to create for the file system"
:type: "string":default: "-"
:scope: "global"
:shortdesc: "OSD pool `pg_num` to use when creating missing OSD pools"
:type: "string":default: "`/`"
:scope: "global"
:shortdesc: "The base path for the CephFS mount"
:type: "string":default: "`admin`"
:scope: "global"
:shortdesc: "The Ceph user to use"
:type: "string":default: "-"
:scope: "local"
:shortdesc: "Existing CephFS file system or file system path to use"
:type: "string":default: "`true`"
:scope: "global"
:shortdesc: "Whether the CephFS file system was empty on creation time"
:type: "string":default: "-"
:scope: "global"
:shortdesc: "Prefix to add to bucket names in Ceph"
:type: "string":default: "`ceph`"
:scope: "global"
:shortdesc: "The Ceph cluster to use"
:type: "string":default: "-"
:scope: "global"
:shortdesc: "URL of the `radosgw` gateway process"
:type: "string":default: "-"
:scope: "global"
:shortdesc: "TLS certificate (PEM bundle) to trust for endpoint communication"
:type: "string":default: "`admin`"
:scope: "global"
:shortdesc: "The Ceph user to use"
:type: "string":default: "`true`"
:scope: "global"
:shortdesc: "Whether the `radosgw` `incus-admin` user existed at creation time"
:type: "string":default: "`0` (no limit)"
:scope: "global"
:shortdesc: "The upper limit to be placed on the socket I/O when `rsync` must be used to transfer storage entities"
:type: "string":default: "`true`"
:scope: "global"
:shortdesc: "Whether to use compression while migrating storage pools"
:type: "bool":default: "-"
:scope: "local"
:shortdesc: "Path to an existing directory"
:type: "string":default: "`true`"
:scope: "global"
:shortdesc: "Whether to allow LINSTOR to automatically create diskless resources to act as quorum tiebreakers if needed (applied to the resource group)"
:type: "bool":default: "-"
:scope: "global"
:shortdesc: "A duration string describing the time after which a primary diskless resource can be converted to diskful if storage is available on the node (applied to the resource group)"
:type: "string":default: "-"
:scope: "global"
:shortdesc: "The DRBD policy to use on resources when quorum is lost (applied to the resource group)"
:type: "string":scope: "global"
:shortdesc: "Extra LINSTOR properties to set. For example, `BCache/PoolName` is encoded as `linstor.raw.BCache/PoolName`."
:type: "string":default: "`incus`"
:scope: "global"
:shortdesc: "Name of the LINSTOR resource group that will be used for the storage pool"
:type: "string":default: "`2`"
:scope: "global"
:shortdesc: "Number of diskful replicas that should be created for resources in the resource group. Increasing the value of this option on a pool that already has volumes will result in LINSTOR creating new diskful replicas for all existing resources to match the new value"
:type: "int":default: "-"
:scope: "global"
:shortdesc: "The storage pool name in which resources should be placed on satellite nodes"
:type: "string":default: "`incus-volume-`"
:scope: "global"
:shortdesc: "The prefix to use for the internal names of LINSTOR-managed volumes. Cannot be updated after the storage pool is created"
:type: "string":default: "`incus`"
:scope: "global"
:shortdesc: "LINSTOR storage pool name. Alias for `linstor.resource_group.name`. Use either either one or the other or make sure they have the same value."
:type: "string":default: "`true`"
:scope: "global"
:shortdesc: "Whether the pool was empty on creation time"
:type: "string":condition: "block-based volume"
:default: "same as `volume.block.type`"
:shortdesc: "Type of the block volume":default: "`0` (auto)"
:scope: "global"
:shortdesc: "The size of the metadata space for the physical volume."
:type: "string":default: "`0` (auto)"
:scope: "global"
:shortdesc: "The size of the thin pool metadata volume (the default is to let LVM calculate an appropriate size). Not usable with `lvmcluster`."
:type: "string":default: "`IncusThinPool`"
:scope: "local"
:shortdesc: "Thin pool where volumes are created. Not usable with `lvmcluster`."
:type: "string":default: "`true`"
:scope: "global"
:shortdesc: "Whether the storage pool uses a thin pool for logical volumes. Not usable with `lvmcluster`."
:type: "bool":default: "`false`"
:scope: "local"
:shortdesc: "Force using an existing non-empty volume group. Not usable with `lvmcluster`."
:type: "bool":default: "name of the pool"
:scope: "local"
:shortdesc: "Name of the volume group to create."
:type: "string":default: "auto (20% of free disk space, >= 5 GiB and <= 30 GiB) for `lvm`."
:scope: "local"
:shortdesc: "Storage pool size (in bytes, suffixes supported, can be increased to grow storage pool). `lvmcluster` pools: cannot set at creation, but can be updated."
:type: "string":default: "-"
:scope: "local"
:shortdesc: "Path to an existing block device, loop file or LVM volume group."
:type: "string":default: "`false`"
:scope: "local"
:shortdesc: "Wipe the block device specified in `source` prior to creating the storage pool."
:type: "bool":default: "-"
:scope: "local"
:shortdesc: "ZFS dataset to use on the remote TrueNAS host. Format: `[<host>:]<pool>[/<dataset>][/]`. If `host` is omitted here, it must be set via `truenas.host`."
:type: "string":default: "`false`"
:scope: "global"
:shortdesc: "If set to `true`, allows insecure (non-TLS) connections to the TrueNAS API."
:type: "bool":default: "-"
:scope: "global"
:shortdesc: "API key used to authenticate with the TrueNAS host."
:type: "string":default: "`true`"
:scope: "global"
:shortdesc: "Whether to use lightweight clones rather than full {spellexception}`dataset` copies."
:type: "bool":default: "-"
:scope: "global"
:shortdesc: "Path to a configuration file for the TrueNAS client tool."
:type: "string":default: "-"
:scope: "global"
:shortdesc: "Remote dataset name. Typically inferred from `source`, but can be overridden."
:type: "string":default: "`false`"
:scope: "global"
:shortdesc: "Allow to use an existing non-empty pool."
:type: "bool":default: "-"
:scope: "global"
:shortdesc: "Hostname or IP address of the remote TrueNAS system. Optional if included in the `source`, or a configuration is used."
:type: "string":default: "-"
:scope: "global"
:shortdesc: "iSCSI initiator name used during block volume attachment."
:type: "string":default: "-"
:scope: "global"
:shortdesc: "iSCSI portal address to use for block volume connections."
:type: "string":condition: "appropriate driver"
:default: "same as `volume.btrfs.compression`"
:shortdesc: "Compression algorithm to set on the volume, mapping to the Btrfs `compression` property (for example `zstd`, `lzo`, `zlib` or `none`)"
:type: "string":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.gid` or `0`"
:shortdesc: "GID of the volume owner in the instance"
:type: "int":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.mode` or `711`"
:shortdesc: "Mode of the volume in the instance"
:type: "int":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.uid` or `0`"
:shortdesc: "UID of the volume owner in the instance"
:type: "int":condition: "custom block volume"
:default: "same as `volume.security.shared` or `false`"
:shortdesc: "Enable sharing the volume across multiple instances"
:type: "bool":condition: "custom volume"
:default: "same as `volume.security.shifted` or `false`"
:shortdesc: "{{enable_ID_shifting}}"
:type: "bool":condition: "custom volume"
:default: "same as `volume.security.unmapped` or `false`"
:shortdesc: "Disable ID mapping for the volume"
:type: "bool":condition: "appropriate driver"
:default: "same as `volume.size`"
:shortdesc: "Size/quota of the storage volume"
:type: "string":condition: "custom volume"
:default: "same as `volume.snapshot.expiry`"
:shortdesc: "{{snapshot_expiry_format}}"
:type: "string"
{{snapshot_expiry_detail}}:condition: "custom volume"
:default: "same as `volume.snapshot.expiry.manual`"
:shortdesc: "{{snapshot_expiry_format}}"
:type: "string"
{{snapshot_expiry_detail}}:condition: "custom volume"
:default: "same as `volume.snapshot.pattern` or `snap%d`"
:shortdesc: "{{snapshot_pattern_format}} [^*]"
:type: "string":condition: "custom volume"
:default: "same as `volume.snapshot.schedule`"
:shortdesc: "{{snapshot_schedule_format}}"
:type: "string":condition: "block-based volume with content type `filesystem`"
:default: "same as `volume.block.create_options`"
:shortdesc: "Additional options to pass to the file system creation tool when formatting the volume"
:type: "string":condition: "block-based volume with content type `filesystem`"
:default: "same as `volume.block.filesystem`"
:shortdesc: "{{block_filesystem}}"
:type: "string":condition: "block-based volume with content type `filesystem`"
:default: "same as `volume.block.mount_options`"
:shortdesc: "Mount options for block-backed file system volumes"
:type: "string":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.gid` or `0`"
:shortdesc: "GID of the volume owner in the instance"
:type: "int":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.mode` or `711`"
:shortdesc: "Mode of the volume in the instance"
:type: "int":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.uid` or `0`"
:shortdesc: "UID of the volume owner in the instance"
:type: "int":condition: "custom block volume"
:default: "same as `volume.security.shared` or `false`"
:shortdesc: "Enable sharing the volume across multiple instances"
:type: "bool":condition: "custom volume"
:default: "same as `volume.security.shifted` or `false`"
:shortdesc: "{{enable_ID_shifting}}"
:type: "bool":condition: "custom volume"
:default: "same as `volume.security.unmapped` or `false`"
:shortdesc: "Disable ID mapping for the volume"
:type: "bool":condition: "-"
:default: "same as `volume.size`"
:shortdesc: "Size/quota of the storage volume"
:type: "string":condition: "custom volume"
:default: "same as `volume.snapshot.expiry`"
:shortdesc: "{{snapshot_expiry_format}}"
:type: "string"
{{snapshot_expiry_detail}}:condition: "custom volume"
:default: "same as `volume.snapshot.expiry.manual`"
:shortdesc: "{{snapshot_expiry_format}}"
:type: "string"
{{snapshot_expiry_detail}}:condition: "custom volume"
:default: "same as `volume.snapshot.pattern` or `snap%d`"
:shortdesc: "{{snapshot_pattern_format}} [^*]"
:type: "string":condition: "custom volume"
:default: "same as `volume.snapshot.schedule`"
:shortdesc: "{{snapshot_schedule_format}}"
:type: "string":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.gid` or `0`"
:shortdesc: "GID of the volume owner in the instance"
:type: "int":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.mode` or `711`"
:shortdesc: "Mode of the volume in the instance"
:type: "int":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.uid` or `0`"
:shortdesc: "UID of the volume owner in the instance"
:type: "int":condition: "custom block volume"
:default: "same as `volume.security.shared` or `false`"
:shortdesc: "Enable sharing the volume across multiple instances"
:type: "bool":condition: "custom volume"
:default: "same as `volume.security.shifted` or `false`"
:shortdesc: "{{enable_ID_shifting}}"
:type: "bool":condition: "custom volume"
:default: "same as `volume.security.unmapped` or `false`"
:shortdesc: "Disable ID mapping for the volume"
:type: "bool":condition: "appropriate driver"
:default: "same as `volume.size`"
:shortdesc: "Size/quota of the storage volume"
:type: "string":condition: "custom volume"
:default: "same as `volume.snapshot.expiry`"
:shortdesc: "{{snapshot_expiry_format}}"
:type: "string"
{{snapshot_expiry_detail}}:condition: "custom volume"
:default: "same as `volume.snapshot.expiry.manual`"
:shortdesc: "{{snapshot_expiry_format}}"
:type: "string"
{{snapshot_expiry_detail}}:condition: "custom volume"
:default: "same as `volume.snapshot.pattern` or `snap%d`"
:shortdesc: "{{snapshot_pattern_format}} [^*]"
:type: "string":condition: "custom volume"
:default: "same as `volume.snapshot.schedule`"
:shortdesc: "{{snapshot_schedule_format}}"
:type: "string":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.gid` or `0`"
:shortdesc: "GID of the volume owner in the instance"
:type: "int":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.mode` or `711`"
:shortdesc: "Mode of the volume in the instance"
:type: "int":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.uid` or `0`"
:shortdesc: "UID of the volume owner in the instance"
:type: "int":condition: "custom block volume"
:default: "same as `volume.security.shared` or `false`"
:shortdesc: "Enable sharing the volume across multiple instances"
:type: "bool":condition: "custom volume"
:default: "same as `volume.security.shifted` or `false`"
:shortdesc: "{{enable_ID_shifting}}"
:type: "bool":condition: "appropriate driver"
:default: "same as `volume.size`"
:shortdesc: "Size/quota of the storage volume"
:type: "string":condition: "custom volume"
:default: "same as `volume.security.unmapped` or `false`"
:shortdesc: "Disable ID mapping for the volume"
:type: "bool":condition: "custom volume"
:default: "same as `volume.snapshot.expiry`"
:shortdesc: "{{snapshot_expiry_format}}"
:type: "string"
{{snapshot_expiry_detail}}:condition: "custom volume"
:default: "same as `volume.snapshot.expiry.manual`"
:shortdesc: "{{snapshot_expiry_format}}"
:type: "string"
{{snapshot_expiry_detail}}:condition: "custom volume"
:default: "same as `volume.snapshot.pattern` or `snap%d`"
:shortdesc: "{{snapshot_pattern_format}} [^*]"
:type: "string":condition: "custom volume"
:default: "same as `volume.snapshot.schedule`"
:shortdesc: "{{snapshot_schedule_format}}"
:type: "string":condition: "block-based volume with content type `filesystem`"
:default: "same as `volume.block.create_options`"
:shortdesc: "Additional options to pass to the file system creation tool when formatting the volume"
:type: "string":condition: "block-based volume with content type `filesystem`"
:default: "same as `volume.block.filesystem`"
:shortdesc: "{{block_filesystem}}"
:type: "string":condition: "block-based volume with content type `filesystem`"
:default: "same as `volume.block.mount_options`"
:shortdesc: "Mount options for block-backed file system volumes"
:type: "string":condition: "-"
:default: "`true`"
:shortdesc: "Whether to allow LINSTOR to automatically create diskless resources to act as quorum tiebreakers if needed (applied to the resource definition)"
:type: "bool":condition: "-"
:default: "-"
:shortdesc: "A duration string describing the time after which a primary diskless resource can be converted to diskful if storage is available on the node (applied to the resource definition)"
:type: "string":condition: "-"
:default: "-"
:shortdesc: "The DRBD policy to use on resources when quorum is lost (applied to the resource definition)"
:type: "string":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.gid` or `0`"
:shortdesc: "GID of the volume owner in the instance"
:type: "int":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.mode` or `711`"
:shortdesc: "Mode of the volume in the instance"
:type: "int":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.uid` or `0`"
:shortdesc: "UID of the volume owner in the instance"
:type: "int":scope: "global"
:shortdesc: "Extra LINSTOR properties to set. For example, `BCache/PoolName` is encoded as `linstor.raw.BCache/PoolName`."
:type: "string":condition: "-"
:default: "same as `volume.linstor.remove_snapshots` or `false`"
:shortdesc: "Remove snapshots as needed"
:type: "bool":condition: "custom block volume"
:default: "same as `volume.security.shared` or `false`"
:shortdesc: "Enable sharing the volume across multiple instances"
:type: "bool":condition: "custom volume"
:default: "same as `volume.security.shifted` or `false`"
:shortdesc: "{{enable_ID_shifting}}"
:type: "bool":condition: "custom volume"
:default: "same as `volume.security.unmapped` or `false`"
:shortdesc: "Disable ID mapping for the volume"
:type: "bool":condition: "-"
:default: "same as `volume.size`"
:shortdesc: "Size/quota of the storage volume"
:type: "string":condition: "custom volume"
:default: "same as `volume.snapshot.expiry`"
:shortdesc: "{{snapshot_expiry_format}}"
:type: "string"
{{snapshot_expiry_detail}}:condition: "custom volume"
:default: "same as `volume.snapshot.expiry.manual`"
:shortdesc: "{{snapshot_expiry_format}}"
:type: "string"
{{snapshot_expiry_detail}}:condition: "custom volume"
:default: "same as `volume.snapshot.pattern` or `snap%d`"
:shortdesc: "{{snapshot_pattern_format}} [^*]"
:type: "string":condition: "custom volume"
:default: "same as `volume.snapshot.schedule`"
:shortdesc: "{{snapshot_schedule_format}}"
:type: "string":condition: "block-based volume with content type `filesystem`"
:default: "same as `volume.block.create_options`"
:shortdesc: "Additional options to pass to the file system creation tool when formatting the volume"
:type: "string":condition: "block-based volume with content type `filesystem`"
:default: "same as `volume.block.filesystem`"
:shortdesc: "{{block_filesystem}}"
:type: "string":condition: "block-based volume with content type `filesystem`"
:default: "same as `volume.block.mount_options`"
:shortdesc: "Mount options for block-backed file system volumes"
:type: "string":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.gid` or `0`"
:shortdesc: "GID of the volume owner in the instance"
:type: "int":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.mode` or `711`"
:shortdesc: "Mode of the volume in the instance"
:type: "int":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.uid` or `0`"
:shortdesc: "UID of the volume owner in the instance"
:type: "int":condition: "-"
:default: "same as `volume.lvm.stripes`"
:shortdesc: "Number of stripes to use for new volumes (or thin pool volume)"
:type: "string":condition: "-"
:default: "same as `volume.lvm.stripes.size`"
:shortdesc: "Size of stripes to use (at least 4096 bytes and multiple of 512 bytes)"
:type: "string":condition: "-"
:default: "same as `volume.lvmcluster.remove_snapshots` or `false`"
:shortdesc: "Remove snapshots as needed"
:type: "bool":condition: "custom block volume"
:default: "same as `volume.security.shared` or `false`"
:shortdesc: "Enable sharing the volume across multiple instances"
:type: "bool":condition: "custom volume"
:default: "same as `volume.security.shifted` or `false`"
:shortdesc: "{{enable_ID_shifting}}"
:type: "bool":condition: "custom volume"
:default: "same as `volume.security.unmapped` or `false`"
:shortdesc: "Disable ID mapping for the volume"
:type: "bool":condition: "default: same as `volume.size`"
:shortdesc: "Size/quota of the storage volume"
:type: "string":condition: "custom volume"
:default: "same as `volume.snapshot.expiry`"
:shortdesc: "{{snapshot_expiry_format}}"
:type: "string"
{{snapshot_expiry_detail}}:condition: "custom volume"
:default: "same as `volume.snapshot.expiry.manual`"
:shortdesc: "{{snapshot_expiry_format}}"
:type: "string"
{{snapshot_expiry_detail}}:condition: "custom volume"
:default: "same as `volume.snapshot.pattern` or `snap%d`"
:shortdesc: "{{snapshot_pattern_format}} [^*]"
:type: "string":condition: "custom volume"
:default: "same as `volume.snapshot.schedule`"
:shortdesc: "{{snapshot_schedule_format}}"
:type: "string":condition: "-"
:default: "same as `volume.block.create_options`"
:shortdesc: "Additional options to pass to the file system creation tool when formatting the volume"
:type: "string":condition: "-"
:default: "same as `volume.block.filesystem`"
:shortdesc: "{{block_filesystem}}"
:type: "string":condition: "-"
:default: "same as `volume.block.mount_options`"
:shortdesc: "Mount options for block-backed file system volumes"
:type: "string":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.gid` or `0`"
:shortdesc: "GID of the volume owner in the instance"
:type: "int":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.mode` or `711`"
:shortdesc: "Mode of the volume in the instance"
:type: "int":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.uid` or `0`"
:shortdesc: "UID of the volume owner in the instance"
:type: "int":condition: "custom block volume"
:default: "same as `volume.security.shared` or `false`"
:shortdesc: "Enable sharing the volume across multiple instances"
:type: "bool":condition: "custom volume"
:default: "same as `volume.security.shifted` or `false`"
:shortdesc: "{{enable_ID_shifting}}"
:type: "bool":condition: "custom volume"
:default: "same as `volume.security.unmapped` or `false`"
:shortdesc: "Disable ID mapping for the volume"
:type: "bool":condition: "appropriate driver"
:default: "same as `volume.size`"
:shortdesc: "Size/quota of the storage volume"
:type: "string":condition: "custom volume"
:default: "same as `volume.snapshot.expiry`"
:shortdesc: "{{snapshot_expiry_format}}"
:type: "string"
{{snapshot_expiry_detail}}:condition: "custom volume"
:default: "same as `volume.snapshot.expiry.manual`"
:shortdesc: "{{snapshot_expiry_format}}"
:type: "string"
{{snapshot_expiry_detail}}:condition: "custom volume"
:default: "same as `volume.snapshot.pattern` or `snap%d`"
:shortdesc: "{{snapshot_pattern_format}}"
:type: "string":condition: "custom volume"
:default: "same as `volume.snapshot.schedule`"
:shortdesc: "{{snapshot_schedule_format}}"
:type: "string":condition: "-"
:default: "same as `volume.truenas.blocksize`"
:shortdesc: "Size of the ZFS block in range from 512 bytes to 16 MiB (must be power of 2) - for block volume, a maximum value of 128 KiB will be used even if a higher value is set"
:type: "string":condition: "-"
:default: "same as `volume.truenas.remove_snapshots` or `false`"
:shortdesc: "Remove snapshots as needed"
:type: "bool":condition: "-"
:default: "same as `volume.truenas.use_refquota` or `false`"
:shortdesc: "Use `refquota` instead of `quota` for space"
:type: "bool":condition: "block-based volume with content type `filesystem` (`zfs.block_mode` enabled)"
:default: "same as `volume.block.create_options`"
:shortdesc: "Additional options to pass to the file system creation tool when formatting the volume"
:type: "string":condition: "block-based volume with content type `filesystem` (`zfs.block_mode` enabled)"
:default: "same as `volume.block.filesystem`"
:shortdesc: "{{block_filesystem}}"
:type: "string":condition: "block-based volume with content type `filesystem` (`zfs.block_mode` enabled)"
:default: "same as `volume.block.mount_options`"
:shortdesc: "Mount options for block-backed file system volumes"
:type: "string":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.gid` or `0`"
:shortdesc: "GID of the volume owner in the instance"
:type: "int":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.mode` or `711`"
:shortdesc: "Mode of the volume in the instance"
:type: "int":condition: "custom volume with content type `filesystem`"
:default: "same as `volume.initial.uid` or `0`"
:shortdesc: "UID of the volume owner in the instance"
:type: "int":condition: "custom block volume"
:default: "same as `volume.security.shared` or `false`"
:shortdesc: "Enable sharing the volume across multiple instances"
:type: "bool":condition: "custom volume"
:default: "same as `volume.security.shifted` or `false`"
:shortdesc: "{{enable_ID_shifting}}"
:type: "bool":condition: "custom volume"
:default: "same as `volume.security.unmapped` or `false`"
:shortdesc: "Disable ID mapping for the volume"
:type: "bool":condition: "-"
:default: "same as `volume.size`"
:shortdesc: "Size/quota of the storage volume"
:type: "string":condition: "custom volume"
:default: "same as `volume.snapshot.expiry`"
:shortdesc: "{{snapshot_expiry_format}}"
:type: "string"
{{snapshot_expiry_detail}}:condition: "custom volume"
:default: "same as `volume.snapshot.expiry.manual`"
:shortdesc: "{{snapshot_expiry_format}}"
:type: "string"
{{snapshot_expiry_detail}}:condition: "custom volume"
:default: "same as `volume.snapshot.pattern` or `snap%d`"
:shortdesc: "{{snapshot_pattern_format}} [^*]"
:type: "string":condition: "custom volume"
:default: "same as `volume.snapshot.schedule`"
:shortdesc: "{{snapshot_schedule_format}}"
:type: "string":condition: "-"
:default: "same as `volume.zfs.block_mode`"
:shortdesc: "Whether to use a formatted `zvol` rather than a {spellexception}`dataset` (`zfs.block_mode` can be set only for custom storage volumes; use `volume.zfs.block_mode` to enable ZFS block mode for all storage volumes in the pool, including instance volumes)"
:type: "bool":condition: "-"
:default: "same as `volume.zfs.blocksize`"
:shortdesc: "Size of the ZFS block in range from 512 bytes to 16 MiB (must be power of 2) - for block volume, a maximum value of 128 KiB will be used even if a higher value is set"
:type: "string":condition: "ZFS 2.2 or higher"
:default: "same as `volume.zfs.delegate`"
:shortdesc: "Controls whether to delegate the ZFS dataset and anything underneath it to the container(s) using it. Allows the use of the `zfs` command in the container"
:type: "bool":condition: "-"
:default: "same as `volume.zfs.remove_snapshots` or `false`"
:shortdesc: "Remove snapshots as needed"
:type: "bool":condition: "-"
:default: "same as `volume.zfs.reserve_space` or `false`"
:shortdesc: "Use `reservation`/`refreservation` along with `quota`/`refquota`"
:type: "bool":condition: "-"
:default: "same as `volume.zfsuse_refquota` or `false`"
:shortdesc: "Use `refquota` instead of `quota` for space"
:type: "bool":default: "auto (20% of free disk space, >= 5 GiB and <= 30 GiB)"
:scope: "local"
:shortdesc: "Size of the storage pool when creating loop-based pools (in bytes, suffixes supported, can be increased to grow storage pool)"
:type: "string":default: "-"
:scope: "local"
:shortdesc: "Path to existing block device(s), loop file or ZFS dataset/pool. Multiple block devices should be separated by `,`. When listing block devices, you can also prefix them with `vdev` type. To specify a `vdev` type, use an `=` sign between the `vdev` type and the block devices (e.g., `mirror=/dev/sda,/dev/sdb`). Only `stripe`, `mirror`, `raidz1` and `raidz2` `vdev` types are supported."
:type: "string":default: "`false`"
:scope: "local"
:shortdesc: "Wipe the block device specified in `source` prior to creating the storage pool"
:type: "bool":default: "`true`"
:scope: "global"
:shortdesc: "Whether to use ZFS lightweight clones rather than full {spellexception}`dataset` copies (Boolean), or `rebase` to copy based on the initial image"
:type: "string":default: "`true`"
:scope: "global"
:shortdesc: "Disable zpool export while unmount performed"
:type: "bool":default: "name of the pool"
:scope: "local"
:shortdesc: "Name of the zpool"
:type: "string"Doc Config Options Cheat Sheet (`doc/config_options_cheat_sheet.md`)
orphan: true nosearch: true
Configuration options
This page shows how to output configuration option documentation.
The content in this page is for demonstration purposes only.Some instance options:
:shortdesc: Set the name and MTU to be the same as the instance devices
:default: "`false`"
:type: bool
:liveupdate: "`no`"
:condition: Virtual machine
Controls whether to set the name and MTU of the default network interfaces to be the same as the instance devices (this happens automatically for containers):shortdesc: Maximum number of transfer operations
:condition: container
:default: 10
:type: integer
:liveupdate: "yes"
Maximum number of transfer operations to go through before stopping the instance:shortdesc: What to do when evacuating the instance
:default: "`auto`"
:type: string
:liveupdate: "no"
Controls what to do when evacuating the instance (`auto`, `migrate`, `live-migrate`, or `stop`)These need the instance scope to be specified as second argument.
The default scope is server, so this argument isn't required.
Some server options:
:shortdesc: Compression algorithm for images
:type: string
:scope: global
:default: "`gzip`"
Compression algorithm to use for new images (`bzip2`, `gzip`, `lzma`, `xz` or `none`):shortdesc: How to generate a host name
:type: string
:scope: global
:default: "`random`"
If set to `random`, use the random host interface name as the host name; if set to `mac`, generate a host name in the form `inc<mac_address>` (MAC without leading two digits):shortdesc: Custom automatic instance placement logic
:type: string
:scope: global
Stores the {ref}`clustering-instance-placement-scriptlet` for custom automatic instance placement logicAny other scope is also possible.
This scope shows that you can use formatting, mainly in the short description and the description, and the available options.
:shortdesc: testing
Testing.:shortdesc: Hello! **bold** and `code`
This is the real text.
With two paragraphs.
And a list:
- Item
- Item
- Item
And a table:
Key | Type | Scope | Default | Description
:-- | :--- | :---- | :------ | :----------
`acme.agree_tos` | bool | global | `false` | Agree to ACME terms of service
`acme.ca_url` | string | global | `https://acme-v02.api.letsencrypt.org/directory` | URL to the directory resource of the ACME service
`acme.domain` | string | global | - | Domain for which the certificate is issued
`acme.email` | string | global | - | Email address used for the account registration:shortdesc: testing
:default: "`false`"
:type: Type
:liveupdate: Python parses the options, so "no" is converted to "False" - to prevent this, put quotes around the text ("no" or "`no`")
:condition: "yes"
:readonly: "`maybe` - also add quotes if the option starts with code"
:resource: Resource,
:managed: Managed
:required: Required
:scope: (this is something like "global" or "local", **not** the scope of the option (`server`, `instance`, ...)
ContentTo reference an option, use {config:option}.
It is not possible to override the link text.
Except for server options (default), you must specify the scope.
{config:option}instance:migration.incremental.memory.iterations
{config:option}something:test1
The index is here:
{ref}config-options
Doc Container Environment (`doc/container-environment.md`)
(container-runtime-environment)=
Container runtime environment
Incus attempts to present a consistent environment to all containers it runs.
The exact environment will differ slightly based on kernel features and user configuration, but otherwise, it is identical for all containers.
File system
Incus assumes that any image it uses to create a new container comes with at least the following root-level directories:
/dev(empty)/proc(empty)/sbin/init(executable)/sys(empty)
Devices
Incus containers have a minimal and ephemeral /dev based on a tmpfs file system.
Since this is a tmpfs and not a devtmpfs file system, device nodes appear only if manually created.
The following standard set of device nodes is set up automatically:
/dev/console/dev/fd/dev/full/dev/log/dev/null/dev/ptmx/dev/random/dev/stdin/dev/stderr/dev/stdout/dev/tty/dev/urandom/dev/zero
In addition to the standard set of devices, the following devices are also set up for convenience:
/dev/fuse/dev/net/tun/dev/mqueue
Network
Incus containers may have any number of network devices attached to them.
The naming for those (unless overridden by the user) is ethX, where X is an incrementing number.
Container-to-host communication
Incus sets up a socket at /dev/incus/sock that the root user in the container can use to communicate with Incus on the host.
See {doc}dev-incus for the API documentation.
Mounts
The following mounts are set up by default:
/proc({spellexception}proc)/sys(sysfs)/sys/fs/cgroup/*(cgroupfs) (only on kernels that lack cgroup namespace support)
If they are present on the host, the following paths will also automatically be mounted:
/proc/sys/fs/binfmt_misc/sys/firmware/efi/efivars/sys/fs/fuse/connections/sys/fs/pstore/sys/kernel/debug/sys/kernel/security
The reason for passing all of those paths is that legacy init systems require them to be mounted, or be mountable, inside the container.
The majority of those paths will not be writable (or even readable) from inside an unprivileged container.
In privileged containers, they will be blocked by the AppArmor policy.
LXCFS
If LXCFS is present on the host, it is automatically set up for the container.
This normally results in a number of /proc files being overridden through bind-mounts.
PID1
Incus spawns whatever is located at /sbin/init as the initial process of the container (PID 1).
This binary should act as a proper init system, including handling re-parented processes.
Incus' communication with PID1 in the container is limited to two signals:
SIGINTto trigger a reboot of the containerSIGPWR(or alternativelySIGRTMIN+3) to trigger a clean shutdown of the container
The initial environment of PID1 is blank except for container=lxc, which can be used by the init system to detect the runtime.
All file descriptors above the default three are closed prior to PID1 being spawned.
Doc Contributing (`doc/contributing.md`)
Contributing to Incus
:maxdepth: 1
Introduction </contributing/introduction>
Contribute to the code </contributing/code>
Contribute to the documentation </contributing/docs>Doc Daemon Behavior (`doc/daemon-behavior.md`)
(daemon-behavior)=
Daemon behavior
This specification covers some of the Incus daemon's behavior.
Startup
On every start, Incus checks that its directory structure exists. If it
doesn't, it creates the required directories, generates a key pair and
initializes the database.
Once the daemon is ready for work, Incus scans the instances table
for any instance for which the stored power state differs from the
current one. If an instance's power state was recorded as running and the
instance isn't running, Incus starts it.
Signal handling
`SIGINT`, `SIGQUIT`, `SIGTERM`
For those signals, Incus assumes that it's being temporarily stopped and
will be restarted at a later time to continue handling the instances.
The instances will keep running and Incus will close all connections and
exit cleanly.
`SIGPWR`
Indicates to Incus that the host is going down.
Incus will attempt a clean shutdown of all the instances. After 30 seconds, it
kills any remaining instance.
The instance power_state in the instances table is kept as it was so
that Incus can restore the instances as they were after the host is done rebooting.
`SIGUSR1`
Write a memory profile dump to the file specified with --memprofile.
Doc Database (`doc/database.md`)
(database)=
About the Incus database
Incus uses a distributed database to store the server configuration and state, which allows for quicker queries than if the configuration was stored inside each instance's directory (as it is done by LXC, for example).
To understand the advantages, consider a query against the configuration of all instances, like "what instances are using br0?".
To answer that question without a database, you would have to iterate through every single instance, load and parse its configuration, and then check which network devices are defined in there.
With a database, you can run a simple query on the database to retrieve this information.
Cowsql
In an Incus cluster, all members of the cluster must share the same database state.
Therefore, Incus uses Cowsql, a distributed version of SQLite.
Cowsql provides replication, fault-tolerance, and automatic failover without the need of external database processes.
When using Incus as a single machine and not as a cluster, the Cowsql database effectively behaves like a regular SQLite database.
File location
The database files are stored in the database sub-directory of your Incus data directory (/var/lib/incus/database/).
Upgrading Incus to a newer version might require updating the database schema.
In this case, Incus automatically stores a backup of the database and then runs the update.
See {ref}installing-upgrade for more information.
Backup
See {ref}backup-database for instructions on how to back up the contents of the Incus database.
Doc Debugging (`doc/debugging.md`)
How to debug Incus
For information on debugging instance issues, see {ref}instances-troubleshoot.
Debugging `incus` and `incusd`
Here are different ways to help troubleshooting incus and incusd code.
`incus --debug`
Adding --debug flag to any client command will give extra information
about internals. If there is no useful info, it can be added with the
logging call:
logger.Debugf("Hello: %s", "Debug")`incus monitor`
This command will monitor messages as they appear on remote server.
REST API through local socket
On server side the most easy way is to communicate with Incus through
local socket. This command accesses GET /1.0 and formats JSON into
human readable form using jq
utility:
curl --unix-socket /var/lib/incus/unix.socket incus/1.0 | jq .See the RESTful API for available API.
REST API through HTTPS
{ref}HTTPS connection to Incus <security> requires valid
client certificate that is generated on first incus remote add. This
certificate should be passed to connection tools for authentication
and encryption.
If desired, openssl can be used to examine the certificate (~/.config/incus/client.crt):
openssl x509 -text -noout -in client.crtAmong the lines you should see:
Certificate purposes:
SSL client : YesWith command line tools
wget --no-check-certificate --certificate=$HOME/.config/incus/client.crt --private-key=$HOME/.config/incus/client.key -qO - https://127.0.0.1:8443/1.0With browser
Some browser plugins provide convenient interface to create, modify
and replay web requests. To authenticate against Incus server, convertincus client certificate into importable format and import it into
browser.
For example this produces client.pfx in Windows-compatible format:
openssl pkcs12 -clcerts -inkey client.key -in client.crt -export -out client.pfxAfter that, opening https://127.0.0.1:8443/1.0 should work as expected.
Profiling `incusd`
The Go pprof profiles of incusd are available in two ways:
- Setting
core.debug_addressstarts a plain HTTP listener serving them under/debug/pprof/.
It has no authentication, so only bind it to a trusted address. - The API serves the same profiles under
/internal/debug/pprof/on every listener, restricted to clients allowed to administer the server.
This works at any time, over HTTPS, without changing the server configuration.
For example, to save the heap profile of a remote server through the incus client and open it locally:
incus query --raw my-remote:/internal/debug/pprof/heap > heap.pprof
go tool pprof heap.pprofThe upstream pprof tool can also fetch the profiles directly with the client certificate (go tool pprof doesn't support client certificates):
pprof -tls_cert ~/.config/incus/client.crt -tls_key ~/.config/incus/client.key "https+insecure://192.0.2.10:8443/internal/debug/pprof/profile?seconds=30"Debug the Incus database
The files of the global {ref}database <database> are stored under the ./database/global
sub-directory of your Incus data directory (/var/lib/incus/database/global).
Since each member of the cluster also needs to keep some data which is specific
to that member, Incus also uses a plain SQLite database (the "local" database),
which you can find in ./database/local.db.
Backups of the global database directory and of the local database file are made
before upgrades, and are tagged with the .bak suffix. You can use those if
you need to revert the state as it was before the upgrade.
Dumping the database content or schema
If you want to get a SQL text dump of the content or the schema of the databases,
use the incus admin sql <local|global> [.dump|.schema] command, which produces the
equivalent output of the .dump or .schema directives of the sqlite3
command line tool.
Running custom queries from the console
If you need to perform SQL queries (e.g. SELECT, INSERT, UPDATE)
against the local or global database, you can use the incus admin sql command (runincus admin sql --help for details).
You should only need to do that in order to recover from broken updates or bugs.
Please consult the Incus team first (creating a GitHub
issue or
forum post).
Running custom queries at Incus daemon startup
In case the Incus daemon fails to start after an upgrade because of SQL data
migration bugs or similar problems, it's possible to recover the situation by
creating .sql files containing queries that repair the broken update.
To perform repairs against the local database, write a./database/patch.local.sql file containing the relevant queries, and
similarly a ./database/patch.global.sql for global database repairs.
Those files will be loaded very early in the daemon startup sequence and deleted
if the queries were successful (if they fail, no state will change as they are
run in a SQL transaction).
As above, please consult the Incus team first.
Syncing the cluster database to disk
If you want to flush the content of the cluster database to disk, use the incus admin sql global .sync command, that will write a plain SQLite database file into./database/global/db.bin, which you can then inspect with the sqlite3
command line tool.
Doc Dev Incus (`doc/dev-incus.md`)
(dev-incus)=
Communication between instance and host
Communication between the hosted workload (instance) and its host while
not strictly needed is a pretty useful feature.
In Incus, this feature is implemented through a /dev/incus/sock node which is
created and set up for all Incus instances.
This file is a Unix socket which processes inside the instance can
connect to. It's multi-threaded so multiple clients can be connected at the
same time.
{config:option}`instance-security:security.guestapi` must be set to `true` (which is the default) for an instance to allow access to the socket.Implementation details
Incus on the host binds /var/lib/incus/guestapi/sock and starts listening for new
connections on it.
This socket is then exposed into every single instance started by
Incus at /dev/incus/sock.
The single socket is required so we can exceed 4096 instances, otherwise,
Incus would have to bind a different socket for every instance, quickly
reaching the FD limit.
Authentication
Queries on /dev/incus/sock will only return information related to the
requesting instance. To figure out where a request comes from, Incus will
extract the initial socket's user credentials and compare that to the list of
instances it manages.
Protocol
The protocol on /dev/incus/sock is plain-text HTTP with JSON messaging, so very
similar to the local version of the Incus protocol.
Unlike the main Incus API, there is no background operation and no
authentication support in the /dev/incus/sock API.
REST-API
API structure
//1.0/1.0/config/1.0/config/{key}
/1.0/devices/1.0/events/1.0/images/{fingerprint}/export/1.0/meta-data
API details
`/`
GET
- Description: List of supported APIs
- Return: list of supported API endpoint URLs (by default
['/1.0'])
Return value:
[
"/1.0"
]`/1.0`
GET
- Description: Information about the 1.0 API
- Return: JSON object
Return value:
{
"api_version": "1.0",
"location": "foo.example.com",
"instance_type": "container",
"state": "Started",
}PATCH
- Description: Update instance state (valid states are
ReadyandStarted) - Return: none
Input:
{
"state": "Ready"
}`/1.0/config`
GET
- Description: List of configuration keys
- Return: list of configuration keys URL
Note that the configuration key names match those in the instance
configuration, however not all configuration namespaces will be exported to/dev/incus/sock.
Currently only the cloud-init.* and user.* keys are accessible to the instance.
At this time, there also aren't any instance-writable namespace.
Return value:
[
"/1.0/config/user.a"
]`/1.0/config/`
GET
- Description: Value of that key
- Return: Plain-text value
Return value:
blah`/1.0/devices`
GET
- Description: Map of instance devices
- Return: JSON object
Return value:
{
"eth0": {
"name": "eth0",
"network": "incusbr0",
"type": "nic"
},
"root": {
"path": "/",
"pool": "default",
"type": "disk"
}
}`/1.0/events`
GET
- Description: WebSocket upgrade
- Return: none (never ending flow of events)
Supported arguments are:
- type: comma-separated list of notifications to subscribe to (defaults to all)
The notification types are:
config(changes to any of theuser.*configuration keys)device(any device addition, change or removal)
This never returns. Each notification is sent as a separate JSON object:
{
"timestamp": "2017-12-21T18:28:26.846603815-05:00",
"type": "device",
"metadata": {
"name": "kvm",
"action": "added",
"config": {
"type": "unix-char",
"path": "/dev/kvm"
}
}
}{
"timestamp": "2017-12-21T18:28:26.846603815-05:00",
"type": "config",
"metadata": {
"key": "user.foo",
"old_value": "",
"value": "bar"
}
}`/1.0/images//export`
GET
- Description: Download a public/cached image from the host
- Return: raw image or error
- Access: Requires
security.guestapi.imagesset totrue
Return value:
See /1.0/images/<FINGERPRINT>/export in the daemon API.`/1.0/meta-data`
GET
- Description: Container meta-data compatible with cloud-init
- Return: cloud-init meta-data
Return value:
#cloud-config
instance-id: af6a01c7-f847-4688-a2a4-37fddd744625
local-hostname: abcDoc Doc Cheat Sheet (`doc/doc-cheat-sheet.md`)
orphan: true
nosearch: true
myst:
substitutions:
reuse_key: "This is included text."
advanced_reuse_key: "This is a substitution that includes a code block:
code block "
Documentation cheat sheet
The documentation files use a mixture of Markdown and MyST syntax.
See the following sections for syntax help and conventions.
Headings
:header-rows: 1
* - Input
- Description
* - `# Title`
- Page title and H1 heading
* - `## Heading`
- H2 heading
* - `### Heading`
- H3 heading
* - `#### Heading`
- H4 heading
* - ...
- Further headingsAdhere to the following conventions:
- Do not use consecutive headings without intervening text.
- Use sentence style for headings (capitalize only the first word).
- Do not skip levels (for example, always follow an H2 with an H3, not an H4).
Inline formatting
:header-rows: 1
* - Input
- Output
* - `` {guilabel}`UI element` ``
- {guilabel}`UI element`
* - `` `code` ``
- `code`
* - `` {command}`command` ``
- {command}`command`
* - `*Italic*`
- *Italic*
* - `**Bold**`
- **Bold**Adhere to the following conventions:
- Use italics sparingly. Common uses for italics are titles and names (for example, when referring to a section title that you cannot link to, or when introducing the name for a concept).
- Use bold sparingly. A common use for bold is UI elements ("Click OK"). Avoid using bold for emphasis and rather rewrite the sentence to get your point across.
Code blocks
Start and end a code block with three back ticks:
```You can specify the code language after the back ticks to enforce a specific lexer, but in many cases, the default lexer works just fine.
:header-rows: 1
* - Input
- Output
* - ````
```
# Demonstrate a code block
code:
- example: true
```
````
- ```
# Demonstrate a code block
code:
- example: true
```
* - ````
```yaml
# Demonstrate a code block
code:
- example: true
```
````
- ```yaml
# Demonstrate a code block
code:
- example: true
```To include back ticks in a code block, increase the number of surrounding back ticks:
:header-rows: 1
* - Input
- Output
* -
`````
````
```
````
`````
-
````
```
````Links
How to link depends on if you are linking to an external URL or to another page in the documentation.
External links
For external links, use only the URL, or Markdown syntax if you want to override the link text.
:header-rows: 1
* - Input
- Output
* - `https://linuxcontainers.org/incus`
- [{spellexception}`https://linuxcontainers.org/incus`](https://linuxcontainers.org/incus)
* - `[Incus](https://linuxcontainers.org/incus)`
- [Incus](https://linuxcontainers.org/incus)To display a URL as text and prevent it from being linked, add a <span></span>:
:header-rows: 1
* - Input
- Output
* - `https://linuxcontainers.org/incus`
- {spellexception}`https://linuxcontainers.org/incus`Internal references
For internal references, both Markdown and MyST syntax are supported. In most cases, you should use MyST syntax though, because it resolves the link text automatically and gives an indication of the link in GitHub rendering.
Referencing a page
To reference a documentation page, use MyST syntax to automatically extract the link text. When overriding the link text, use Markdown syntax.
:header-rows: 1
* - Input
- Output
- Output on GitHub
- Status
* - `` {doc}`index` ``
- {doc}`index`
- {doc}`index`
- Preferred.
* - `[](index)`
- [](index)
-
- Do not use.
* - `[Incus documentation](index)`
- [Incus documentation](index)
- [Incus documentation](index)
- Preferred when overriding the link text.
* - `` {doc}`Incus documentation ` ``
- {doc}`Incus documentation `
- {doc}`Incus documentation `
- Alternative when overriding the link text.Adhere to the following conventions:
- Override the link text only when it is necessary. If you can use the document title as link text, do so, because the text will then update automatically if the title changes.
- Never "override" the link text with the same text that would be generated automatically.
(a_section_target)=
Referencing a section
To reference a section within the documentation (on the same page or on another page), you can either add a target to it and reference that target, or you can use an automatically generated anchor in combination with the file name.
Adhere to the following conventions:
- Add targets for sections that are central and a "typical" place to link to, so you expect they will be linked frequently. For "one-off" links, you can use the automatically generated anchors.
- Override the link text only when it is necessary. If you can use the section title as link text, do so, because the text will then update automatically if the title changes.
- Never "override" the link text with the same text that would be generated automatically.
Using a target
You can add targets at any place in the documentation. However, if there is no heading or title for the targeted element, you must specify a link text.
(a_random_target)=
:header-rows: 1
* - Input
- Output
- Output on GitHub
- Description
* - `(target_ID)=`
-
- \(target_ID\)=
- Adds the target ``target_ID``.
* - `` {ref}`a_section_target` ``
- {ref}`a_section_target`
- \{ref\}`a_section_target`
- References a target that has a title.
* - `` {ref}`link text <a_random_target>` ``
- {ref}`link text <a_random_target>`
- \{ref\}`link text <a_random_target>`
- References a target and specifies a title.
* - ``[`option name\](a_random_target)``
- [`option name`](a_random_target)
- [`option name`](a_random_target) (link is broken)
- Use Markdown syntax if you need markup on the link text.Using an automatically generated anchor
You must use Markdown syntax to use automatically generated anchors.
You can leave out the file name when linking within the same file.
:header-rows: 1
* - Input
- Output
- Output on GitHub
- Description
* - `[](#referencing-a-section)`
- [](#referencing-a-section)
-
- Do not use.
* - `[link text](#referencing-a-section)`
- [link text](#referencing-a-section)
- [link text](#referencing-a-section)
- Preferred when overriding the link text.Navigation
Every documentation page must be included as a subpage to another page in the navigation.
This is achieved with the toctree directive in the parent page:
```{toctree}
:hidden:
subpage1
subpage2
```If a page should not be included in the navigation, you can suppress the resulting build warning by putting the following instruction at the top of the file:
---
orphan: true
---Use orphan pages sparingly and only if there is a clear reason for it.
Lists
:header-rows: 1
* - Input
- Output
* - ```
- Item 1
- Item 2
- Item 3
```
- - Item 1
- Item 2
- Item 3
* - ```
1. Step 1
1. Step 2
1. Step 3
```
- 1. Step 1
1. Step 2
1. Step 3
* - ```
1. Step 1
- Item 1
* Subitem
- Item 2
1. Step 2
1. Substep 1
1. Substep 2
```
- 1. Step 1
- Item 1
* Subitem
- Item 2
1. Step 2
1. Substep 1
1. Substep 2Adhere to the following conventions:
- In numbered lists, use
1.for all items to generate the step numbers automatically. - Use
-for unordered lists. When using nested lists, you can use*for the nested level.
Definition lists
:header-rows: 1
* - Input
- Output
* - ```
Term 1
: Definition
Term 2
: Definition
```
- Term 1
: Definition
Term 2
: DefinitionTables
You can use standard Markdown tables. However, using the rST list table syntax is usually much easier.
Both markups result in the following output:
:header-rows: 1
* - Header 1
- Header 2
* - Cell 1
Second paragraph cell 1
- Cell 2
* - Cell 3
- Cell 4Markdown tables
| Header 1 | Header 2 |
|------------------------------------|----------|
| Cell 12nd paragraph cell 1 | Cell 2 |
| Cell 3 | Cell 4 |List tables
```{list-table}
:header-rows: 1
* - Header 1
- Header 2
* - Cell 1
2nd paragraph cell 1
- Cell 2
* - Cell 3
- Cell 4
```Notes
:header-rows: 1
* - Input
- Output
* - ````
```{note}
A note.
```
````
- ```{note}
A note.
```
* - ````
```{tip}
A tip.
```
````
- ```{tip}
A tip.
```
* - ````
```{important}
Important information
```
````
- ```{important}
Important information.
```
* - ````
```{caution}
This might damage your hardware!
```
````
- ```{caution}
This might damage your hardware!
```Adhere to the following conventions:
- Use notes sparingly.
- Only use the following note types:
note,tip,important,caution - Only use a caution if there is a clear hazard of hardware damage or data loss.
Images
:header-rows: 1
* - Input
- Output
* - ```
```
-
* - ````
```{figure} https://linuxcontainers.org/incus/docs/main/_static/tag.png
:width: 100px
:alt: Alt text
Figure caption
```
````
- ```{figure} https://linuxcontainers.org/incus/docs/main/_static/tag.png
:width: 100px
:alt: Alt text
Figure caption
```Adhere to the following conventions:
- For pictures in the
docdirectory, start the path with/(for example,/images/image.png). - Use PNG format for screenshots and SVG format for graphics.
Reuse
A big advantage of MyST in comparison to plain Markdown is that it allows to reuse content.
Substitution
To reuse sentences or paragraphs without too much markup and special formatting, use substitutions.
Substitutions can be defined in the following locations:
In the
substitutions.yamlfile. Substitutions defined in this file are available in all documentation pages.At the top of a single file in the following format:
text--- myst: substitutions: reuse_key: "This is **included** text." advanced_reuse_key: "This is a substitution that includes a code block: ``` code block ```" ---
You can combine both options by defining a default substitution in reuse/substitutions.py and overriding it at the top of a file.
:header-rows: 1
* - Input
- Output
* - `{{reuse_key}}`
- {{reuse_key}}
* - `{{advanced_reuse_key}}`
- {{advanced_reuse_key}}Adhere to the following convention:
- Substitutions do not work on GitHub. Therefore, use key names that indicate the included text (for example,
note_not_supportedinstead ofreuse_note).
File inclusion
To reuse longer sections or text with more advanced markup, you can put the content in a separate file and include the file or parts of the file in several locations.
You cannot put any targets into the content that is being reused (because references to this target would be ambiguous then). You can, however, put a target right before including the file.
By combining file inclusion and substitutions, you can even replace parts of the included text.
:header-rows: 1
* - Input
- Output
* - ````
% Include parts of the content from file [../README.md](../README.md)
```{include} ../README.md
:start-after:
:end-before:
```
````
-
% Include parts of the content from file [../README.md](../README.md)
```{include} ../README.md
:start-after:
:end-before:
```Adhere to the following convention:
- File inclusion does not work on GitHub. Therefore, always add a comment linking to the included file.
- To select parts of the text, add HTML comments for the start and end points and use
:start-after:and:end-before:, if possible. You can combine:start-after:and:end-before:with:start-line:and:end-line:if required. Using only:start-line:and:end-line:is error-prone though.
Tabs
:header-rows: 1
* - Input
- Output
* - `````
````{tabs}
```{group-tab} Tab 1
Content Tab 1
```
```{group-tab} Tab 2
Content Tab 2
```
````
`````
- ````{tabs}
```{group-tab} Tab 1
Content Tab 1
```
```{group-tab} Tab 2
Content Tab 2
```
````Collapsible sections
There is no support for details sections in rST, but you can insert HTML to create them.
:header-rows: 1
* - Input
- Output
* - ```
<details>
<summary>Details</summary>
Content
</details>
```
-
Details
ContentGlossary
You can define glossary terms in any file. Ideally, all terms should be collected in one glossary file though, and they can then be referenced from any file.
:header-rows: 1
* - Input
- Output
* - ````
```{glossary}
example term
Definition of the example term.
```
````
- ```{glossary}
example term
Definition of the example term.
```
* - ``{term}`example term` ``
- {term}`example term`More useful markup
:header-rows: 1
* - Input
- Output
* - ````
```{versionadded} X.Y
```
````
- ```{versionadded} X.Y
```
* - `` {abbr}`API (Application Programming Interface)` ``
- {abbr}`API (Application Programming Interface)`Custom extensions
The documentation uses some custom extensions.
Related links
You can add links to related websites to the sidebar by adding the following field at the top of the page:
relatedlinks: https://github.com/canonical/lxd-sphinx-extensions, [RTFM](https://www.google.com)To override the title, use Markdown syntax. Note that spaces are ignored; if you need spaces in the title, replace them with  , and include the value in quotes if Sphinx complains about the metadata value because it starts with [.
To add a link to a Discourse topic, add the following field at the top of the page (where 12345 is the ID of the Discourse topic):
discourse: 12345YouTube links
To add a link to a YouTube video, use the following directive:
:header-rows: 1
* - Input
- Output
* - ````
```{youtube} https://www.youtube.com/watch?v=iMLiK1fX4I0
:title: Demo
```
````
- ```{youtube} https://www.youtube.com/watch?v=iMLiK1fX4I0
:title: Demo
```The video title is extracted automatically and displayed when hovering over the link.
To override the title, add the :title: option.
Spelling exceptions
If you need to use a word that does not comply to the spelling conventions, but is correct in a certain context, you can exempt it from the spelling checker by surrounding it with {spellexception}.
:header-rows: 1
* - Input
- Output
* - `` {spellexception}`PurposelyWrong` ``
- {spellexception}`PurposelyWrong`Terminal output
To show a terminal view with commands and output, use the following directive:
:header-rows: 1
* - Input
- Output
* - ````
```{terminal}
:input: command number one
:user: root
:host: vm
output line one
output line two
:input: another command
more output
```
````
- ```{terminal}
:input: command number one
:user: root
:host: vm
output line one
output line two
:input: another command
more output
```Input is specified as the :input: option (or prefixed with :input: as part of the main content of the directive).
Output is the main content of the directive.
To override the prompt (user@host:~$ by default), specify the :user: and/or :host: options.
To make the terminal scroll horizontally instead of wrapping long lines, add :scroll:.
Doc Environment (`doc/environment.md`)
Environment variables
The Incus client and daemon respect some environment variables to adapt to
the user's environment and to turn some advanced features on and off.
Common
| Name | Description |
|---|---|
INCUS_DIR |
The Incus data directory |
INCUS_INSECURE_TLS |
If set to true, allows all default Go ciphers both for client <-> server communication and server <-> image servers (server <-> server and clustering are not affected) |
PATH |
List of paths to look into when resolving binaries |
http_proxy |
Proxy server URL for HTTP |
https_proxy |
Proxy server URL for HTTPS |
no_proxy |
List of domains, IP addresses or CIDR ranges that don't require the use of a proxy |
Client environment variable
| Name | Description |
|---|---|
EDITOR |
What text editor to use |
INCUS_CONF |
Path to the client configuration directory |
INCUS_GLOBAL_CONF |
Path to the global client configuration directory |
INCUS_PROJECT |
Name of the project to use (overrides configured default project) |
INCUS_REMOTE |
Name of the remote to use (overrides configured default remote) |
VISUAL |
What text editor to use (if EDITOR isn't set) |
Server environment variable
| Name | Description |
|---|---|
INCUS_AGENT_PATH |
Path to the directory including the incus-agent builds |
INCUS_CLUSTER_UPDATE |
Script to call on a cluster update |
INCUS_DEVMONITOR_DIR |
Path to be monitored by the device monitor. This is primarily for testing |
INCUS_DOCUMENTATION |
Path to the documentation to serve through the web server |
INCUS_EDK2_PATH |
Path to EDK2 firmware build including *_CODE.fd and *_VARS.fd |
INCUS_EXEC_PATH |
Full path to the Incus binary (used when forking subcommands) |
INCUS_IDMAPPED_MOUNTS_DISABLE |
Disable idmapped mounts support (useful when testing traditional UID shifting) |
INCUS_LXC_TEMPLATE_CONFIG |
Path to the LXC template configuration directory |
INCUS_SECURITY_APPARMOR |
If set to false, forces AppArmor off |
INCUS_SECURITY_SELINUX |
If set to true, turns on SELinux integration |
INCUS_SKIP_INSTANCE_TYPES |
If set to true, skip downloading instance type definitions |
INCUS_UI |
Path to the web UI to serve through the web server |
INCUS_USBIDS_PATH |
Path to the hwdata usb.ids file |
Doc Events (`doc/events.md`)
Events
Introduction
Events are messages about actions that have occurred over Incus. Using the API endpoint /1.0/events directly or viaincus monitor will connect to a WebSocket through which logs and life-cycle messages will be streamed.
Event types
Incus Currently supports three event types.
logging: Shows all logging messages regardless of the server logging level.operation: Shows all ongoing operations from creation to completion (including updates to their state and progress metadata).lifecycle: Shows an audit trail for specific actions occurring over Incus.
Event ordering
Events are delivered to each listener in the order that Incus generated them.
A listener that cannot keep up with the stream is disconnected rather than having events silently skipped. After
reconnecting, anything being tracked from the event stream should be re-fetched, as the events that occurred while
disconnected are not resent.
When using the Go client, handlers registered through AddHandler are called concurrently and may therefore observe
events out of order. Use AddChannel instead to receive the events on a channel, which delivers them one at a time and
in the order they arrived, and is closed once the listener ends. Its size argument sets how far behind the reader may
fall before the listener is dropped.
Event structure
Example
location: cluster_name
metadata:
action: network-updated
requestor:
protocol: unix
username: root
source: /1.0/networks/incusbr0
timestamp: "2021-03-14T00:00:00Z"
type: lifecyclelocation: The cluster member name (if clustered).timestamp: Time that the event occurred in RFC3339 format.type: The type of event this is (one oflogging,operation, orlifecycle).metadata: Information about the specific event type.
Logging event structure
message: The log message.level: The log-level of the log.context: Additional information included in the event.
Operation event structure
id: The UUID of the operation.class: The type of operation (task,token, orwebsocket).description: A description of the operation.created_at: The operation's creation date.updated_at: The operation's date of last change.status: The current state of the operation.status_code: The operation status code.resources: Resources affected by this operation.metadata: Operation specific metadata.may_cancel: Whether the operation may be canceled.err: Error message of the operation.location: The cluster member name (if clustered).
Life-cycle event structure
action: The life-cycle action that occurred.requestor: Information about who is making the request (if applicable).source: Path to what is being acted upon.context: Additional information included in the event.
Supported life-cycle events
| Name | Description | Additional Information |
|---|---|---|
certificate-created |
A new certificate has been added to the server trust store. | |
certificate-deleted |
The certificate has been deleted from the trust store. | |
certificate-updated |
The certificate's configuration has been updated. | |
cluster-certificate-updated |
The certificate for the whole cluster has changed. | |
cluster-disabled |
Clustering has been disabled for this machine. | |
cluster-enabled |
Clustering has been enabled for this machine. | |
cluster-group-created |
A new cluster group has been created. | |
cluster-group-deleted |
A cluster group has been deleted. | |
cluster-group-renamed |
A cluster group has been renamed. | |
cluster-group-updated |
A cluster group has been updated. | |
cluster-member-added |
A new machine has joined the cluster. | |
cluster-member-removed |
The cluster member has been removed from the cluster. | |
cluster-member-renamed |
The cluster member has been renamed. | old_name: the previous name. |
cluster-member-updated |
The cluster member's configuration been edited. | |
cluster-token-created |
A join token for adding a cluster member has been created. | |
config-updated |
The server configuration has changed. | |
image-alias-created |
An alias has been created for an existing image. | target: the original instance. |
image-alias-deleted |
An alias has been deleted for an existing image. | target: the original instance. |
image-alias-renamed |
The alias for an existing image has been renamed. | old_name: the previous name. |
image-alias-updated |
The configuration for an image alias has changed. | target: the original instance. |
instance-agent-started |
The instance agent has connected to the host. | |
instance-agent-stopped |
The instance agent has disconnected from the host. | |
image-created |
A new image has been added to the image store. | type: container or vm. |
image-deleted |
The image has been deleted from the image store. | |
image-refreshed |
The local image copy has updated to the current source image version. | |
image-retrieved |
The raw image file has been downloaded from the server. | target: destination server. |
image-secret-created |
A one-time key to fetch this image has been created. | |
image-updated |
The image's configuration has changed. | |
instance-backup-created |
A backup of the instance has been created. | |
instance-backup-deleted |
The instance backup has been deleted. | |
instance-backup-renamed |
The instance backup has been renamed. | old_name: the previous name. |
instance-backup-retrieved |
The raw instance backup file has been downloaded. | |
instance-console |
Connected to the console of the instance. | type: console or vga. |
instance-console-reset |
The console buffer has been reset. | |
instance-console-retrieved |
The console log has been downloaded. | |
instance-created |
A new instance has been created. | |
instance-deleted |
The instance has been deleted. | |
instance-exec |
A command has been executed on the instance. | command: the command to be executed. |
instance-file-deleted |
A file on the instance has been deleted. | file: path to the file. |
instance-file-pushed |
The file has been pushed to the instance. | file-source: local file path. file-destination: destination file path. info: file information. |
instance-file-retrieved |
The file has been downloaded from the instance. | file-source: instance file path. file-destination: destination file path. |
instance-log-deleted |
The instance's specified log file has been deleted. | |
instance-log-retrieved |
The instance's specified log file has been downloaded. | |
instance-metadata-retrieved |
The instance's image metadata has been downloaded. | |
instance-metadata-template-created |
A new image template file for the instance has been created. | path: relative file path. |
instance-metadata-template-deleted |
The image template file for the instance has been deleted. | path: relative file path. |
instance-metadata-template-retrieved |
The image template file for the instance has been downloaded. | path: relative file path. |
instance-metadata-updated |
The instance's image metadata has changed. | |
instance-migrated |
The instance has been migrated. | |
instance-paused |
The instance has been put in a paused state. | |
instance-ready |
The instance is ready. | |
instance-renamed |
The instance has been renamed. | old_name: the previous name. |
instance-restarted |
The instance has restarted. | |
instance-restored |
The instance has been restored from a snapshot. | snapshot: name of the snapshot being restored. |
instance-resumed |
The instance has resumed after being paused. | |
instance-shutdown |
The instance has shut down. | |
instance-snapshot-created |
A snapshot of the instance has been created. | |
instance-snapshot-deleted |
The instance snapshot has been deleted. | |
instance-snapshot-renamed |
The instance snapshot has been renamed. | old_name: the previous name. |
instance-snapshot-updated |
The instance snapshot's configuration has changed. | |
instance-started |
The instance has started. | |
instance-stopped |
The instance has stopped. | |
instance-updated |
The instance's configuration has changed. | |
network-acl-created |
A new network ACL has been created. | |
network-acl-deleted |
The network ACL has been deleted. | |
network-acl-renamed |
The network ACL has been renamed. | old_name: the previous name. |
network-acl-updated |
The network ACL configuration has changed. | |
network-created |
A network device has been created. | |
network-deleted |
The network device has been deleted. | |
network-forward-created |
A new network forward has been created. | |
network-forward-deleted |
The network forward has been deleted. | |
network-forward-updated |
The network forward has been updated. | |
network-load-balancer-created |
A new network load balancer has been created. | |
network-load-balancer-deleted |
The network load balancer has been deleted. | |
network-load-balancer-health-changed |
The network load balancer has gone healthy or unhealthy. | status: healthy or unhealthy. service_monitors: list of the backends' service monitor statuses. |
network-load-balancer-updated |
The network load balancer has been updated. | |
network-peer-created |
A new network peer has been created. | |
network-peer-deleted |
The network peer has been deleted. | |
network-peer-updated |
The network peer has been updated. | |
network-renamed |
The network device has been renamed. | old_name: the previous name. |
network-updated |
The network device's configuration has changed. | |
network-zone-created |
A new network zone has been created. | |
network-zone-deleted |
The network zone has been deleted. | |
network-zone-record-created |
A new network zone record has been created. | |
network-zone-record-deleted |
The network zone record has been deleted. | |
network-zone-record-updated |
The network zone record has been updated. | |
network-zone-updated |
The network zone has been updated. | |
operation-cancelled |
The operation has been canceled. | |
profile-created |
A new profile has been created. | |
profile-deleted |
The profile has been deleted. | |
profile-renamed |
The profile has been renamed . | old_name: the previous name. |
profile-updated |
The profile's configuration has changed. | |
project-created |
A new project has been created. | |
project-deleted |
The project has been deleted. | |
project-renamed |
The project has been renamed. | old_name: the previous name. |
project-updated |
The project's configuration has changed. | |
storage-pool-created |
A new storage pool has been created. | target: cluster member name. |
storage-pool-deleted |
The storage pool has been deleted. | |
storage-pool-updated |
The storage pool's configuration has changed. | target: cluster member name. |
storage-volume-backup-created |
A new backup for the storage volume has been created. | type: container, virtual-machine, image, or custom. |
storage-volume-backup-deleted |
The storage volume's backup has been deleted. | |
storage-volume-backup-renamed |
The storage volume's backup has been renamed. | old_name: the previous name. |
storage-volume-backup-retrieved |
The storage volume's backup has been downloaded. | |
storage-volume-created |
A new storage volume has been created. | type: container, virtual-machine, image, or custom. |
storage-volume-deleted |
The storage volume has been deleted. | |
storage-volume-renamed |
The storage volume has been renamed. | old_name: the previous name. |
storage-volume-restored |
The storage volume has been restored from a snapshot. | snapshot: name of the snapshot being restored. |
storage-volume-snapshot-created |
A new storage volume snapshot has been created. | type: container, virtual-machine, image, or custom. |
storage-volume-snapshot-deleted |
The storage volume's snapshot has been deleted. | |
storage-volume-snapshot-renamed |
The storage volume's snapshot has been renamed. | old_name: the previous name. |
storage-volume-snapshot-updated |
The configuration for the storage volume's snapshot has changed. | |
storage-volume-updated |
The storage volume's configuration has changed. | |
warning-acknowledged |
The warning's status has been set to "acknowledged". | |
warning-deleted |
The warning has been deleted. | |
warning-reset |
The warning's status has been set to "new". |
Doc External Resources (`doc/external_resources.md`)
External resources
:maxdepth: 1
Project repository <https://github.com/lxc/incus>
Image server <https://images.linuxcontainers.org>
Third party toolsDoc Faq (`doc/faq.md`)
Frequently asked questions
The following sections give answers to frequently asked questions.
They explain how to resolve common issues and point you to more detailed information.
Why do my instances not have network access?
Most likely, your firewall blocks network access for your instances.
See {ref}network-bridge-firewall for more information about the problem and how to fix it.
Another frequent reason for connectivity issues is running Incus and Docker on the same host.
See {ref}network-incus-docker for instructions on how to fix such issues.
How to enable the Incus server for remote access?
By default, the Incus server is not accessible from the network, because it only listens on a local Unix socket.
You can enable it for remote access by following the instructions in {ref}server-expose.
When I do a `incus remote add`, it asks for a token?
To be able to access the re