From 966002e6a65a7abcef22f1d9cdef2065838e66b2 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Sun, 22 Oct 2023 13:16:07 -0400 Subject: [PATCH] install: Don't require EFI if booted via BIOS and doing alongside Today Anaconda defaults to setting up the bootloader with source == target mode; on x86_64 that means if booted via BIOS the system is installed just with BIOS, and EFI if booted via EFI. When we're doing an alongside install we hence cannot require an ESP. Signed-off-by: Colin Walters --- lib/src/bootloader.rs | 40 ++++++++++++++++++++++++++++++++-------- lib/src/install.rs | 7 ++++++- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/lib/src/bootloader.rs b/lib/src/bootloader.rs index 24d28eda..0f28fa08 100644 --- a/lib/src/bootloader.rs +++ b/lib/src/bootloader.rs @@ -1,4 +1,5 @@ use std::os::unix::prelude::PermissionsExt; +use std::path::Path; use anyhow::{Context, Result}; use camino::Utf8Path; @@ -51,20 +52,43 @@ fn install_grub2_efi(efidir: &Dir, uuid: &str) -> Result<()> { Ok(()) } +/// Return `true` if the system is booted via EFI +pub(crate) fn is_efi_booted() -> Result { + if !super::install::ARCH_USES_EFI { + return Ok(false); + } + Path::new("/sys/firmware/efi") + .try_exists() + .map_err(Into::into) +} + #[context("Installing bootloader")] pub(crate) fn install_via_bootupd( device: &Utf8Path, rootfs: &Utf8Path, boot_uuid: &str, + is_alongside: bool, ) -> Result<()> { let verbose = std::env::var_os("BOOTC_BOOTLOADER_DEBUG").map(|_| "-vvvv"); - let args = ["backend", "install"].into_iter().chain(verbose).chain([ - "--src-root", - "/", - "--device", - device.as_str(), - rootfs.as_str(), - ]); + let using_efi = is_efi_booted()?; + // If we're doing an alongside install on a BIOS-booted system, don't do EFI + let is_bios_only = cfg!(target_arch = "x86_64") && !using_efi && is_alongside; + let component_args = if is_bios_only { + Some("--component=BIOS") + } else { + None + }; + let args = ["backend", "install"] + .into_iter() + .chain(verbose) + .chain(component_args) + .chain([ + "--src-root", + "/", + "--device", + device.as_str(), + rootfs.as_str(), + ]); Task::new_and_run("Running bootupctl to install bootloader", "bootupctl", args)?; let grub2_uuid_contents = format!("set BOOT_UUID=\"{boot_uuid}\"\n"); @@ -73,7 +97,7 @@ pub(crate) fn install_via_bootupd( let bootfs = Dir::open_ambient_dir(bootfs, cap_std::ambient_authority()).context("Opening boot")?; - if super::install::ARCH_USES_EFI { + if super::install::ARCH_USES_EFI && !is_bios_only { let efidir = bootfs.open_dir("efi").context("Opening efi")?; install_grub2_efi(&efidir, &grub2_uuid_contents)?; } diff --git a/lib/src/install.rs b/lib/src/install.rs index 69349c8f..3d8ef2c2 100644 --- a/lib/src/install.rs +++ b/lib/src/install.rs @@ -861,7 +861,12 @@ async fn install_to_filesystem_impl(state: &State, rootfs: &mut RootSetup) -> Re .get_boot_uuid()? .or(rootfs.rootfs_uuid.as_deref()) .ok_or_else(|| anyhow!("No uuid for boot/root"))?; - crate::bootloader::install_via_bootupd(&rootfs.device, &rootfs.rootfs, boot_uuid)?; + crate::bootloader::install_via_bootupd( + &rootfs.device, + &rootfs.rootfs, + boot_uuid, + rootfs.is_alongside, + )?; tracing::debug!("Installed bootloader"); // If Ignition is specified, enable it