Skip to content

AIL-418: feat(iso): switch osbuilder → AuroraBoot v0.26.2 for +build-iso and +build-uki-iso - #738

Merged
vipsharm merged 11 commits into
vipsharm-GPUfrom
AIL-AuroraBootISO
Aug 6, 2026
Merged

AIL-418: feat(iso): switch osbuilder → AuroraBoot v0.26.2 for +build-iso and +build-uki-iso#738
vipsharm merged 11 commits into
vipsharm-GPUfrom
AIL-AuroraBootISO

Conversation

@vipsharm

@vipsharm vipsharm commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Summary

Migrates CanvOS ISO builds off the archived kairos-io/osbuilder (quay.io/kairos/osbuilder-tools) onto the maintained kairos-io/AuroraBoot v0.26.2. Fixes UEFI-only boot on strict firmware (SuperMicro ATEN BMC, VMware ESXi/Workstation, OVMF/QEMU) that previously refused CanvOS ISOs with "No compatible bootloader found" or a silent hang.

Ticket: AIL-418

Why now

  1. kairos-io/osbuilder and kairos-io/enki are both archived. Our ISO toolchain had no upstream to accept fixes.
  2. Multiple customer-facing UEFI-only boot failures were caused by two independent defects in the osbuilder / kairos-sdk code paths (wrong signed GRUB variant on the ESP, and MBR-only ISO layout). AuroraBoot v0.26.2 (PR fix(iso): make live ISOs boot on strict UEFI firmware kairos-io/AuroraBoot#713) fixes both upstream after our RCA to the Kairos team.
  3. AuroraBoot is already used in CanvOS for +cloud-image and +kairos-raw-image; the ISO path was the last piece still on osbuilder.

What ends up in the tree

Commit Purpose
4e59375 Cherry-pick Arvind's overlay/files-iso/boot/grub2/grub.cfg cleanup — three grub.cfg defects fixed (vga=795 gated to BIOS, gfxterm loadfont gated to BIOS, search corrected to /boot/kernel)
978a633 Switch +build-iso and +build-uki-iso from $OSBUILDER_IMAGE to $AURORABOOT_IMAGE (v0.26.1 initially)
a179757/c8ed02b/b25262e Normalize the produced ISO's filename — AuroraBoot's --override-name/--output are inert for dir: sources, so we mv /tmp/auroraboot/*.iso /iso/$ISO_NAME.iso ourselves
629a565 Bump AURORABOOT_VERSION to v0.26.2 and drop every UEFI-only-boot workaround (CD-variant GRUB swap in +iso-image, MAAS guard, xorriso GPT + -add post-process, overlay/files-iso/boot/grub/grub.cfg stub) — upstream v0.26.2 fixes both root causes and writes /boot/grub/grub.cfg itself
9de6067 Add a targeted xorriso overlay-injection step in +build-iso — required because AuroraBoot's build-iso subcommand never calls StepInjectCC, so --overlay-iso silently drops overlay files. Filed as kairos-io/kairos#4283 and PR kairos-io/AuroraBoot#716

Net Earthfile diff vs vipsharm-GPU: +build-iso and +build-uki-iso switched to AuroraBoot; a small xorriso post-process step in +build-iso mimics AuroraBoot's own InjectISO code until the upstream PR merges.

Local workarounds still shipping

Two remain, both cheap and both filed upstream:

  1. xorriso overlay-injection post-process in +build-iso (9de6067). Runs

    xorriso -indev X -outdev X -map /overlay / -boot_image any replay
    

    after the AuroraBoot build. Same command AuroraBoot itself uses in InjectISO. Upstream fix in fix(build-iso): apply --overlay-iso via StepInjectCC + run xorriso when only overlay is present kairos-io/AuroraBoot#716 (one-line addition of d.StepInjectCC to the subcommand step list) — merges will let us drop this.

  2. mv /tmp/auroraboot/*.iso /iso/$ISO_NAME.iso (a179757+b25262e). AuroraBoot's --output and --override-name are inert for dir: sources. Cosmetic. Tracked in AuroraBoot: build-iso --output and --override-name silently ignored for dir: sources kairos-io/kairos#4284.

Upstream issues + PR filed

Kairos AuroraBoot v0.26.2 fixed the UEFI boot part after our RCA landed with the maintainers.

Verification

  • QEMU + OVMF (jump host): ISO boots to GRUB menu, kernel loads, installer launches ✓
  • ISO structural comparison against Ubuntu 24.04.3 live-server (via fdisk -l + xorriso -report_el_torito): matches (GPT hybrid + El Torito UEFI, CD-variant grub binary) ✓
  • ESP contents: /EFI/BOOT/grubx64.efi is 2,328,456 bytes (CD variant gcdx64.efi.signed), was 2,660,232 bytes (installed-system variant) pre-fix ✓
  • Overlay files reach the ISO tree: /boot/grub2/grub.cfg is the Palette-branded version from our overlay, verified via extract ✓
  • Not yet verified end-to-end: install-and-reboot on real hardware. Pipeline ISO in appliance-builder run 31126547352 currently in flight; SuperMicro boot test still pending.

Merge conflict

There's a conflict against current vipsharm-GPU tip (6244171 — AIL-376 AMD GPU driver default bump) in overlay/files-iso/boot/grub2/grub.cfg:

  • Their change: removed pci=realloc=off from three menuentry kernel cmdlines.
  • Our change: refactored the same file to branch $consoleparams/$videoparams on ${grub_platform} and gated loadfont to BIOS.

Both changes are legitimate and non-overlapping in intent. Resolution: keep the EFI/BIOS branching structure and drop pci=realloc=off from all three entries. Happy to push the resolution commit when this PR opens.

Related

  • Companion AIL-AuroraBootISO test on appliance-builder: branch vipsharm-test-ail-auroraboot-iso with CANVOS_BRANCH="AIL-AuroraBootISO" — do NOT merge; revert to CANVOS_BRANCH="vipsharm-GPU" once this PR lands.

🤖 Co-authored-by: Claude Opus 4.7 noreply@anthropic.com

arvind-sys and others added 11 commits August 3, 2026 20:07
kairos-io/osbuilder and kairos-io/enki are both archived, so the
osbuilder-tools image we've built ISOs against for years has no
maintained upstream. Switch to quay.io/kairos/auroraboot:v0.26.1
(kairos-io/AuroraBoot), the maintained successor.

Only +build-iso and +build-uki-iso move. +uki-genkey and
+build-provider-trustedboot-image still call the osbuilder entrypoint;
they touch container/UKI artifacts, not ISOs, and can migrate
separately once the ISO switch is boot-verified.

Mapping (osbuilder -> AuroraBoot):
  /entrypoint.sh build-iso  -> auroraboot build-iso
    --name                  -> --override-name
    --arch x86_64           -> --arch amd64 (Go arch names)
  enki build-uki -t iso     -> auroraboot build-uki -t iso
    -k /keys (bundled)      -> --public-keys / --sb-key /
                               --sb-cert / --tpm-pcr-private-key
                               (all still under /keys because the
                               three secure-boot/* source dirs are
                               flattened into the same COPY target)

Bonuses from the AuroraBoot base image (Fedora 44):
  - xorriso 1.5.8.pl02 (osbuilder-tools ships 1.4.6, which the
    Supermicro ATEN BMC virtual CD refuses to boot). This is the
    xorriso fix vipsharm-isofix built from source; no longer needed.
  - Actively maintained; kairos-sdk fixes land here.

Caveat: AuroraBoot still selects grubx64.efi.signed (installed-system
variant, prefix /EFI/ubuntu) via kairos-sdk utils.GetEfiGrubFiles.
That binary hangs immediately on Supermicro UEFI. This switch does
not fix defect 1 from the UEFI investigation on its own. Verifying
that on real hardware is the next step; if it reproduces, the
CD-variant swap workaround from vipsharm-isofix 22e00cb / 0a80d30
gets ported.

The grub.cfg cleanup (previous commit, ex-3faff86) is independent
of the toolchain switch and rides along.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AuroraBoot v0.26.1's --override-name is not honored for "dir:" sources
(only image sources). A build-iso against dir:/build/image landed as
kairos-ubuntu-24.04-core-amd64-generic-v4.0.4.iso in /iso/, and the
subsequent

    RUN sha256sum \$ISO_NAME.iso > \$ISO_NAME.iso.sha256

failed with "No such file or directory".

Rename /iso/*.iso to \$ISO_NAME.iso before checksumming, matching what
+build-uki-iso has done all along. This decouples us from whatever
naming scheme AuroraBoot uses internally.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AuroraBoot v0.26.1's --output flag on build-iso is ignored for "dir:"
sources: the log line "Generating iso '...' to '/tmp/auroraboot'"
confirmed the ISO drops under /tmp/auroraboot, not /iso/, so
`mv /iso/*.iso ...` failed with "cannot stat '/iso/*.iso'".

Search /iso, /tmp/auroraboot, and (fall back) the whole filesystem for
a .iso and move it into /iso/\$ISO_NAME.iso. Applied to both +build-iso
and +build-uki-iso so we're covered if build-uki -d has the same bug.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…rename

Both --output on build-iso and -d on build-uki are silently ignored by
AuroraBoot v0.26.1 for "dir:" sources -- the ISO always drops at
/tmp/auroraboot/*.iso. Two builds in a row confirmed the location, so
drop the fallback find-tree and just mv from /tmp/auroraboot directly.

Also drops --override-name (also inert for dir: sources on build-iso)
so the invocation reads honestly.

No behavior change -- the previous fallback path already worked. This
is just less noisy shell.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Ubuntu's grub-efi-*-signed package contains two signed GRUB builds:

  grubx64.efi.signed  prefix /EFI/ubuntu  - for systems installed to disk
  gcdx64.efi.signed   prefix /boot/grub   - for CD / removable media

osbuilder's copyGrub walks a hardcoded candidate list (kairos-sdk
utils.GetEfiGrubFiles), takes the first path that exists, and names the
destination after the source. On Ubuntu that always resolves to
grubx64.efi.signed - there is no gcd candidate in the list at all - so our
ISOs ship the installed-system binary.

That binary hangs immediately when launched from removable media on UEFI
firmware. Reproduced on Supermicro with an ATEN BMC: the firmware mounts the
ESP correctly and reads both binaries, then executes nothing. Launching
either EFI\BOOT\bootx64.efi or EFI\BOOT\grubx64.efi by hand from the UEFI
Shell hangs with no output, with Secure Boot disabled. Only Dual/CSM boot
ever worked, because that path uses the BIOS El Torito image and never
touches this binary.

It is not a version problem: ubuntu-24.04.3-live-server ships the identical
GRUB package version (2.12-1ubuntu7.3) and boots on the same hardware.
Substituting its gcd build into our ESP makes GRUB run on every boot.

Changes:

- Earthfile (+iso-image): stage the CD variant over the path osbuilder reads.
  Applied to the ISO rootfs only - cloud/raw disk images are installed
  systems and must keep the original binary. Handles x86_64 and arm64, and
  is a no-op on bases that do not ship the gcd build.

- overlay/files-iso/boot/grub/grub.cfg: new stub. The CD-variant GRUB
  resolves its /boot/grub prefix against the ISO9660 volume, so it needs a
  config there; without it GRUB starts and drops to a rescue prompt. Hands
  off to the existing /boot/grub2/grub.cfg.

This is a workaround, not a fix: kairos-io/osbuilder and kairos-io/enki are
both archived, so the candidate list cannot be corrected upstream. The
durable option is migrating ISO builds to AuroraBoot, which is maintained
but inherits the same defect via kairos-sdk.

Verified by hand-patching an ISO (CD-variant GRUB + this stub + the grub.cfg
fixes in the previous commit): boots unattended in pure UEFI, menu renders on
the EFI console, kernel boots with visible output. NOT yet verified through a
CanvOS pipeline build.
+kairos-raw-image invokes +iso-image with no arguments (Earthfile:1259),
so IS_CLOUD_IMAGE stays at its default of false. The 22e00cb guard
IS_CLOUD_IMAGE=false therefore fires on MAAS builds too, replacing
grubx64.efi.signed with the CD variant. AuroraBoot then writes that
into the raw disk image's ESP, and a MAAS-deployed machine boots into
the CD-variant GRUB, which looks for /boot/grub/grub.cfg on the
installed disk and drops to a rescue prompt when it isn't there.

Widen the guard to also skip when IS_MAAS=true. IS_MAAS is a top-level
ARG (Earthfile:124) that already propagates into +iso-image on MAAS
builds, so no call-site change is needed.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…t overlay files

AuroraBoot v0.26.1's build-iso has two ISO-side defects that block boot
on strict UEFI firmwares:

1. Produces a plain-MBR ISO with El Torito + a 0xEF appended-partition
   ESP entry. Works on lenient firmwares, but VMware ESXi/Workstation,
   OVMF/QEMU, and some SuperMicro BMC virtual CD implementations reject
   it as "No compatible bootloader found" because they only look for
   the ESP via a GPT partition entry. Ubuntu 24.04.3's live ISO uses
   hybrid GPT + protective MBR for exactly this reason and boots
   everywhere.

2. --overlay-iso is silently a no-op for "dir:" sources -- files placed
   under /overlay do NOT make it onto the ISO tree. Diagnosed by
   comparing overlay/files-iso/boot/grub2/grub.cfg (Palette-branded)
   with the same path on the built ISO (Kairos-branded default), and by
   finding /boot/grub/grub.cfg entirely missing. That in turn drops the
   CD-variant GRUB stub (from 22e00cb), the customized menu, user-data,
   content bundles, cluster config, and edge_custom_config.

Fix: xorriso repack after the auroraboot run.

  -boot_image any appended_part_as=gpt
    Converts the appended ESP into a GPT partition entry and emits a
    protective MBR. UEFI firmware can now discover it.

  -add $OVERLAY_SPECS --
    Enumerates every file under /overlay and inject-adds each to the
    ISO tree at its expected location. Also functions as the "pending
    change" that lets xorriso commit (without a tree change it would
    refuse with "No image modifications pending").

  -overwrite on
    Some overlay files (like /boot/grub2/grub.cfg) already exist on
    the ISO tree with AuroraBoot's default content; -overwrite on lets
    -add replace them cleanly.

Verified on the jump host: repacked ISO boots to GRUB menu in QEMU +
OVMF and in VMware VM (Ubuntu 24.04.3 also broken on that VM until GPT
was added).

Only touches +build-iso. +build-uki-iso uses auroraboot build-uki -t iso
which is a different upstream code path and may or may not have the same
defects -- to be evaluated when UKI ISOs are next boot-tested.

Also filed for upstream: kairos-io/AuroraBoot issue on --overlay-iso
being ignored, and kairos-io/kairos-sdk issue on GetEfiGrubFiles never
picking the gcd/CD-variant signed binary.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…hem upstream

kairos-io/AuroraBoot v0.26.2 (PR #713) fixes the two defects that were
blocking UEFI-only ISO boot, exactly as our RCA identified:

  * appended_part_as=gpt is now passed to xorriso, so ISOs get a GPT
    header alongside the protective MBR (fixes VMware ESXi/Workstation
    EFI, OVMF/QEMU, some SuperMicro BMC virtual-CD firmwares that
    previously reported "No compatible bootloader found").
  * Live ISOs now prefer gcdx64.efi.signed / gcdaa64.efi.signed
    (CD-variant grub with prefix /boot/grub and iso9660 baked in)
    over grubx64.efi.signed (installed-system grub, prefix /EFI/ubuntu
    with no iso9660). cleanupGrubName renames gcd*.efi to grub*.efi
    on copy so shim chainloading still works under Secure Boot.
  * A /boot/grub/grub.cfg stub is written by AuroraBoot itself, both
    in the EFI image (USB path) and on the ISO9660 root (CD path).
  * Bumps kairos-sdk to v0.25.2 which carries the sdk-side changes.

With upstream fixed we can drop every local workaround:

  Earthfile (+iso-image): remove the CD-variant GRUB swap block
    (was: cp gcdx64.efi.signed over grubx64.efi.signed, guarded by
    IS_CLOUD_IMAGE=false && IS_MAAS=false). AuroraBoot now picks the
    right binary itself for live media, and doesn't touch the
    installed-system variant that raw-disk/MAAS builds depend on --
    the MAAS guard becomes moot along with the swap.

  Earthfile (+build-iso): remove the xorriso post-process step that
    added GPT via appended_part_as=gpt and injected every overlay/
    file with -add. GPT is now emitted natively; --overlay-iso keeps
    the same behaviour it had (documented separately; not blocking
    us because AuroraBoot's own /boot/grub/grub.cfg + /boot/grub2/
    grub.cfg cover the boot chain).

  overlay/files-iso/boot/grub/grub.cfg: delete. Was our stub telling
    the CD-variant GRUB where to find its real config; AuroraBoot now
    writes an equivalent file itself.

AURORABOOT_VERSION v0.26.1 -> v0.26.2.

Verified path is now: FROM auroraboot:v0.26.2 -> build-iso dir:... ->
mv /tmp/auroraboot/*.iso /iso/\$ISO_NAME.iso -> sha256sum. No
post-processing.

Not yet verified end-to-end (rebuild + boot in QEMU/OVMF and VMware
UEFI expected) -- filing this as the trust-upstream state and will
test right after.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…iso subcommand skips StepInjectCC

Empirically: AuroraBoot v0.26.2 subcommand \`build-iso dir:...\`
with --overlay-iso produces an ISO whose /boot/grub2/grub.cfg is
AuroraBoot's default "Kairos"-branded template rather than our
overlay's "Palette eXtended Kubernetes Edge Installer" version.
Confirmed by extracting the file from the built ISO.

Root cause (pkg/ops/iso.go, internal/cmd/build-iso.go): the build-iso
subcommand runs only

    PrepDirs -> StepCopyCloudConfig -> StepDumpSource -> StepGenISO

and never calls StepInjectCC. StepInjectCC is where AuroraBoot's
InjectISO() function xorriso-maps the overlay directory onto the
finalised ISO tree. Without it, --overlay-iso silently discards
every file we put under /overlay/ -- not just the grub menu, but
also user-data, cluster config (spc.tgz), content bundles, and
edge_custom_config.

Two ways to fix:

  1. Switch +build-iso to AuroraBoot pipeline mode (docker run
     auroraboot --set container_image=... --set iso.overlay_iso=...
     --cloud-config ...). This invokes StepInjectCC. But it's a
     ~100-line rewrite involving DinD, container_image loading, and
     matches the pattern +cloud-image / +kairos-raw-image already
     use.

  2. Do StepInjectCC's actual work ourselves inline. Its whole body
     is one xorriso command:

        xorriso -indev X -outdev X -map <overlay> / \
                -boot_image any replay

     No DinD, no rewrite. Same result.

Going with (2). Small, isolated, uses the same xorriso invocation
the upstream code path does, and can be trivially deleted the day
StepInjectCC is wired into the subcommand path.

Doesn't touch +build-uki-iso; that uses build-uki -t iso which is a
separate code path.

Filed separately as an upstream issue on kairos-io/AuroraBoot
(subcommand build-iso should call StepInjectCC too, or --overlay-iso
should be honored end-to-end within StepGenISO).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@vipsharm
vipsharm requested review from abhinavnagaraj, nianyush and rishi-anand and removed request for nianyush August 6, 2026 22:40
@vipsharm
vipsharm merged commit 30d2141 into vipsharm-GPU Aug 6, 2026
1 of 2 checks passed
@vipsharm
vipsharm deleted the AIL-AuroraBootISO branch August 6, 2026 22:56
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.

3 participants