diff options
Diffstat (limited to 'src/initramfs.rs')
| -rw-r--r-- | src/initramfs.rs | 27 |
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())?; |