Why Was Incus Created, and Why Should You Consider Switching?
If you have worked with Linux Containers (LXC), you are likely familiar with LXD. A major turning point occurred in mid-2023 when Canonical decided to bring LXD under exclusive corporate control and enforce a strict Contributor License Agreement (CLA). Shortly afterward, the original Linux Containers founding team forked the project to create Incus—a fully community-driven, independent alternative.
The standout advantage? Incus completely strips out Snap. You get a purely open-source daemon that installs directly via native package managers like APT, RPM, or Pacman, entirely free from Canonical’s ecosystem lock-in.
In my personal homelab, I run a Proxmox VE cluster managing a dozen VMs and containers. Proxmox offers a great Web UI for monitoring resource usage. However, when deploying edge servers, setting up CI/CD test runners, or working locally on an Arch Linux laptop, I need a much leaner CLI workflow. Incus delivers exactly that: lightning-fast container spin-ups combined with the flexibility to spin up full KVM virtual machines whenever isolation is required.
Under the Hood: How Does Incus Work?
Incus unifies two distinct virtualization technologies under a single management syntax:
- System Containers (LXC): Unlike Docker, which packages individual application processes (process containers), an Incus container runs as a complete operating system. It features its own
systemdinit system, manages cron jobs, and runs SSH daemons as usual, all while sharing the host kernel. Containers boot in less than 0.5 seconds and consume only 25–30MB of RAM at idle. - Micro-VMs (QEMU/KVM): Essential when you need a dedicated kernel. Common scenarios include loading custom kernel modules, testing different distributions, or running nested Docker engines without relaxing host security boundaries. Incus utilizes the same storage and network abstractions to control KVM virtual machines seamlessly.
Installing and Configuring Incus
1. Installing on Ubuntu and Debian via Zabbly
To avoid Snap entirely, install Incus using the Zabbly repository maintained directly by Stéphane Graber (Incus project lead). Follow these steps on Ubuntu 22.04 / 24.04 or Debian 12:
# 1. Install prerequisite packages
sudo apt update
sudo apt install -y curl ca-certificates
# 2. Add the Zabbly GPG key
sudo mkdir -p /etc/apt/keyrings/
sudo curl -fsSL https://pkgs.zabbly.com/key.asc -o /etc/apt/keyrings/zabbly.asc
# 3. Add the repository to APT sources
sudo sh -c 'cat <<EOF > /etc/apt/sources.list.d/zabbly-incus-stable.sources
Enabled: yes
Types: deb
URIs: https://pkgs.zabbly.com/incus/stable
Suites: $(. /etc/os-release && echo "${VERSION_CODENAME}")
Components: main
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/zabbly.asc
EOF'
# 4. Update package lists and install Incus
sudo apt update
sudo apt install -y incus incus-ui-canonical
# 5. Grant permissions to the current user (avoids running sudo repeatedly)
sudo adduser $USER incus-admin
newgrp incus-admin
2. Initial Setup with incus admin init
Launch the interactive configuration wizard to configure storage pools and network bridges:
incus admin init
When the wizard prompts you to select a storage backend, consider two common setups:
- Dedicated disk or partition: Opt for ZFS or Btrfs. Their Copy-on-Write capabilities allow you to clone containers or create 10GB snapshots in under a second without consuming additional disk space immediately.
- Single root partition: Choose dir for simplicity. Note that cloning and snapshot operations will be considerably slower since the system must copy files individually.
3. Launching Your First System Container
Incus pulls images directly from the official Linux Containers image server (images:). It hosts pre-built images for virtually every distribution: Alpine, Debian, Ubuntu, Rocky Linux, Arch Linux, and more.
# Launch a Debian 12 container
incus launch images:debian/12 debian-box
# Check instance status and bridge-assigned IP
incus list
# Open an interactive shell inside the container
incus exec debian-box -- bash
4. Launching KVM Virtual Machines with the --vm Flag
Instead of manually editing verbose XML files in virsh or opening Virt-Manager, simply append the --vm flag to the standard launch command:
# Create an Ubuntu 24.04 VM with 2 vCPUs and 2GB RAM
incus launch images:ubuntu/24.04 dev-vm --vm -c limits.cpu=2 -c limits.memory=2GiB
# Verify running instances
incus list
Official Incus images include the incus-agent service by default. This allows you to run incus exec dev-vm -- bash to gain console access immediately without configuring VNC ports or serial consoles.
5. Three Practical Production Tips
Adjusting CPU and RAM Limits on the Fly
You can adjust resource constraints dynamically on running containers without service downtime:
# Cap resource usage to 1GB RAM and 2 CPU cores
incus config set debian-box limits.memory=1GiB
incus config set debian-box limits.cpu=2
Port Forwarding Without Modifying iptables
Incus provides built-in Layer 4 proxy devices that apply immediately without manual firewall configuration:
# Route host port 8080 directly to container port 80
incus config device add debian-box web-proxy proxy listen=tcp:0.0.0.0:8080 connect=tcp:127.0.0.1:80
Migrating from LXD to Incus
If your machine currently runs LXD via Snap, the project provides an automated tool for an in-place migration:
# Install the migration utility
sudo apt install -y lxd-to-incus
# Stop containers prior to migration, then run:
sudo lxd-to-incus
The script detects existing storage pools and network profiles, migrates your instances to the Incus daemon, and guides you through cleanly uninstalling LXD.
Summary
Incus steers the Linux Container ecosystem back to its core principles: lean, fast, and neutral. If you are looking to break free from Snap on Ubuntu or want a cohesive CLI to manage both LXC containers and KVM virtual machines on Linux, Incus is the most reliable, practical solution available today.

