diff --git a/crates/lib/src/install.rs b/crates/lib/src/install.rs index dec2e0fc3..ce685fb3b 100644 --- a/crates/lib/src/install.rs +++ b/crates/lib/src/install.rs @@ -1073,6 +1073,7 @@ pub(crate) struct RootSetup { pub(crate) physical_root_path: Utf8PathBuf, /// Directory file descriptor for the above physical root. pub(crate) physical_root: Dir, + pub(crate) target_root_path: Option, pub(crate) rootfs_uuid: Option, /// True if we should skip finalizing skip_finalize: bool, @@ -1514,7 +1515,10 @@ async fn install_with_sysroot( Bootloader::Grub => { crate::bootloader::install_via_bootupd( &rootfs.device_info, - &rootfs.physical_root_path, + &rootfs + .target_root_path + .clone() + .unwrap_or(rootfs.physical_root_path.clone()), &state.config_opts, Some(&deployment_path.as_str()), )?; @@ -1986,6 +1990,7 @@ pub(crate) async fn install_to_filesystem( .context("Mounting host / to {ALONGSIDE_ROOT_MOUNT}")?; } + let target_root_path = &fsopts.root_path.clone(); // Check that the target is a directory { let root_path = &fsopts.root_path; @@ -2005,6 +2010,20 @@ pub(crate) async fn install_to_filesystem( warn_on_host_root(&rootfs_fd)?; } + // Get a file descriptor for the root path /target + // This is needed to find boot dev + let target_rootfs_fd = { + let rootfs_fd = Dir::open_ambient_dir(&target_root_path, cap_std::ambient_authority()) + .with_context(|| format!("Opening target root directory {target_root_path}"))?; + + tracing::debug!("Root filesystem: {target_root_path}"); + + if let Some(false) = rootfs_fd.is_mountpoint(".")? { + anyhow::bail!("Not a mountpoint: {target_root_path}"); + } + rootfs_fd + }; + // If we're installing to an ostree root, then find the physical root from // the deployment root. let possible_physical_root = fsopts.root_path.join("sysroot"); @@ -2018,9 +2037,9 @@ pub(crate) async fn install_to_filesystem( }; // Get a file descriptor for the root path - let rootfs_fd = { + let rootfs_fd = if fsopts.root_path.ends_with("sysroot") { let root_path = &fsopts.root_path; - let rootfs_fd = Dir::open_ambient_dir(&fsopts.root_path, cap_std::ambient_authority()) + let rootfs_fd = Dir::open_ambient_dir(root_path, cap_std::ambient_authority()) .with_context(|| format!("Opening target root directory {root_path}"))?; tracing::debug!("Root filesystem: {root_path}"); @@ -2029,6 +2048,8 @@ pub(crate) async fn install_to_filesystem( anyhow::bail!("Not a mountpoint: {root_path}"); } rootfs_fd + } else { + target_rootfs_fd.try_clone()? }; match fsopts.replace { @@ -2038,8 +2059,11 @@ pub(crate) async fn install_to_filesystem( tokio::task::spawn_blocking(move || remove_all_in_dir_no_xdev(&rootfs_fd, true)) .await??; } - Some(ReplaceMode::Alongside) => clean_boot_directories(&rootfs_fd, is_already_ostree)?, - None => require_empty_rootdir(&rootfs_fd)?, + // Find boot under / + Some(ReplaceMode::Alongside) => { + clean_boot_directories(&target_rootfs_fd, is_already_ostree)? + } + None => require_empty_rootdir(&target_rootfs_fd)?, } // Gather data about the root filesystem @@ -2083,7 +2107,7 @@ pub(crate) async fn install_to_filesystem( let boot_is_mount = { let root_dev = rootfs_fd.dir_metadata()?.dev(); - let boot_dev = rootfs_fd + let boot_dev = target_rootfs_fd .symlink_metadata_optional(BOOT)? .ok_or_else(|| { anyhow!("No /{BOOT} directory found in root; this is is currently required") @@ -2094,9 +2118,10 @@ pub(crate) async fn install_to_filesystem( }; // Find the UUID of /boot because we need it for GRUB. let boot_uuid = if boot_is_mount { - let boot_path = fsopts.root_path.join(BOOT); + let boot_path = target_root_path.join(BOOT); + tracing::debug!("boot_path={boot_path}"); let u = bootc_mount::inspect_filesystem(&boot_path) - .context("Inspecting /{BOOT}")? + .with_context(|| format!("Inspecting /{BOOT}"))? .uuid .ok_or_else(|| anyhow!("No UUID found for /{BOOT}"))?; Some(u) @@ -2175,6 +2200,7 @@ pub(crate) async fn install_to_filesystem( device_info, physical_root_path: fsopts.root_path, physical_root: rootfs_fd, + target_root_path: Some(target_root_path.clone()), rootfs_uuid: inspect.uuid.clone(), boot, kargs, diff --git a/crates/lib/src/install/baseline.rs b/crates/lib/src/install/baseline.rs index b20aff31d..48e539fe9 100644 --- a/crates/lib/src/install/baseline.rs +++ b/crates/lib/src/install/baseline.rs @@ -467,6 +467,7 @@ pub(crate) fn install_create_rootfs( device_info, physical_root_path, physical_root, + target_root_path: None, rootfs_uuid: Some(root_uuid.to_string()), boot, kargs,