summaryrefslogtreecommitdiff
path: root/src/initramfs.rs
diff options
context:
space:
mode:
authorHermes Agent <hermes@localhost>2026-08-12 13:35:55 +0000
committerHermes Agent <hermes@localhost>2026-08-12 13:35:55 +0000
commit5debb9e51172745d7e564239ecb37a1d2c4f3a0e (patch)
treecdffe5ff6497d33ce2e68b44abd3f80cab84cc9f /src/initramfs.rs
parentfeb6e6148cfc8f664bbae6b70cb1c793ef690c5c (diff)
Run native initramfs inside Hasher rooter context
Diffstat (limited to 'src/initramfs.rs')
-rw-r--r--src/initramfs.rs27
1 files changed, 25 insertions, 2 deletions
diff --git a/src/initramfs.rs b/src/initramfs.rs
index 4ece24c..c934aaf 100644
--- a/src/initramfs.rs
+++ b/src/initramfs.rs
@@ -93,6 +93,7 @@ fn normalize(
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct InitramfsRequest {
rootfs: PathBuf,
+ hasher_workdir: Option<PathBuf>,
kernel: KernelVersion,
}
@@ -102,12 +103,18 @@ impl InitramfsRequest {
if !rootfs.is_dir() {
bail!("rootfs is not a directory: {}", rootfs.display());
}
+ let hasher_workdir = rootfs.parent().map(Path::to_path_buf);
Ok(Self {
rootfs: rootfs.to_path_buf(),
+ hasher_workdir,
kernel: KernelVersion::discover_rt(rootfs)?,
})
}
+ pub fn hasher_workdir(&self) -> Option<&Path> {
+ self.hasher_workdir.as_deref()
+ }
+
pub fn rootfs(&self) -> &Path {
&self.rootfs
}
@@ -179,13 +186,29 @@ impl<R> MakeInitrdBuilder<R> {
impl<R: CommandRunner> InitramfsBuilder for MakeInitrdBuilder<R> {
fn build(&mut self, request: &InitramfsRequest) -> Result<InitramfsResult> {
+ let workdir = request
+ .hasher_workdir()
+ .ok_or_else(|| anyhow::anyhow!("rootfs has no Hasher workdir parent"))?;
self.runner.run(Invocation::new(
- "chroot",
+ "sudo",
[
- request.rootfs().as_os_str().to_owned(),
+ "-n".into(),
+ "-u".into(),
+ "hermes".into(),
+ "hsh-run".into(),
+ "--rooter".into(),
+ "--mountpoints=/proc".into(),
+ "--workdir".into(),
+ workdir.as_os_str().to_owned(),
+ "--".into(),
"make-initrd".into(),
+ "-N".into(),
+ "-v".into(),
"-k".into(),
request.kernel().as_str().into(),
+ "AUTODETECT=".into(),
+ "-c".into(),
+ "/etc/initrd.mk.oem".into(),
],
))?;
let result = InitramfsResult::from_rootfs(request.rootfs(), request.kernel())?;