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