Distrobuilder 3.0 has been released


The distrobuilder team is proud to announce the release of distrobuilder 3.0!

Outside of the usual updates to account for changes made by various distributions, the main highlights are:

  • Incus is now used in place of LXD
  • Distributions
    • A lot of updates to handle newer distribution releases
    • Added support for VyOS
    • Added support for Slackware
    • Added support for NixOS
  • Several improvements to the systemd generator, which is also now shipped as a standalone file
  • Pongo templates can now be used in actions
  • Reworked documentation

The full list of commits is available below:

Detailed changelog
  • main: the systemd generator doesn’t do anything on VMs
  • main: simplify NetworkManager and cloud-init handling
  • main: do distro ID comparison (quick) before grepping (slower)
  • main: add is_lxc_privileged_container function
  • main: Stop doing terrible things to NetworkManager
  • udev: Allow NetworkManager to manage veth interfaces
  • main: export LC_ALL=C
  • image/lxd: stop using qcow2 compat=0.10 (aka qcow2-v2)
  • sources/almalinux: Format isoRunner script
  • sources/almalinux: Drop hard-coded GPG key
  • doc/examples: Fix typos in examples
  • main: Reintroduce NetworkManager workaround
  • shared/util: Use multiple threads when compressing
  • main: Mask systemd-firstboot.service
  • sources/centos: Disable fastestmirror plugin
  • sources/centos: Use baseurl instead of metalink for repos
  • sources/gentoo: Download portage tree
  • managers/portage: Make refresh a no-op
  • sources/opensuse: Change URL path to Leap images
  • doc/generators: Fix link to LXD image format
  • sources/opensuse: Validate found tarball links
  • sources: Support Rocky Linux 9
  • sources/rhel: Check directory before listing its entries
  • sources/rocky: Fix gpg key and mirrorlist for v9
  • doc: mention that Windows Server 2022 is supported
  • Drop deprecated io/ioutil package
  • Update gomod
  • shared/archive: Fix call to RunCommandWithFds
  • shared/definition: Add Pongo support for actions
  • main,managers: Add Pongo support for actions
  • sources/alpine: Always download latest point release
  • source/alpine: Properly handle latest release when using edge
  • shared/logger: Set log output to stdout
  • shared/logger: Add padding to log level texts
  • sources/oracle: Find updates through iteration
  • sources/openwrt: Support OpenWrt 22.03
  • Add output note to image.md
  • Add rootfs-http to downloaders list
  • manages/{dnf,yum}: Use --nobest on package updates
  • managers/yum: Use --nobest only if available
  • Revert “managers: Drop luet”
  • sources: Support Springdale Linux 9
  • gomod: Exclude buggy dependency
  • Update gomod
  • systemd: Mask systemd-binfmt.service
  • source: add support for openeuler downloader
  • change release style to 22.03-LTS-SPx and try to select latest version
  • sources: Set user-agent for downloads
  • image,shared: Allow specifying compression level
  • image,shared: Allow use of lzo/lzop interchangeably
  • utils: Add missing user-agent string
  • sources: Increase TLS handshake timeout for downloads
  • sources: Pass client to downloadChecksum
  • main: Log error when main command fails
  • sources: Update openEuler tests
  • main: Ensure main error is logged
  • funtoo-http: Add support to next release
  • Update gomod
  • .github: Switch Go versions
  • doc: basic Sphinx setup
  • doc: apply Diataxis
  • doc: add GitHub action for automatic doc tests
  • doc: fix typos, linting and broken links
  • doc: add workflow to build documentation
  • doc: add link to snap
  • doc: remove version switcher (since we only have one version)
  • doc: only include GitHub link in the footer for actual pages
  • Fix broken link to use.md
  • doc/github workflows: cancel concurrent runs
  • doc: fix documentation warnings
  • doc: Update actions regards to the hook post-files
  • build(deps): bump GitHub - opencontainers/runc: CLI tool for spawning and running containers according to the OCI specification from 1.1.4 to 1.1.5
  • Update CI test distros
  • Use LXD-style static analysis
  • Satisfy static analysis
  • build-dir: Add with-post-files flag
  • doc: Update build-dir usage
  • Fix remaining static analysis issues
  • main: Don’t create cache directory if only validating
  • main: Check cmd in postRun function
  • shared/osarch: Use armv7 for alpine linux
  • main: Fix cache directory removal if it’s a mountpoint
  • windows: Detect Windows architecture from filename
  • sources/rocky: Support Rocky Vault
  • sources: Add VyOS
  • *: Set fstype when mounting
  • sources/openwrt: Fix URL paths for arm builds
  • main: Allow masking units created by the lxc system-generator
  • github: Add DCO and target check
  • generators/lxd-agent: Use setup script for OpenRC
  • doc: add missing content for the tutorial
  • *: Drop support for upstart (no longer used)
  • Makefile: Add missing .PHONY for update-gomod
  • github: Align tests with LXD’s tests
  • github: Run all doc tests in a single job
  • github: Move doc tests to the main tests.yml
  • github: Align builds with LXD’s builds
  • github: Add dependency-review action to check for vulnerable deps
  • github: inclusive naming should fail on error
  • shared/util: Sort tar archives by name
  • image/lxd: Don’t make rootfs.squashfs exportable via NFS
  • *: Update short description to mention VM images are supported
  • lxd-generator: Fix masking units created by generator
  • definition: Add Source.Components
  • doc/reference: add components field
  • source: Update openEuler test
  • Update gomod
  • Update imports to GitHub - canonical/lxd: Powerful system container and virtual machine manager
  • doc: Update index.md
  • sphinx: Update link to LXD docs
  • generators/lxd-agent: Update documentation in service file
  • main: Move VM check to global command
  • *: Apply filters on start
  • definition: Filter LXC targets
  • definition: Filter environment variables
  • Revert “definition: Filter environment variables”
  • Revert “definition: Filter LXC targets”
  • Revert “*: Apply filters on start”
  • Revert “main: Move VM check to global command”
  • main: Move VM check to global command
  • *: Apply filters on start
  • definition: Filter LXC targets
  • definition: Filter environment variables
  • Revert “definition: Filter environment variables”
  • Revert “definition: Filter LXC targets”
  • Revert “*: Apply filters on start”
  • Revert back to last working state
  • shared: Add filter to DefinitionTargetLXCConfig
  • image/lxc: Filter LXC metadata
  • Pass full definition to SetupChroot
  • shared: Add filter to DefinitionEnvVars
  • shared: Filter environment variables
  • github: Update branch target
  • windows: Mount Windows ISO as UDF instead of ISO9660
  • Fix troubleshoot link
  • Do not bring the networking down on container startup when using routed nic together with NetworkManager, as in this case networking is configured externally by lxd.
  • systemd: Tweak generator to handle systemd 254
  • systemd: Disable ImportCredentials when privileged on 254+
  • udev: Trigger lxd-agent even on change events
  • systemd: Make sure subshell returns success
  • github: replace golang 1.19 with 1.21
  • Add support for slackware - added http source (works with 15.0 and current) - added slackpkg manager (upgrade/clean fail if there are not any packages to upgrade/clean)
  • global: Use incus repository
  • Update gomod
  • global: Rename files lxd → incus
  • main: Rename {build,pack}-lxd to {build,pack}-incus
  • generators,image: Rename LXD to Incus
  • definition: Rename targets.lxd to targets.incus
  • global: Rename lxd import to incus
  • sphinx: Change URL to Incus
  • README: Update for Incus
  • global: Rename output files
  • Rename lxd-agent to incus-agent
  • global: Rename build-lxd to build-incus
  • global: Rename pack-lxd to pack-incus
  • generators: Remove mentions of LXD
  • distrobuilder: Remove mentions of LXD
  • doc: Update for Incus
  • sphinx: Add Incus
  • sources: Fix slackware
  • Update gomod
  • dnf: Also use nobest for install
  • incus-agent: Fix lxd-agent fallback logic
  • Update gomod
  • shared: Update for Incus packages
  • Added rpmbootstrap source
  • global: Update to current incus/shared
  • Update openwrt-http.go for 23.05
  • sources: Add NixOS
  • Update openwrt-http.go for handling new 23.x release
  • Bugfix in openwrt-http.go to handle 23.x ARM release
  • Missing } in openwrt-http.go
  • Update openwrt-http_test.go for new versions (untested)
  • generator: Extract systemd generator from code
  • Support dnf in rpmbootstrap
  • main: Keep track of current subcommand
  • main_validate: Set SinceErrors to true
  • shared/osarch: Add x86_64 to Alpine architecture map
  • Update gomod
  • Update Vyos rolling update iso url



Thanks for the release, especially after lxc-ci files were updated to work with incus!

Do I understand the code changes that distrobuilder is now incompatible with lxd? I.e., you can’t create lxd images anymore with it? Although I’d think the image format itself hasn’t changed much.

Right, all the commands were renamed from lxd over to incus though at this point the image format hasn’t diverged so you can just use the incus command and consume the image with LXD.

That’s effectively what anyone using LXD and consuming images from https://images.linuxcontainers.org (images remote) is doing today.

1 Like

Just checked images.linuxcontainers and VyOS images are not there yet. Guessing it’s just the distrobuilder update for now. Will these images appear there as well?

While distrobuilder supports building VyOS images, nobody has yet contributed the config needed to have those builds happen on our infrastructure.

For anyone interested who knows enough about VyOS to get things up and running, we’d need a pull request at: GitHub - lxc/lxc-ci: LXC continuous integration and build scripts

Related to linux based router OS, do you know if IPFire is supported? I will eventually take a look at it and, if it is supported, I might spend some time to learn on how to configure it for distrobuilder. I might not do it for VyOS though.

I don’t know if they support running in containers, but if they do, then someone could add a source and package manager definition to the distrobuilder source so it would be possible to build those images.

Any plans to package and deliver Distrobuilder as non-snap?

You’d need to talk to packagers for your distro of choice.
As an upstream project, what we release are tarballs and git tags :slight_smile:

The snap was created back when we were all still at Canonical and as it hasn’t failed yet, we’ve just kept it on auto-pilot (it automatically builds itself).

For our own systems, we just use go install to download and build distrobuilder from source when needed.

1 Like