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