Skip to content

feat(iso): embed installer payload as OCI layout inside the live root image - #5

Merged
leandromqrs merged 5 commits into
mainfrom
feat/oci-payload-in-live-root
Jul 21, 2026
Merged

feat(iso): embed installer payload as OCI layout inside the live root image#5
leandromqrs merged 5 commits into
mainfrom
feat/oci-payload-in-live-root

Conversation

@leandromqrs

Copy link
Copy Markdown
Member

Summary

Moves the installer payload embedding from an osbuild manifest patch into the -iso container image itself: the payload is exported as an OCI layout with skopeo copy before the container build (Justfile locally, a workflow step in CI) and COPYed into the live root at /usr/lib/luminusos/payload.oci.

Upstream discussion: osbuild/image-builder#2536: this implements the container-side embedding suggested by @supakeen and is compatible with osbuild/image-builder#2414 (generic ISO rework that drops --bootc-installer-payload-ref): we no longer pass any payload flag to image-builder at all.

Supersedes the manifest-patch approach from #4: package iso and ci-package.sh are plain image-builder build bootc-generic-iso --bootc-ref invocations again, and tools/patch-iso-payload-to-oci.sh is removed.

Why

The containers-storage payload embed forces bootc install to re-diff and re-tar every layer into a RAM-backed /var/tmp (~2.5 GiB) on the live ISO. With the OCI layout, install streams the ready-made blobs straight to disk:

containers-storage embed OCI layout (this PR)
ISO size 3.07 GiB 3.90 GiB (+27%)
Install-time RAM ~6 GB (staging in tmpfs) live session only (~2-4 GB)
image-builder involvement payload flag required none

The ISO growth is the dedup tradeoff: with containers-storage the payload lives unpacked inside the squashfs and mksquashfs dedups it against the nearly identical live rootfs; pre-compressed OCI blobs can be neither recompressed nor deduped. Worth it: a full install completed successfully in a 4 GB RAM VM.

Details

  • Containerfile.installer copies .test/payload.oci into the live root and the final verification asserts the OCI index.json carries the org.opencontainers.image.ref.name: "latest" annotation that bootc install --source-imgref oci:...:latest resolves against (an untagged skopeo copy oci: writes no ref name and fails with no descriptor found for reference "latest").
  • Local flow: just build workstation-iso exports the payload from local containers-storage before buildah bud.
  • CI flow: a new publish.yml step exports the payload from GHCR with skopeo (reusing the docker/login-action credentials); the ISO job uses the simplified ci-package.sh.
  • Also included: comment/banner cleanup and two small Justfile refactors (single buildah invocation site, readable qcow2 disk-layout check).

Testing

  • tests/run.sh passes.
  • Local end-to-end: just build workstation-iso + just package iso → ISO boots to Sirius → full install completed in a 4 GB RAM QEMU VM (UEFI).

Instead of image-builder's containers-storage payload embed (which
forces bootc install to re-tar ~2.5 GiB into a RAM-backed /var/tmp),
the -iso container now carries the payload as an OCI layout at
/usr/lib/luminusos/payload.oci, exported into the build context with
skopeo beforehand (Justfile locally, a workflow step in CI) and COPYed
into the live root. bootc install streams the blobs straight to disk,
so the RAM floor drops to what the live GNOME session needs; a full
install was verified in a 4 GB RAM VM.

This also removes the osbuild manifest patching entirely: packaging is
a plain image-builder bootc-generic-iso run again, with no
--bootc-installer-payload-ref, so it keeps working even if upstream
drops payload embedding from the generic ISO (osbuild/image-builder#2414).

The final container verification asserts the embedded index.json carries
the :latest ref name annotation that bootc resolves against. Redundant
comments in the touched scripts and Containerfile were trimmed.
@leandromqrs
leandromqrs merged commit eb20eee into main Jul 21, 2026
6 checks passed
@leandromqrs
leandromqrs deleted the feat/oci-payload-in-live-root branch July 21, 2026 18:19
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