summaryrefslogtreecommitdiff
path: root/src/initramfs.rs
diff options
context:
space:
mode:
authorHermes Agent <hermes@localhost>2026-08-12 06:49:50 +0000
committerHermes Agent <hermes@localhost>2026-08-12 06:49:50 +0000
commitec74c27faad3e65782ae5bb51a8e8e5b629f42ec (patch)
tree00be820298f3633e33401c4ce9ea94a58ebc167d /src/initramfs.rs
parent5a4c5671ada1f78c23dd5589765e44a64048f203 (diff)
Create protected boot aliases after initramfs build
Diffstat (limited to 'src/initramfs.rs')
-rw-r--r--src/initramfs.rs29
1 files changed, 28 insertions, 1 deletions
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<R: CommandRunner> InitramfsBuilder for MakeInitrdBuilder<R> {
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,