Base
Base is the shared foundation of every Frostyard image. Snow, Snowfield, Sundog, and Floe each build on it, then add a bootc runtime, their own software, and a kernel. Base is not an installer choice: Firn offers only Snow, Snowfield, Sundog, and Floe.
Every image gets the same update stager, the same status tool, and the same system-extension definitions from Base. They behave the same on a desktop and on a server.
The layers
Section titled “The layers”A Frostyard image is built in five layers. Each product profile includes them in this order:
| Layer | What it adds |
|---|---|
| Base | Debian Trixie userspace, systemd, the update stager, Updex, and the system-extension definitions |
| Bootc runtime | bootc, libostree-1-1, the packages OCI bootc needs, and the bootc security setup |
| Product composition | The desktop or server payload, its services, and its core Flatpak list, when it has one |
| Kernel | The product’s kernel, firmware, and Mesa |
| Output format | The directory output that mkosi writes |
The product profile selects the composition and the kernel. Snow and Floe use the backports kernel, Snowfield uses the linux-surface kernel, and Sundog uses the backports kernel with a KDE composition. The other layers are shared.
What Base gives you
Section titled “What Base gives you”Base holds the parts that should work the same everywhere: the Debian Trixie userspace, systemd, the update stager, the status tool, Updex, the system-extension definitions, microcode and firmware updates, networking, and the command-line tools.
The system keeps /usr immutable, manages /etc across deployments, and
keeps /var persistent. The image ships no service enablement links in
/etc. Presets create them at first boot.
Base builds as a directory image. The root build is not bootable, and it has no installer entry.
Updates
Section titled “Updates”Every image runs the same stager. bootc-update-stage.timer fires every hour,
with a random delay of up to 15 minutes. It pulls the image it follows with
Podman, verifies the staged digest, and stages the new version. The version
starts at your next normal reboot. The stager does not force a reboot.
Check the state on any image:
sudo snosi-update-statussudo snosi-update-status --checksudo snosi-update-status --pkg-diffsystemctl list-timers bootc-update-stage.timersnosi-update-status must run as root. It prints the running version, the
image the host follows, the result of the last check, and any staged update.
--check also queries the registry and compares versions, never digests.
--pkg-diff lists the Debian package changes between the running image and
the staged one.
The stager records its result in /run/snosi/update-check and
/run/snosi/update-staged. The files do not survive a reboot. The login
message on a headless system reports a staged update or a failed check. For a
failure, run journalctl -u bootc-update-stage.service.
The stager’s service starts only when the kernel command line has
composefs. On a host that bootc does not manage, the stager exits without
changes.
System extensions
Section titled “System extensions”Base carries the system-extension definitions in /usr/lib/sysupdate.<name>.d/.
Each component has a .transfer file that downloads its image from
https://repository.frostyard.org/ext/<name>/ and verifies the signed
SHA256SUMS, and a .feature file that sets Enabled=false. docker and
tailscale are two examples.
Every extension starts switched off. Turn one on with Updex; the catalog lists every extension.
The preset 05-updex.preset enables updex-update.timer on every image. Enabled extensions update on their own: a new version is staged and starts at the next boot. See Automatic updates.
After systemd-sysext.service merges the enabled extensions,
reload-sysext.service runs systemd-sysusers and systemd-tmpfiles. It
then reapplies the kernel limits for fs.aio-max-nr, inotify, and
kernel.keys from the merged configuration, and runs
systemctl daemon-reload.
What ships
Section titled “What ships”| Group | What it includes |
|---|---|
| Userspace | Debian Trixie, systemd, dracut, sudo, systemd-cryptsetup, systemd-zram-generator, tpm2-tools, efibootmgr, and shim-signed |
| Updates | bootc-update-stage.timer, the stager, snosi-update-status, frostyard-updex, and updex-update.timer |
| Extensions | The definitions under /usr/lib/sysupdate.*.d/ and reload-sysext.service |
| Firmware and microcode | amd64-microcode, intel-microcode, fwupd, and wireless-regdb |
| Network | network-manager, wpasupplicant, openssh-server, and systemd-resolved |
| Tools | git, curl, rsync, vim, jq, gcc, make, skopeo, and qemu-system-x86 |
The presets start NetworkManager, reload-sysext.service,
bootc-update-stage.timer, and updex-update.timer. They turn off the APT
daily update and upgrade timers, bootc-fetch-apply-updates.timer, and rsync.service.
What Base does not include
Section titled “What Base does not include”- No desktop and no server payload. The product composition adds them.
- No kernel. Each product adds one.
- No core Flatpak set of its own. Snow and Snowfield share one list, Sundog has its own, and Floe has none.
- No product name. Each product profile sets its own
ImageId.
Choose an image
Section titled “Choose an image”Firn offers only these four bootc products. Base is not one of them.
| Product | Role | Page |
|---|---|---|
| Snow | General-purpose GNOME desktop | Snow |
| Snowfield | GNOME desktop for Microsoft Surface devices | Snowfield |
| Sundog | KDE Plasma desktop, bootc only | Sundog |
| Floe | Headless server image | Floe |
Snowfield is untested on representative Surface hardware. The Snow page compares the products.
See also
Section titled “See also”- Install a Frostyard image
- Install, update, and roll back
- Snow image
- System extension catalog
- Updex
- nbc to bootc migration runbook
- Bootc Secure Operations runbook
Sources
Section titled “Sources”Reviewed 2026-10-27 against snosi commit
b2858ca0222814c395cf8248db98f3e096d57dc9.
README.mdmkosi.confmkosi.images/base/mkosi.confshared/packages/bootc/mkosi.confshared/bootc-secure/mkosi.confshared/outformat/image/mkosi.confshared/kernel/backports/mkosi.confshared/kernel/surface/mkosi.confmkosi.profiles/snowfield/mkosi.confflatpaks/core-flatpaks.pymkosi.images/base/mkosi.extra/usr/libexec/bootc-update-stagemkosi.images/base/mkosi.extra/usr/bin/snosi-update-statusmkosi.images/base/mkosi.extra/usr/lib/systemd/system/bootc-update-stage.timermkosi.images/base/mkosi.extra/usr/lib/systemd/system/bootc-update-stage.servicemkosi.images/base/mkosi.extra/usr/lib/systemd/system/reload-sysext.servicemkosi.images/base/mkosi.extra/etc/update-motd.d/86-bootc-update-stagedmkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/00-apt.presetmkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/00-network.presetmkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/03-core.presetmkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/04-bootc-update.presetmkosi.images/base/mkosi.extra/usr/lib/sysupdate.docker.d/docker.featuremkosi.images/base/mkosi.extra/usr/lib/sysupdate.docker.d/docker.transfermkosi.images/base/mkosi.extra/usr/lib/sysupdate.tailscale.d/tailscale.featureshared/firn-installer/catalog.jsondocs/installing.mddocs/bootc-secure-operations.mddocs/adr/0002-ship-no-enablement-symlinks-in-etc.mddocs/design/overview.mddocs/design/sysexts.mdmkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/05-updex.presetmkosi.images/base/mkosi.extra/usr/lib/systemd/zram-generator.conf