Skip to content

epic: support Fedora CoreOS #500

Description

@castrojo

Goal

Add Fedora CoreOS (FCOS) as a second target OS alongside Flatcar Container Linux. knuckle becomes a unified installer for the entire CoreOS family — same TUI, separate ISOs, OS-appropriate sysext catalog.

Background

Both Flatcar and FCOS use Ignition/Butane for provisioning. The installer toolchain and update mechanism differ significantly, but the user-facing flow (hostname → network → disk → users → sysexts → review → install) maps cleanly to both.

The FCOS sysext catalog (fedora-sysexts/community) is a real, active community repo with 1,583+ releases, CDN at extensions.fcos.fr, and both x86-64 and arm64 assets. It is the FCOS equivalent of the Flatcar Bakery.

Key differences from Flatcar

Concern Flatcar FCOS
Installer binary flatcar-install coreos-installer install
Butane variant flatcar 1.1.0 fcos 1.5.0
Update mechanism /etc/flatcar/update.conf + update-engine /etc/zincati/config.d/*.toml + zincati
Update strategies reboot, off, etcd-lock immediate, never
Channels stable, beta, alpha, lts, edge stable, testing, next
Sysext catalog flatcar/sysext-bakery fedora-sysexts/community
Catalog asset names name-version-x86-64.raw name-epoch-ver-release-fedoraversion-arch.raw
GPT relocation sfdisk --relocate gpt-bak-std needed NOT needed (coreos-installer handles it)
NVIDIA /etc/flatcar/enabled-sysext.conf Not supported in v1
Fedora version n/a Encoded in sysext asset names; obtained from stream metadata JSON

Architecture

The Installer interface already exists in internal/install/install.go. The key architectural decision: both impls are constructed at startup in a DispatchingInstaller that delegates on cfg.OS at Install() call time (not at construction time — OS is unknown until StepWelcome).

Implementation order

Work these issues in order. The earlier issues are gates for the later ones.

Issue Title Phase
#636 feat(model): OS discriminator field 1 — Foundation
#637 feat(validate): FCOS stream validation 1 — Foundation
#638 feat(install): OS-dispatching installer and bakery wiring 1 — Foundation
#639 feat(ignition): FCOS Butane variant + zincati + strategy constants 2 — Core
#640 feat(install): FCOSInstaller using coreos-installer 2 — Core
#641 feat(bakery): FCOS sysext catalog client 2 — Core
#642 feat(headless): os field, FCOS validation 3 — Integration gate
#643 feat(tui): OS selection, FCOS-conditional steps 4 — UI
#644 feat(iso): FCOS live ISO build 5 — Release artifact
#645 test: FCOS test coverage 6 — Quality

Gate: #642 (headless dry-run) must pass before #643 (TUI) starts. The headless path exercises the full backend stack (model → validate → ignition → install) with no UI surface area — it's the cheapest end-to-end smoke test.

What's NOT in v1

  • NVIDIA support on FCOS (no /etc/flatcar/enabled-sysext.conf equivalent)
  • FCOS version pinning (coreos-installer doesn't expose a -V equivalent for stream installs)
  • etcd-lock / Greenwave update strategy (Flatcar-only)
  • arm64 FCOS ISO (Flatcar already ships arm64; FCOS arm64 can follow)

Sysext catalog — important note for #641

The fedora-sysexts/community asset naming encodes the Fedora major version (e.g. tailscale-0-1.98.3-1-44-x86-64.raw = Fedora 44). Do not hardcode the stream→Fedora-version mapping — it increments each ~6-month Fedora release cycle. Instead, query the FCOS stream metadata JSON:

https://builds.coreos.fedoraproject.org/streams/{stream}.json

Parse the Fedora major version from the version field (e.g. "41.20250223.3.0" → 41).

FCOS ISO — important notes for #644

  • Use coreos-installer iso customize (NOT pxe customize)
  • The FCOS live image runs getty@tty1.service with autologin — add Conflicts=getty@tty1.service to the knuckle service unit
  • coreos-installer is not in Ubuntu apt — must be installed as a static binary in CI

References

Metadata

Metadata

Assignees

No one assigned

    Labels

    1-triageNew work awaiting human triage.

    Type

    No type

    Projects

    Status
    Triage

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions