We want to use the tool distrobuilder to create LXC/LXD containers, see LXC Distrobuilder Tutorial. The host system is Ubuntu 22.04.
The starting point may be https://blog.simos.info/using-distrobuilder-to-create-container-images-for-lxc-and-lxd/ but this page lacks some details.
The following examples are using the LXD fork called “incus”, see https://linuxcontainers.org/incus/.
Note: See the LXC/LXD cheat-sheet https://gist.github.com/berndbausch/a6835150c7a26c88048763c0bd739be6
Now installing the distrobuilder and the tool debootstrap , see https://github.com/lxc/distrobuilder/tree/main
$ sudo snap install distrobuilder --classic
$ sudo apt install -y debootstrap
Now create a template for the container, for example download the debian template, see examples at https://github.com/lxc/lxc-ci/tree/main/images
$ mkdir -p templates/debian/
$ cd templates/debian/
$ curl https://raw.githubusercontent.com/lxc/lxc-ci/main/images/debian.yaml > debian.yaml
Now create the container, specifying the architecture and release to avoid download failures “Error while downloading source”
# distrobuilder build-incus -o image.architecture=amd64 -o image.release=bookworm debian.yaml
The tool distrobuild will now download the resources and will create two output files
* meta.tar.xz
* rootfs.tar.xz
INFO [2024-01-15T17:05:26+01:00] Downloading source
I: Retrieving InRelease
I: Checking Release signature
I: Valid Release signature (key id 4CB50190207B4758A3F73A796ED0E7B82643E131)
I: Retrieving Packages
I: Validating Packages
I: Resolving dependencies of required packages...
I: Resolving dependencies of base packages...
I: Checking component main on https://deb.debian.org/debian...
I: Retrieving libacl1 2.3.1-3
...
...
INFO [2024-01-15T17:09:15+01:00] Skipping generator generator=fstab
INFO [2024-01-15T17:09:15+01:00] Running hooks trigger=post-files
+ umount -l /etc/resolv.conf
+ ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
INFO [2024-01-15T17:09:15+01:00] Creating LXC image compression=xz
INFO [2024-01-15T17:12:33+01:00] Removing cache directory
The directory should look like
# ls -l
total 98144
-rw-r--r-- 1 root root 72655 Jan 15 20:35 debian.yaml
-rw-r--r-- 1 root root 708 Jan 15 20:42 incus.tar.xz
-rw-r--r-- 1 root root 100421632 Jan 15 20:42 rootfs.squashfs
The following command will import the newly build container
# incus image import incus.tar.xz rootfs.squashfs --alias mycontainerimage
Image imported with fingerprint: 0e582e2407463f4f9beffb083fe81f274e04fbf0421998003c07053b1c47e84b
After the import, the container will be listed
# incus image ls
+------------------+--------------+--------+---------------------------------------+--------------+-----------+----------+------------------------------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE | UPLOAD DATE |
+------------------+--------------+--------+---------------------------------------+--------------+-----------+----------+------------------------------+
| mycontainerimage | 0e582e240746 | no | Debian bookworm amd64 (20240115_1936) | x86_64 | CONTAINER | 95.77MiB | Jan 15, 2024 at 7:48pm (UTC) |
+------------------+--------------+--------+---------------------------------------+--------------+-----------+----------+------------------------------+
The container can be started using
# incus launch mycontainerimage c1
Creating c1
The instance you are starting doesn't have any network attached to it.
To create a new network, use: incus network create
To attach a network to an instance, use: incus network attach
Starting c1