install: Enable installing to multi device parents#1911
install: Enable installing to multi device parents#1911ckyrouac wants to merge 6 commits intobootc-dev:mainfrom
Conversation
There was a problem hiding this comment.
Code Review
This pull request successfully enables installing to multi-device parent filesystems, such as LVM spanning multiple disks. It correctly discovers all parent devices and, for bootupd/GRUB, installs the bootloader to all devices with an ESP partition. For bootloaders that only support single-device configurations like systemd-boot and zipl, the implementation correctly defaults to using the first available device. The changes are well-architected, adapting data structures and logic to handle multiple devices. A new, thorough integration test validates both single and dual ESP scenarios. Overall, this is a solid enhancement with good error handling and logging. I have one suggestion to further improve the robustness of ESP detection.
f2a175a to
f7b1892
Compare
|
waiting to merge until the patch release goes out |
77b65cb to
d03c6fa
Compare
d03c6fa to
9b1c313
Compare
6802697 to
081f3b2
Compare
081f3b2 to
9d0e284
Compare
9d0e284 to
4ccc192
Compare
| # See https://tmt.readthedocs.io/en/stable/stories/features.html#reboot-during-test | ||
| match $env.TMT_REBOOT_COUNT? { | ||
| null | "0" => test_single_esp, | ||
| "1" => { test_dual_esp; test_three_devices_partial_esp; tmt-reboot }, |
There was a problem hiding this comment.
How about add another test scenario like RAID1 that using the whole disks (see coreos/bootupd#1059), for example:
root@localhost-live:/home/fedora# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vda 253:0 0 30G 0 disk
└─md126 9:126 0 30G 0 raid1
├─md126p1 259:0 0 477M 0 part
├─md126p2 259:1 0 954M 0 part /boot
└─md126p3 259:2 0 28.6G 0 part /
vdb 253:16 0 30G 0 disk
└─md126 9:126 0 30G 0 raid1
├─md126p1 259:0 0 477M 0 part
├─md126p2 259:1 0 954M 0 part /boot
└─md126p3 259:2 0 28.6G 0 part /
To create RAID1 using command:
sudo mdadm -CR /dev/md126 -e 1 -l1 -n 2 /dev/loop0 /dev/loop1 --assume-clean
541691d to
baa6c67
Compare
8f69693 to
1794593
Compare
cgwalters
left a comment
There was a problem hiding this comment.
Looks sane to me, I have just nits really that are nonblocking, we can fix in followups too.
| BwrapCmd::new(&target_root) | ||
| .setenv( | ||
| "PATH", | ||
| "/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin", |
There was a problem hiding this comment.
Let's use a shared const for this or perhaps better have set_default_path() on BwrapCmd
| CLOUDEOF | ||
| fi | ||
|
|
||
| # Temporary: update bootupd from @CoreOS/continuous copr until |
There was a problem hiding this comment.
This is a bit tricky as we probably also want to CI test the case without the new bootupd too...
I know, another matrix entry in theory...
I guess it'll be tested in post submits by the workflow test.
| # Test that bootc install to-existing-root can find and use ESP partitions | ||
| # when the root filesystem spans multiple backing devices (e.g., LVM across disks). | ||
| # | ||
| # Five scenarios are tested across three reboot cycles: |
There was a problem hiding this comment.
We're just testing installation to loopback, AFAICS there's no reason to reboot the host.
That said what would be a stronger test here is for us to test these setups probably via Anaconda where we boot into a guest VM with that. I tried to streamline this in bootc-dev/bcvk#202 but yeah it needs a bit of work.
I guess one thing we could do is extend the anaconda stuff we already have here in our integration tests.
Yet a different alternative is we ask tmt to directly support kickstart (and copy over some of the bcvk smarts there re mounting host container storage via virtiofs etc).
eff75ad to
9da140b
Compare
Assisted-by: Claude Code (Opus 4) Signed-off-by: ckyrouac <ckyrouac@redhat.com>
The composefs BLS and UKI boot setup paths called find_partition_of_esp() directly on the device, which fails when the root filesystem is on an LVM logical volume (the ESP is on the parent disk, not the LV). The store module had the same issue via require_single_root() + find_partition_of_esp(). Switch all call sites to find_colocated_esps() which walks up to the physical disk(s) via find_all_roots() before searching for the ESP, consistent with what install_systemd_boot and mount_esp_part already do. Assisted-by: Claude Code (Opus 4) Signed-off-by: ckyrouac <ckyrouac@redhat.com>
The test was using `get_target_image` which returns the upstream `docker://quay.io/centos-bootc/centos-bootc:stream10`. On composefs+grub variants provisioned with an updated bootupd from copr, the upstream image has stock bootupd with incompatible EFI update metadata, causing the install to fail with "Failed to find EFI update metadata". Switch to using `containers-storage:localhost/bootc` (the locally-built image), matching the pattern used by test-32, test-37, and test-38. The locally-built image has the updated bootupd with compatible metadata. Assisted-by: Claude Code (Opus 4) Signed-off-by: ckyrouac <ckyrouac@redhat.com>
The initial change to use locally-built images had two additional issues
on composefs:
1. containers-storage: transport fails on composefs's read-only root
with "mkdir /.local: read-only file system". Fix by exporting the
image to an OCI layout directory on writable /var/tmp instead.
2. run_install() was masking /sysroot/ostree and removing bootupd update
metadata, which composefs needs for bootloader installation and boot
binaries. Fix by making run_install() skip these ostree-specific
workarounds on composefs systems.
Note: the composefs install-outside-container code path still has a
separate bug ("Shared boot binaries not found" in boot.rs:745) that
needs fixing in the Rust code.
Assisted-by: Claude Code (Opus 4)
Signed-off-by: ckyrouac <ckyrouac@redhat.com>
find_vmlinuz_initrd_duplicates() reads the host's /sysroot/state/deploy to find existing deployments with matching boot digests. During a fresh install (not an upgrade), the host's own deployment data matches the boot digest, but the target disk has no existing boot entries yet. This caused "Shared boot binaries not found" when installing outside a container on a composefs+grub system. Fix by only performing the duplicate check during upgrades, where shared boot binaries on the target actually exist. Assisted-by: Claude Code (Opus 4) Signed-off-by: ckyrouac <ckyrouac@redhat.com>
The multi-device ESP test creates ESP partitions and expects bootupd to install a UEFI bootloader. On BIOS-booted systems, bootupd instead tries to install GRUB for i386-pc, which requires a BIOS Boot Partition and fails. The test plan already requests UEFI provisioning via the hardware hint, but Testing Farm does not always honor this on CentOS Stream x86_64. Add a runtime check for /sys/firmware/efi so the test skips gracefully on BIOS hosts rather than failing. Assisted-by: Claude Code (Opus 4.6) Signed-off-by: ckyrouac <ckyrouac@redhat.com>
9da140b to
b7d4d61
Compare
When the root filesystem spans multiple backing devices (e.g., LVM across multiple disks), discover all parent devices and find ESP partitions on each. For bootupd/GRUB, install the bootloader to all devices with an ESP partition, enabling boot from any disk in a multi-disk setup. systemd-boot and zipl only support single-device configurations.
This adds a new integration test validating both single-ESP and dual-ESP multi-device scenarios.
Fixes: #481
Assisted-by: Claude Code (Opus 4.5)