Floe
Floe is Frostyard’s headless server image. It is a Debian Trixie bootc/composefs image for x86-64 machines with UEFI, built from the same Base as the other Frostyard images, and it ships Podman. Use it for containers and services on a machine that has no desktop.
The system lives in a read-only /usr that updates as one piece, and you can
roll back to the previous version. Your homes, container storage, and service
data live under /var. Floe has no core Flatpak set.
Install
Section titled “Install”Firn is the installer. It needs UEFI and erases the disk you pick. It works with or without Secure Boot, TPM 2.0, and disk encryption, and asks you about each one. Use a disk of at least 30 GiB, and more for container images, volumes, and several updates. The installer runs from RAM and needs at least 4.5 GiB of memory.
- Download the installer and its checksums:
- Check the signing key’s fingerprint and the ISO, then write the ISO to a
USB stick. The
installation guide
has the exact
gpgvandsha256sumcommands and the commands to write the stick. Read its warning on picking the right device. - Boot the stick. In Firn, pick the bootc Floe product, review the recipe Firn builds, and confirm the exact target disk.
- If Firn shows a recovery key, store it somewhere other than this disk before you continue.
- If Secure Boot is on, enroll the MOK when asked. Without it, the MOK-signed boot stage is not trusted while Secure Boot is enforced.
The native in the ISO address is an old folder name. It does not mean an
A/B install.
First boot
Section titled “First boot”Floe starts without a desktop. Log in on the console as the user you created in Firn, or over SSH. SSH is on by default: add your key in Firn.
Check that the system is healthy:
systemctl is-system-runningsudo bootc statussudo snosi-update-status --checksystemctl list-timers bootc-update-stage.timersystemctl is-system-running prints running when every unit has
started, and degraded when a unit failed.
bootc status shows the booted and staged deployments, and names the image it
follows. If it shows null, see Troubleshooting.
snosi-update-status --check tells you whether a newer image is published.
The timer is listed with its next run.
Install workloads as containers or as system extensions.
Do not install APT packages into /usr: an image update does not keep them.
The image turns off the APT daily update and upgrade timers and services.
Updates and rollback
Section titled “Updates and rollback”Updates are automatic. Every hour, bootc-update-stage.timer checks the
followed image, pulls it with Podman, and stages a new version. The timer
adds a random delay of up to 15 minutes. The new version starts at your next
normal reboot. The stager does not force a reboot.
Enabled system extensions update on their own. A new version is staged and starts at the next boot. See Automatic updates.
The stager runs the bootc commands itself. You do not need to run them. On
the first staged update, while the host does not yet follow the image from
containers-storage, it runs bootc switch --transport containers-storage.
From then on, in steady state, it runs bootc upgrade, because a second
bootc switch to the same image would do nothing. Both paths verify the
staged digest before they report success.
To go back to the previous version:
sudo bootc rollbacksudo systemctl rebootHomes, container storage, and service data in /var are shared by all
versions, so a rollback keeps them. After a rollback, the updater does not
stage the version you rolled back from again. It waits for the next published
image.
Keep about twice the image size free in /var. The updater pulls each new
image into /var before it stages it.
What ships
Section titled “What ships”Floe is Base plus the bootc runtime, the bootc security setup, the server packages, a kernel, and the image output format.
| Layer | What you get |
|---|---|
| Base | Debian Trixie userspace, systemd, the hourly update stager, Updex, and the system-extension definitions |
| Bootc runtime | bootc, libostree-1-1, and the packages OCI bootc needs |
| Server tools | systemd-container for systemd-nspawn and systemd-vmspawn, tuned, tuned-ppd, dbus-broker, and locales-all |
| Containers | podman, distrobox, buildah, crun, fuse-overlayfs, slirp4netns, passt, and criu |
| Networking | NetworkManager, OpenSSH, mDNS with avahi-daemon, IPv4 forwarding, the BBR congestion control, and larger inotify limits |
| Kernel | linux-image-amd64/forky for now, with most firmware and Mesa from trixie-backports |
| Homebrew | brew-setup.service, brew-update.timer, brew-upgrade.timer, bbrew-helper, and the CLI bundle at /usr/share/floe/bundles/cli.Brewfile |
| Logs | A journal that keeps its logs on disk across reboots |
| Core Flatpak set | None |
Floe uses the linux-image-amd64/forky kernel until the Trixie backports
kernel is complete. The build file for it is still called backports; the
name is out of date. Most firmware and Mesa come from trixie-backports,
pinned in the same file.
SSH, mDNS (Avahi), and tuned run by default. The image ships no enablement
links in /etc; the presets enable these services at first boot.
brew-setup.service unpacks the Homebrew archive to /var/home/linuxbrew at
first boot. The two brew timers update and upgrade an installed Homebrew.
bbrew-helper installs bbrew when it is absent, then runs it. The CLI
bundle lists the recommended command-line tools.
The initramfs includes the LVM, crypt, and bootc composefs modules, plus FIDO2, TPM2, PKCS#11, and PCR phase modules for encrypted disks.
Choose Floe
Section titled “Choose Floe”Choose Floe for a headless server that runs containers and services. It has no desktop, no graphical session, and no core Flatpak set. Do not use it as a workstation. The other products are:
- Snow: the general-purpose GNOME desktop.
- Snowfield: GNOME for Microsoft Surface devices. It is untested on representative Surface hardware; its hardware gate was waived for catalog inclusion.
- Sundog: KDE Plasma, bootc only.
Base is the shared foundation, not a fifth installer choice. Floe has the Trixie userspace with a newer kernel.
Run containers and extensions
Section titled “Run containers and extensions”Podman, Distrobox, and Buildah are in the image. systemd-container adds
systemd-nspawn and systemd-vmspawn, and Base ships the QEMU runtime that
systemd-vmspawn uses.
Every image carries a definition for each system extension, switched off. The
extension itself is not in the image: Updex turns it on and downloads it.
Floe creates /var/lib/extensions for merged extensions. The
extension catalog lists every extension and the Updex steps.
Three extensions have a guide:
Troubleshooting
Section titled “Troubleshooting”| Symptom | Check | Fix |
|---|---|---|
bootc status shows spec.image: null |
The host is not managed by bootc. It is most likely an old nbc or native A/B install. | See Moving from an nbc or A/B install. |
sudo snosi-update-status says published image equals the rollback deployment |
You rolled back, and no newer image is published yet | Nothing to fix. The updater holds until a newer image is published. |
| No update is staged | systemctl list-timers bootc-update-stage.timer and journalctl -u bootc-update-stage.service |
Wait for the hourly run. Check the network and the free space in /var. |
| Staging fails for lack of space | Compare the free space in /var with the image size |
Free space or grow the disk. The updater needs room for the download, the new version, and the previous one. |
| A unit fails at boot | systemctl --failed |
Read the unit’s log with journalctl -u <unit>, then correct the service or its configuration. |
| Secure Boot or TPM does not behave as you expect | bootc status and the firmware settings |
Check the firmware settings, then read the Bootc Secure Operations runbook. Secure Boot is not production-ready yet. |
Moving from an nbc or A/B install
Section titled “Moving from an nbc or A/B install”Old nbc and native A/B installs get no new images or updates after 2026-09-30. There is no in-place conversion. Back up, install fresh with Firn, and restore your data.
The
migration runbook
lists what to save: your /etc changes, homes, Podman volumes,
/var/lib/tailscale if you use Tailscale, and /var/lib/himmelblau and
/etc/himmelblau if you use Himmelblau. Record which system extensions you
enabled, so you can enable them again. Check the backup from another machine
before you erase the disk.
See also
Section titled “See also”- Install a Frostyard image
- Install, update, and roll back
- Snow image
- Docker system extension
- Incus system extension
- Tailscale system extension
- nbc to bootc migration runbook
- Bootc Secure Operations runbook
Sources
Section titled “Sources”Reviewed 2026-10-27 against snosi commit
b2858ca0222814c395cf8248db98f3e096d57dc9.
README.mdmkosi.profiles/floe/mkosi.confshared/composition/floe/mkosi.confshared/packages/floe/mkosi.confshared/packages/bootc/mkosi.confshared/bootc-secure/mkosi.confshared/kernel/backports/mkosi.confmkosi.images/base/mkosi.confshared/floe/tree/usr/lib/systemd/system-preset/00-apt.presetshared/floe/tree/usr/lib/systemd/system-preset/01-homebrew.presetshared/scripts/build/brew.chrootshared/floe/tree/usr/lib/systemd/system/brew-setup.serviceshared/floe/tree/usr/lib/systemd/system/brew-update.timershared/floe/tree/usr/lib/systemd/system/brew-upgrade.timershared/floe/tree/usr/bin/bbrew-helpershared/floe/tree/usr/share/floe/bundles/cli.Brewfileshared/floe/tree/usr/lib/sysctl.d/70-networking.confmkosi.images/base/mkosi.extra/usr/lib/sysctl.d/40-snosi-inotify.confmkosi.images/base/mkosi.extra/usr/lib/systemd/journald.conf.d/10-snosi-persistent.confshared/floe/tree/usr/lib/dracut/dracut.conf.d/20-tpm-luks.confshared/floe/tree/usr/lib/dracut/dracut.conf.d/30-bootc-standard.confshared/floe/tree/var/lib/extensions/.keepshared/scripts/common-postinst.shflatpaks/core-flatpaks.pyshared/composition/core-flatpaks.finalizemkosi.images/base/mkosi.extra/usr/libexec/bootc-update-stagedocs/adr/0002-ship-no-enablement-symlinks-in-etc.mdmkosi.images/base/mkosi.extra/usr/libexec/preset-reconcilemkosi.images/base/mkosi.extra/usr/bin/snosi-update-statusmkosi.images/base/mkosi.extra/usr/lib/systemd/system/bootc-update-stage.timerdocs/design/sysexts.mddocs/installing.mddocs/bootc-secure-operations.mddocs/nbc-to-bootc-migration.mddocs/design/overview.mddocs/design/testing.md- Extension definitions in the image, each with
Enabled=false:mkosi.images/base/mkosi.extra/usr/lib/, for examplesysupdate.docker.d/docker.feature mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/05-updex.preset