Skip to content

Commit

Permalink
install: Don't require EFI if booted via BIOS and doing alongside
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
cgwalters committed Oct 23, 2023
1 parent b3e35c4 commit 966002e
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 9 deletions.
40 changes: 32 additions & 8 deletions lib/src/bootloader.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use std::os::unix::prelude::PermissionsExt;
use std::path::Path;

use anyhow::{Context, Result};
use camino::Utf8Path;
Expand Down Expand Up @@ -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<bool> {
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");
Expand All @@ -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)?;
}
Expand Down
7 changes: 6 additions & 1 deletion lib/src/install.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 966002e

Please sign in to comment.