Skip to content

uki: Fedora 44 kernel 7.0.12 + stub 259.6; GPG-verify + automate deps#19

Merged
HarryR merged 6 commits into
mainfrom
fedora44-kernel-bump
Jul 13, 2026
Merged

uki: Fedora 44 kernel 7.0.12 + stub 259.6; GPG-verify + automate deps#19
HarryR merged 6 commits into
mainfrom
fedora44-kernel-bump

Conversation

@HarryR

@HarryR HarryR commented Jul 10, 2026

Copy link
Copy Markdown
Collaborator

What

Bring the UKI to a current, GPG-verified Fedora 44 base, bundle the kernel modules stage2 needs, and supporting build cleanups.

Kernel + stub

  • Bump kernel 6.12.4-200.fc41 -> 7.0.12-201.fc44 and systemd-boot stub 256.17-1.fc41 -> 259.6-1.fc44 (what Fedora CoreOS 44.20260621.3.1 ships). fc41 is EOL; the kernel was ~18 months behind.
  • GPG verification (mandatory): download-verify-rpm.sh fetches from koji's signed path (plain packages/ is unsigned) and verifies each RPM against keys/RPM-GPG-KEY-fedora-44-primary (fp 36F6 12DC F27F 7D1A 48A8 35E4 DBFC F71C 6D9F 90A6) on every build.
  • Automated bumps: pins live in generated tools/build-uki/fedora-deps.mk; make update-fedora-deps FCOS=... SYSTEMD=... reads the FCOS manifest, downloads + GPG-verifies the signed RPMs, and rewrites the pins.

Storage modules for stage2

  • Bundle + explicitly load (in dependency order, before the modules_disabled latch) the modules stage2's loader needs: dm-crypt (encrypted /data), dm-verity + reed_solomon (integrity-checked erofs runtime + FEC dep), overlay (ephemeral root), erofs + netfs (RO image fs + dep), and the nvme chain (hkdf -> nvme-auth/keyring -> nvme-core -> nvme; EC2 EBS + the harness disk are NVMe). The payload cannot load modules itself, and an unresolved dep can't be pulled once the latch is set, so deps are listed explicitly.
  • Module comments describe each dependency's capability generically. Authenticated /data (dm-integrity + async_xor/async_tx) is documented as an extension point but not shipped -- stage2 uses confidentiality-only dm-crypt, so those are omitted to keep the measured initramfs minimal.

Build

  • Pin vaportpm-attest to v0.3.0 (rev + version guard).
  • Extract the shared DOCKER_RUN harness into build.mk.
  • Drop a stale kernel-hash-% target.

Verification

  • ena (AWS) + gve (GCP) present in 7.0.12; all required .ko.xz copy.
  • make test-chain-x86_64 SIGN=1 / MANIFEST=1 / SIGN_ARGS=1 boot Linux 7.0.12-201.fc44 end to end and run stage2.
  • lockboot/stage2's XTS pivot test passes end to end on this UKI (PIVOT_TEST=PASS), dm-integrity absent from the boot.
  • aarch64 pins are GPG-verified but not boot-tested here.

Pairs with lockboot/stage0#10 (image parity: rpm+gnupg, shared harness, vaportpm pin, stable GUIDs).

🤖 Generated with Claude Code

HarryR and others added 5 commits July 10, 2026 07:54
…ate deps

The UKI pinned kernel 6.12.4-200.fc41 and the systemd-boot stub 256.17-1.fc41,
verified only by SHA256. fc41 is EOL (no more security updates) and the kernel
was ~18 months behind, so move to what Fedora CoreOS 44.20260621.3.1 ships:
kernel 7.0.12-201.fc44 and stub 259.6-1.fc44.

Also add supply-chain provenance and make future bumps easy:

- GPG verification (mandatory, no optional path): download-verify-rpm.sh fetches
  from koji's SIGNED path (the plain packages/ path serves UNSIGNED builds) and
  verifies each RPM's Fedora signature via verify-rpm-gpg.sh (hermetic rpmdb),
  on every build. Trust anchor: keys/RPM-GPG-KEY-fedora-44-primary, fingerprint
  36F6 12DC F27F 7D1A 48A8 35E4 DBFC F71C 6D9F 90A6 (see keys/README.md).
- The pins now live in the generated tools/build-uki/fedora-deps.mk; regenerate
  with `make update-fedora-deps FCOS=44.20260621.3.1 SYSTEMD=259.6-1.fc44`.
  update-fedora-deps.py reads the kernel NVR from the FCOS build manifest, takes
  the stub from Fedora (explicit or latest-in-fNN via Bodhi), downloads all six
  RPMs from the signed path, GPG-verifies, and rewrites the pins.
