Installing Incus on a Raspberry Pi 5 running Raspberry Pi OS Lite

I have some confusion about getting up and running on a headless Raspberry Pi 5 running Raspberry Pi OS Lite.

After setting up the Raspberry Pi, updating packages, firmware etc. I proceeded to install incus.

Install install of Incus was like so, which involves me installing from debian’s repository, trying to run incus admin init but getting an error about elevation, so doing it with sudo, then discovering later I should have added the user to the group, so then trying to re-init in case I stuffed something up, which failed as the pool etc already existed, I also couldn’t figure out how to access the web UI, so I figured I was an older version, so then I removed incus, and installed it from the lts repo then the stable repo.

   10  2025-12-04 04:09:23 sudo apt install incus
   11  2025-12-04 04:11:46 incus admin init
   12  2025-12-04 04:11:53 sudo incus admin init
   13  2025-12-04 04:13:51 incus config show
   14  2025-12-04 04:13:56 sudo incus config show
   15  2025-12-04 04:14:29 sudo adduser $USER incus-admin
   16  2025-12-04 04:14:34 newgrp incus-admin
   17  2025-12-04 04:14:42 incus admin init
   18  2025-12-04 04:14:53 incus image list images:
   19  2025-12-04 04:20:43 incus
   20  2025-12-04 04:22:21 sudo apt install -y incus-ui-canonical
   21  2025-12-04 04:24:13 incus --version
   22  2025-12-04 04:24:51 incus admin
   23  2025-12-04 04:25:01 incus admin shutdown
   24  2025-12-04 04:25:07 sudo apt remove incus

The confusion around accessing the web UI continued, which was based around me thinking it was related to the incus webui command, which when my SSH port forwarding attempts there failed, as incus webui kept changing the port on me, I eventually figured out it that I wasn’t missing some package, and that incus wasn’t out of date, and that I didn’t stuff up the init process, and that the web UI isn’t a separate command (despite being a separate package) but that it is available via incus config set core.https_address :8443 then SSH forwarding 8443.

   66  2025-12-04 04:40:42 incus admin init
   67  2025-12-04 04:41:19 incus webui
   68  2025-12-04 04:41:28 exit
   69  2025-12-04 04:43:00 incus webui
   70  2025-12-04 04:43:07 exit
   71  2025-12-04 04:43:42 incus config set core.https_address :8443
   72  2025-12-04 04:43:45 incus webui
   73  2025-12-04 04:43:59 incus webui --help
   74  2025-12-04 04:44:09 incus --help
   75  2025-12-04 04:44:12 incus restart
   76  2025-12-04 04:44:26 incus admin
   77  2025-12-04 04:44:34 incus admin shutdown
   78  2025-12-04 04:44:45 incus webui
   79  2025-12-04 04:44:53 incus webui
   80  2025-12-04 04:44:56 incus webui --help
   81  2025-12-04 04:45:06 incus config
   82  2025-12-04 04:45:08 incus config edit
   83  2025-12-04 04:45:20 incus webui 8443
   84  2025-12-04 04:45:23 incus webui :8443
   85  2025-12-04 04:45:30 incus webui --help
   86  2025-12-04 04:45:45 incus webui localhost:8443
   87  2025-12-04 04:46:42 incus config set core.https_address :8443

However, I noticed that via the web UI, only the Dir storage pool was available. After some digging, I figured out how to install btrfs and zfs to get them to show up. However, I compared this to an old LXD instance I experimented with, and LXD has all the available storage pool drivers available…

I recall, but I could be incorrect as I no longer have the terminal history, that perhaps things like zfs and btrfs and qemu were installed with incus, but an uninstall removed them, and subsequent installs/reinstalls did not re-add them.

I noticed that doing sudo apt install incus would mention suggested and recommended packages:

Suggested packages:
  adwaita-icon-theme-legacy  incus-extra       libcuda1           cups-common   libfftw3-dev           opus-tools      xdg-utils   gstreamer1.0-plugins-ugly
  gvfs                       lego              libnvcuvid1        libdv-bin     libvisual-0.4-plugins  pipewire        lm-sensors  opencl-icd
  ceph-common                minio-client      libnvidia-encode1  oss-compat    gstreamer1.0-tools     pulseaudio      serdi       samba
  lvm2                       spice-client-gtk  libbluray-bdj      libdvdcss2    jackd2                 libraw1394-doc  sordi       vde2
  zfsutils-linux             | virt-viewer     colord             libfftw3-bin  liblcms2-utils         librsvg2-bin    speex       nvidia-vdpau-driver

Summary:
  Upgrading: 0, Installing: 263, Removing: 0, Not Upgrading: 2
  Download size: 64.5 MB / 221 MB
  Space needed: 1,260 MB / 50.3 GB available

So I tried sudo apt install --install-recommends –-install-suggest incus however that then wanted to install 4000 packages which would be 30GB, and still seems it was missing suggested btrfs packages:


Suggested packages:
  ceph-mgr-diskprediction-local  fruit                    gccxml                       libreoffice-grammarcheck-zu  osspd                   libapache2-mod-python
  cups-pdf                       libgsl2                  libclamunrar11               libreoffice-help-zu          pandoc-citeproc         python3-egenix-mxtexttools
  debtags                        heimdal-docs             libcommons-net-java-doc      mythes-zu                    wkhtmltopdf             rl-accel
  squid-deb-proxy-client         iceweasel                libgdal-doc                  gcj-jdk                      python                  rl-renderpm
  aufs-tools                     | icedove                libiodbc2-dev                unity-common                 w3-dtd-mathml           python-rpy-docs
  cgroupfs-mount                 | iceape-browser         libgoogle-gson-java-doc      doc-html-w3                  python3-breezy-dbg      python3-wxgtk3.0
  elpa-cider                     openoffice.org-hunspell  libhdf4-dev                  mh-e                         bpython3                | python3-wxgtk
  libtext-multimarkdown-perl     | openoffice.org-core    java-virtual-machine         cicero                       geoip-database-contrib  python3-mysql.connector
  php-codesniffer                iceape-browser           libhsqldb1.8.0-java-gcj      libmemcached                 libgdal20               python3-cx-oracle
  node-babel-eslint              | iceweasel              ooo2dbk                      qct                          python3-flup            gnome-codec-install
  zoo                            | icedove                rtf2xml                      openoffice.org               python3-sqlite          perlsgml
  pulseaudio                     autotrace                libscalar-number-perl        iceweasel                    etcd                    w3-recs
  hplip-cups                     radiance                 gpa                          icedove                      python-invoke-doc       haskell-mode
  foomatic-db-gutenprint         python3-uniconvertor     hunspell-dictionary-zu       audiooss                     python3-gobject         telepathy-haze
  libgeotiff-epsg                jack-tools               | myspell-dictionary-zu      iucode-tool                  python3-sip
  bbchess                        libsndio6.1              | libreoffice-spellcheck-zu  node-uglify-to-browserify    python-oracle-doc

Recommended packages:
  btrfs-tools  ceph-fuse  xul-ext-mozvoikko  hunspell-sv-se  wsdd  djtools  prover9  mongodb-server  libodbc1

Summary:
  Upgrading: 0, Installing: 4859, Removing: 0, Not Upgrading: 2
  Download size: 8,176 MB / 9,234 MB
  Space needed: 30.0 GB / 50.3 GB available

And turns out –-install-recommends is the default behavior.

So, I’m left wondering:

  1. Whether I stuffed up my distro install somehow, and somehow uninstalled things that shouldn’t have been, that for some reason are now requiring manual installation. My goal is to use Incus for instances, including that of docker containers, and including a nvme backed storage pool. Ideally to serve instances for Syncthing, Discourse, Ghost, and Fizzy.
  2. Whether LXD just bundles more packages than Incus
  3. How one actually installs suggested packages for Incus without installing the kitchen-sink.
  4. How to completely uninstall an incus install, so that when I reinstall incus, incus init will run fresh.

Alternatively, some suggestions to make things less confusing:

  1. For the Web UI to indicate what features are missing from missing optional packages, so that I don’t think it is due to an outdated incus version that doesn’t have those features, but instead am guided on how to get those already supported features up and running. That supported but uninstalled features should instead be visually displayed/shown but be disabled/grayed-out/unselectable, with instructions on how to enable them, or a button to automatically install whatever to enable them.
  2. For and one of the incus admin, incus admin init, incus webui commands to indicate how to setup and access the Web UI, which to me is logical next step during or after initialization, as part of the admin flow, and as part of incus webui. Instead, again, I’m left wondering if it is due to me missing a package, or a initialization mistake, or an outdated incus version. When it was actually related to incus config set core.https_address :8443 which gives no guidance about it.

I would use IncusOS but its apparent TPM 2.0 requirement makes Raspberry Pi 5 support tenuous.

Hi Benjamin. I run Incus on several Raspberry Pi 5s running Raspberry Pi OS Lite. I recently rebuilt the systems because Trixie was released.

On one of the systems I use the debian packages and on the others I use the Zabbly packages.

On all of them I use ZFS for the storage pools.

I don’t use the Web UI but I might be willing to test it out again if you run into issues. One thought though, is to use Caddy running on the host to expose your web UI to the local network instead of using SSH tunneling.

So what I do is this:

  • Flash an SD card using the official imager
    • Make sure you add your SSH key and user during this step
  • Uninstall the unused Linux kernel
    • This is optional but recommended to save time on compiling kernel modules
    • sudo apt --autoremove remove linux-image-*-v8
  • Install ZFS
    • sudo apt install zfsutils-linux zfs-initramfs
  • Install Incus
    • sudo apt install incus incus-client
    • or if you only want to use containers: sudo apt install incus-base incus-client
  • Add your user to the incus-admin group
    • sudo usermod -aG incus-admin balupton
  • Logout and then SSH back in
    • This refreshes the groups for your user
  • Initialize Incus
    • incus admin init
    • During the init process create your storage pool using the ZFS backend
  • Test your install
    • incus launch images:debian/trixie/cloud d1
    • incus exec d1 -- su -l debian
  • If all goes well then turn off your Raspberry Pi and make a disk image of your SD card
    • This is so you can flash the card again if you want to start over
2 Likes