summaryrefslogtreecommitdiff
path: root/src/initramfs.rs
diff options
context:
space:
mode:
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())?;