- Dropped the stale kernel-hash-% target (undefined var + hardcoded buildID).

Verified: ena (AWS) + gve (GCP) modules present in 7.0.12; the chain boots the
new kernel end to end (test-chain-x86_64 SIGN=1 / MANIFEST=1 / SIGN_ARGS=1 all
pass). The measured linux.efi (and its PCR) changes, as expected for a kernel
bump. aarch64 pins are GPG-verified but not boot-tested here (no aarch64 QEMU
run); same pipeline as x86_64.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A containerized stage2 (keel) needs dm-crypt (encrypted data partition),
dm-verity (integrity-checked read-only runtime over erofs), the overlay
snapshotter, and erofs. Add them (and their deps reed_solomon for dm-verity FEC
and netfs for erofs) to REQUIRED_MODULES so they are bundled in the UKI, and
load them all in init before the modules_disabled latch.

Load the dependency modules explicitly rather than relying on modprobe to
auto-pull them: once modules_disabled is latched a dep that was not already
resolved can never be loaded on demand, so implicit resolution would be a
latent failure. Verified: all six present in kernel-modules-core-7.0.12-201.fc44
and copied (.ko.xz), and the chain boots with all six loading cleanly
(init: modprobe: {dm-crypt,overlay,reed_solomon,dm-verity,netfs,erofs}) through
to stage2.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Vendor the canonical build.mk (from stage0) and replace the inline docker-images + DOCKER_RUN plumbing block with include build.mk. Kept byte-identical across repos via the workspace make sync-harness, guarded by make check-harness. stage1-specific bits (RUNTIME_IMAGE, the DOCKER_OPT_DOCKER socket passthrough) stay in the Makefile. Pure relocation -- make -n expands identically.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
dm-integrity (authenticated-encrypted stage2 /data) plus its async_xor ->
async_tx (ASYNC_CORE) journal deps, and the NVMe disk chain (hkdf ->
nvme-auth/nvme-keyring -> nvme-core -> nvme; EC2 EBS and the harness disk are
NVMe). Added to init and build.sh REQUIRED_MODULES, loaded before the
modules_disabled latch so the stage2 payload finds them resident (it cannot
modprobe once the latch is set).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Pin to the v0.3.0 release commit with a =0.3.0 version guard so the build fails
if the rev ever drifts to a commit whose crate version is not 0.3.0. Matches
the pin in stage2.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@HarryR HarryR marked this pull request as ready for review July 13, 2026 18:03
stage2 settled on confidentiality-only dm-crypt (aes-xts-plain64) for /data, so
the authenticated-encryption path (dm-integrity + its async_xor -> async_tx
journal deps) is unused. Remove those 3 modules from the measured initramfs to
keep the attested boot surface minimal; re-adding them is the documented
extension point for authenticated /data.

Also reword the storage-module comments to describe what each module provides /
can be used for rather than a specific consumer, and drop the stale "keel" name.

Verified: stage2 pivot (XTS /data) still PIVOT_TEST=PASS on the rebuilt UKI, with
dm-integrity absent from the boot.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
HarryR added a commit to lockboot/stage0 that referenced this pull request Jul 13, 2026
## What
Bring the stage0 build image and disk layout in line with the Fedora 44
chain bump, plus stable disk identity.

## Changes
- **rpm + gnupg** added to `Dockerfile.build` so the UKI build can
verify Fedora package GPG signatures (image parity with stage1, kept
byte-identical). No effect on compiled artifacts.
- **Stable lockboot GPT GUIDs + FAT volume-id.** `DISK_GUID` /
`PART_GUID` are now constant across releases (`4c4f434b-424f-4f54-...`,
"LOCKBOOT" + a role index), so the initial GPT is byte-stable (stable
pre-stage2 PCR5) and the boot disk is identifiable by a fixed GUID
rather than by hashing stage0.efi (which changed per release). This is
the stable identity stage2's `find_boot_device` can key on. (stage2
still rewrites the GPT at runtime to add p2/p3, which is why it excludes
PCR5 from its key binding.)
- **Pin `vaportpm-attest` to v0.3.0** (rev + version guard), matching
stage1.
- **Extract the shared `DOCKER_RUN` harness** into `build.mk` (same
refactor as stage1).

## Verification
- Reproducible: GUIDs/timestamps fixed; build output byte-stable.
- No change to the runtime boot path. Pairs with lockboot/stage1#19
(Fedora 44 kernel/stub) and lockboot/stage2#1.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
@HarryR HarryR merged commit f159b88 into main Jul 13, 2026
4 checks passed
@HarryR HarryR deleted the fedora44-kernel-bump branch July 13, 2026 19:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant