UKI Cleanup#2200
Conversation
There was a problem hiding this comment.
Code Review
This pull request refactors the UKI (Unified Kernel Image) build process to support passing explicit kernel and initramfs paths via CLI arguments, reducing reliance on auto-discovery within the rootfs. Key changes include updating the seal-uki and finalize-uki scripts to use named arguments, modifying Dockerfile stages to extract and clean up kernel components, and extending the Rust library and CLI to handle the new parameters. Review feedback identified a potential path resolution bug in the Rust file existence checks, a filename mismatch in the upgrade test Dockerfile, and suggested improvements for error handling and validation in the seal-uki script.
cb42d78 to
8a3ed64
Compare
66dc0e3 to
3a9dc2b
Compare
3a9dc2b to
8e581d4
Compare
8e581d4 to
503b07a
Compare
|
I think we should have the kernel and initrd as required arguments and thus only support the case where they are not in the rootfs anymore as I don't see a use case where someone would want a sealed image with both a UKI and split out kernel and initrd. Edit: That would break the current |
|
Hmm. I kind of lean towards not breaking it at least right away, it seems really easy to continue to support what we have now too. We could mark it deprecated though. |
503b07a to
8a5c7ae
Compare
|
Failures are transient & volatile related. Maybe from #2201? |
8a5c7ae to
cc8a2d8
Compare
f2c3424 to
667a0fd
Compare
Don't know if clap has a way to do this, if it does I couldn't find it. We just print our custom warning if |
4d6bed6 to
20e2fed
Compare
aa321cd to
c392676
Compare
|
Flake reran |
Now that we can pass kernel and initrd paths to `bootc ukify`, rework our UKI Dockerfile to remove kernel + initrd from the final layer and only keep the UKI This still will not *remove* the kernel + initrd from the tarball but have whiteout instead See bootc-dev#2027 (comment) Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
vmlinuz and intrd should not be present in UKI images; add test for the same Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
So we can just use bootc to extract the `.linux` and `.initrd` sections from the UKI and not have to use objcopy Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
This command is equivalent to
`mv /target-root/usr/lib/modules/$kver/{vmlinuz,initramfs.img} /out/$kver`
We could just use `mv`, but having an actual bootc cmd is cleaner
Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
c392676 to
707b64e
Compare
Since we do not want kernel + initrd in the final UKI dockerfile, we now build the initrd inside the `target-rootfs` generated by `bootc-base-imagectl`. Instead of rebuilding the initrd ourselves, now we add `/var/usr` directory to the target-rootfs with `--add-dir` cli option to bootc-base-imagectl. This directory contains our rpms and other configs required for building the initramfs After that's done we split the rootfs and vmlinuz + initrd into /target-rootfs and /kernel/$kver respectively Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
Now since we need to build our initramfs before the `fetch` build stage, we need packages built first as we need `bootc` and `bootc-initramfs-setup` binaries Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
We do not want to use `--nodeps` for installing our built rpms in the target-rootfs. So, we create a new dnf repo in `/tmp/localrepo`, copy our rpms in there and set it's priority as highest. We pass `--install bootc` to bootc-base-imagectl which will install from our newly created repo ensuring we have the latest binaries in the final image Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
The three-devices-partial-ESP scenario fails with "No device found for /dev/loop1p1" because the dual-ESP test's cleanup leaves stale kernel partition nodes and LVM device registrations. The prior cleanup called `pvremove -f $loop` on the loop device itself (e.g. /dev/loop0) instead of on the partitions where PVs actually live (e.g. /dev/loop0p2), making it a no-op. After `losetup -d`, the kernel retained busy partition nodes. When the next test reused the loop device with a different partition layout, `partx -u` tried to atomically reconcile old and new partitions — but could not remove the busy stale partition bootc-dev#2, so it aborted entirely without adding the new partition #1. Fix both cleanup and setup: Cleanup: - pvremove on actual partition devices (p1/p2/p3), not the loop device - wipefs -a on each partition to clear signatures holding references - udevadm settle to let udev finish processing - partx -d to remove kernel partition entries before losetup -d - Remove /etc/lvm/devices/system.devices to clear stale device IDs Setup (setup_disk_with_partitions, setup_disk_with_root): - Replace `partx -u` with `partx -d` (ignore errors) then `partx -a`, so a stuck stale partition does not block adding new ones - Replace `sleep 1sec` with `udevadm settle` for reliable synchronization Co-Authored-By: Claude Opus 4.6 Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
707b64e to
eecbb11
Compare
|
[centos-9,ostree] failed with and [centos-10,ostree] failed with I have reran, but not sure if the second one is a flake or not... |
|
I can't view the merge queue results until another merge is performed. Is this a new github bug? |
|
So this test passes for ostree v2026.1 but fails for v2026.2. I am not sure where the actual issue is. I see this that has ostreedev/ostree#3583 some kargs related changes... @jmarrero any ideas? |
|
The issue is something else ig, these should be the final kargs kargs_refs: ["root=UUID=2d5a2f0d-6647-463e-b080-b3c0500909de", "rw", "localtestkarg=somevalue", "otherlocalkarg=42", "kargsd-test=1", "kargsd-othertest=2", "console=ttyS0,115200n8", "testing-
kargsd=3", "console=hvc0","ostree=/ostree/boot.1/default/733c008a844763a44d0056779d575fc37a97997f8f6f60af38c73094ccb1f526/0"]but I still have my karg in the staged deployment file |
ukify: Allow passing custom kernel, initramfs
While building a sealed UKI image we'd want to remove the original
kernel + initramfs from the final image and have only the final UKI
present. This was not possible before as
bootc container ukifyexpected kernel + initramfs to be present in
usr/lib/modulesofcontainer root
Fixes: #2185
dockerfile/uki: Rework to remove kernel + initrd
Now that we can pass kernel and initrd paths to
bootc ukify, reworkour UKI Dockerfile to remove kernel + initrd from the final layer
and only keep the UKI
This still will not remove the kernel + initrd from the tarball but
have whiteout instead
See #2027 (comment)
test/integration: Test vmlinuz non-existence with UKI
vmlinuz and intrd should not be present in UKI images; add test for the
same