Incus: The New LXD -- Installation & Demo

LXD Containers & VM’s are now maintained and supported by Canonical. Incus is a new fork of LXD that is maintained and supported out of

Although Incus is only v0.1, my video shows the basics of how to install and use it.

Incus is the name of the “anvil” for the middle of three small bones in the middle ear. The incus transmits vibrations from the malleus to the stapes. The vibrations then move to the inner ear. I believe that the naming of “Incus” may relate to the project “listening” to what the end users want.

LXD is a great project, but has become more Canonical centric in the past few years. Incus will be branching out in coming years to become more Distro agnostic.

Stéphane Grabler, project leader of Linux Containers, has developed release notes for Incus which I discuss in the video.

The documentation page for Incus is here.

To install Incus, begin by becoming root:

sudo su

Download the public key for the Incus package installation:

curl -fsSL -o /etc/apt/keyrings/zabbly.asc

Add the Incus repository to your system using the public key we just downloaded:

sh -c 'cat <<EOF > /etc/apt/sources.list.d/zabbly-incus-stable.sources
Enabled: yes
Types: deb
Suites: $(. /etc/os-release && echo ${VERSION_CODENAME})
Components: main
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/zabbly.asc

Exit root and go back to an account that is granted “sudo”, but not running as root.


Update the repository cache and install Incus:

sudo apt update
sudo apt install incus

Incus uses two Linux groups for administration. There is the “incus” group for users to add and manage containers and the “incus-admin” group for administrators to perform management functions on Incus such as performing initial setup and editing device profiles.

Here I am granting my “scott” account “incus-admin” privilege without having to logoff and back in:

sudo adduser scott incus-admin
newgrp incus-admin   

Initialize Incus (similar to “lxd init”):

incus admin init

In the answers to the dialogue above, I chose my storage pool name to be “incus-default” because I have LXD running on the same system and it has a storage pool named “default”. I also had to change the bound management port to 8445 for incus since port 8443 was being used for LXD.

Notice that the init dialogue did not include a question for what type of storage pool I wanted. In LXD I would have chosen a zfs pool. Right now this dialogue creates a “dir” storage pool for Incus.

Creating a container and starting it is easy as in LXD:

incus launch images:ubuntu/22.04 incus1 -c boot.autostart=true

To create a container without starting it:

incus create images:ubuntu/22.04 incus2 -c boot.autostart=true

In my example in the video, I imported a Heimdall container which I had exported from LXD. To do so, I needed to have a “Bridged-MAIN” profile which offers the container on my LAN since that profile is used by the Heimdall container in LXD.

Create and configure the profile in incus:

incus profile create Bridged-MAIN
incus profile device add Bridged-MAIN eth0 nic nictype=bridged parent=bridge0

Import the Heimdall container that was previously exported from LXD and start it. NOTE: The container will use the same MAC address as it did in LXD and so DHCP will choose the same TCP/IP address:

incus import Heimdall.tar.gz Heimdall
incus start Heimdall

You can also start another container using the “Bridged-MAIN” profile:

incus create images:ubuntu/22.04 incus3 -c boot.autostart=true --profile default --profile Bridged-MAIN

You can list all of your incus containers:

incus list

As of LXD 5.18 and Incus 0.1, most of the commands are identical across both projects except for the incus keyword for the most part. Exceptions are the “incus admin” and “incus snapshot” commands. Expect this to diverge in the future and what I have documented here is the current state as of October 2023.

As of now, Incus cannot be managed in LXDWare LXD Dashboard. I wrote to Matthew Penning (LXD Dashboard developer) on October 11, 2023 asking if it would be possible to add Incus support.

As of now, Incus is very new and I would not use it for production. Consider creating a virtual machine and installing incus inside of it to test as I have done. There is also a “lxd-to-incus” migration tool which I will probably cover at some time in the future. For right now, exporting a LXD container and importing it to incus works fine as long as you have the same profiles.