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
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 atextensions.fcos.fr, and both x86-64 and arm64 assets. It is the FCOS equivalent of the Flatcar Bakery.Key differences from Flatcar
flatcar-installcoreos-installer installflatcar 1.1.0fcos 1.5.0/etc/flatcar/update.conf+ update-engine/etc/zincati/config.d/*.toml+ zincatiflatcar/sysext-bakeryfedora-sysexts/communityname-version-x86-64.rawname-epoch-ver-release-fedoraversion-arch.rawsfdisk --relocate gpt-bak-stdneeded/etc/flatcar/enabled-sysext.confArchitecture
The
Installerinterface already exists ininternal/install/install.go. The key architectural decision: both impls are constructed at startup in aDispatchingInstallerthat delegates oncfg.OSatInstall()call time (not at construction time — OS is unknown untilStepWelcome).Implementation order
Work these issues in order. The earlier issues are gates for the later ones.
feat(model): OS discriminator fieldfeat(validate): FCOS stream validationfeat(install): OS-dispatching installer and bakery wiringfeat(ignition): FCOS Butane variant + zincati + strategy constantsfeat(install): FCOSInstaller using coreos-installerfeat(bakery): FCOS sysext catalog clientfeat(headless): os field, FCOS validationfeat(tui): OS selection, FCOS-conditional stepsfeat(iso): FCOS live ISO buildtest: FCOS test coverageGate: #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
/etc/flatcar/enabled-sysext.confequivalent)-Vequivalent for stream installs)Sysext catalog — important note for #641
The
fedora-sysexts/communityasset 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:Parse the Fedora major version from the
versionfield (e.g."41.20250223.3.0"→ 41).FCOS ISO — important notes for #644
coreos-installer iso customize(NOTpxe customize)getty@tty1.servicewith autologin — addConflicts=getty@tty1.serviceto the knuckle service unitcoreos-installeris not in Ubuntu apt — must be installed as a static binary in CIReferences