From ec74c27faad3e65782ae5bb51a8e8e5b629f42ec Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Wed, 12 Aug 2026 06:49:50 +0000 Subject: Create protected boot aliases after initramfs build --- src/initramfs.rs | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'src/initramfs.rs') diff --git a/src/initramfs.rs b/src/initramfs.rs index ca1063d..4475aed 100644 --- a/src/initramfs.rs +++ b/src/initramfs.rs @@ -1,5 +1,6 @@ use std::ffi::OsString; use std::fs; +use std::os::unix::fs::symlink; use std::path::{Path, PathBuf}; use std::process::Command; @@ -171,10 +172,36 @@ impl InitramfsBuilder for MakeInitrdBuilder { request.kernel().as_str().into(), ], ))?; - InitramfsResult::from_rootfs(request.rootfs(), request.kernel()) + let result = InitramfsResult::from_rootfs(request.rootfs(), request.kernel())?; + write_boot_alias( + request.rootfs(), + "vmlinuz", + Path::new(&format!("vmlinuz-{}", request.kernel().as_str())), + )?; + write_boot_alias( + request.rootfs(), + "initrd.img", + Path::new(result.initrd_path().file_name().expect("initrd filename")), + )?; + Ok(result) } } +/// Set a conventional boot alias without ever following or replacing a +/// pre-existing non-symlink filesystem entry. +fn write_boot_alias(rootfs: &Path, alias: &str, target: &Path) -> Result<()> { + let path = rootfs.join("boot").join(alias); + match fs::symlink_metadata(&path) { + Ok(metadata) if metadata.file_type().is_symlink() => { + fs::remove_file(&path).with_context(|| format!("remove existing boot alias {}", path.display()))?; + } + Ok(_) => bail!("refusing to replace non-symlink boot alias: {}", path.display()), + Err(error) if error.kind() == std::io::ErrorKind::NotFound => {} + Err(error) => return Err(error).with_context(|| format!("inspect boot alias {}", path.display())), + } + symlink(target, &path).with_context(|| format!("create boot alias {}", path.display())) +} + #[derive(Debug, Clone, PartialEq, Eq)] pub struct InitramfsResult { initrd_path: PathBuf, -- cgit v1.2.3