Author:
Hash:
Timestamp:
+46 -1 +/-4 browse
Kevin Schoon [me@kevinschoon.com]
a17deb12e07b35fe5dc63f9e2f8197ec4e116685
Tue, 23 Jun 2026 11:08:55 +0000 (6 days ago)
| 1 | diff --git a/PKGBUILD b/PKGBUILD |
| 2 | index b2789bc..11ebe40 100644 |
| 3 | --- a/PKGBUILD |
| 4 | +++ b/PKGBUILD |
| 5 | @@ -16,6 +16,7 @@ provides=("ayllu") |
| 6 | optdepends=( |
| 7 | "crun" |
| 8 | "runc" |
| 9 | + "fuse-overlayfs" |
| 10 | ) |
| 11 | source=() |
| 12 | |
| 13 | diff --git a/ayllu-build/src/main.rs b/ayllu-build/src/main.rs |
| 14 | index c76de93..3cfcbb2 100644 |
| 15 | --- a/ayllu-build/src/main.rs |
| 16 | +++ b/ayllu-build/src/main.rs |
| 17 | @@ -15,6 +15,7 @@ mod gc; |
| 18 | mod handle; |
| 19 | mod manifest; |
| 20 | mod oci_runtime; |
| 21 | + mod overlay; |
| 22 | mod runtime; |
| 23 | mod source; |
| 24 | mod workspace; |
| 25 | diff --git a/ayllu-build/src/overlay.rs b/ayllu-build/src/overlay.rs |
| 26 | new file mode 100644 |
| 27 | index 0000000..5e442bb |
| 28 | --- /dev/null |
| 29 | +++ b/ayllu-build/src/overlay.rs |
| 30 | @@ -0,0 +1,36 @@ |
| 31 | + use std::{ |
| 32 | + path::Path, |
| 33 | + process::{Command, Stdio}, |
| 34 | + }; |
| 35 | + |
| 36 | + pub fn mount( |
| 37 | + lower_dir: &Path, |
| 38 | + upper_dir: &Path, |
| 39 | + work_dir: &Path, |
| 40 | + target: &Path, |
| 41 | + ) -> Result<(), std::io::Error> { |
| 42 | + tracing::info!("Mounting {lower_dir:?} --> {target:?}"); |
| 43 | + std::fs::create_dir_all(upper_dir)?; |
| 44 | + std::fs::create_dir_all(work_dir)?; |
| 45 | + let lower_dir = lower_dir.to_string_lossy(); |
| 46 | + let upper_dir = upper_dir.to_string_lossy(); |
| 47 | + let work_dir = work_dir.to_string_lossy(); |
| 48 | + let target = target.to_string_lossy(); |
| 49 | + let mount_str = format!("lowerdir={lower_dir},upperdir={upper_dir},workdir={work_dir}"); |
| 50 | + let proc = Command::new("fuse-overlayfs") |
| 51 | + .args(["-o", &mount_str, target.as_ref()]) |
| 52 | + .stderr(Stdio::piped()) |
| 53 | + .spawn()?; |
| 54 | + let _output = proc.wait_with_output()?; |
| 55 | + Ok(()) |
| 56 | + } |
| 57 | + |
| 58 | + pub fn unmount(name: &Path) -> Result<(), std::io::Error> { |
| 59 | + let path_str = name.to_string_lossy(); |
| 60 | + let proc = Command::new("umount") |
| 61 | + .args([path_str.to_string()]) |
| 62 | + .spawn() |
| 63 | + .unwrap(); |
| 64 | + let _ = proc.wait_with_output()?; |
| 65 | + Ok(()) |
| 66 | + } |
| 67 | diff --git a/ayllu-build/src/workspace.rs b/ayllu-build/src/workspace.rs |
| 68 | index c91c028..1671dd0 100644 |
| 69 | --- a/ayllu-build/src/workspace.rs |
| 70 | +++ b/ayllu-build/src/workspace.rs |
| 71 | @@ -261,6 +261,13 @@ impl Workspace { |
| 72 | std::fs::write(self.process(resolved.step.id), proc_json)?; |
| 73 | Ok::<_, Error>(()) |
| 74 | })?; |
| 75 | + #[cfg(not(test))] |
| 76 | + crate::overlay::mount( |
| 77 | + params.lower_dir, |
| 78 | + &self.overlay(), |
| 79 | + &self.workdir(), |
| 80 | + &self.rootfs(), |
| 81 | + )?; |
| 82 | if let Some(source_dir) = params.source_dir.as_ref() { |
| 83 | ayllu_git::bundle(source_dir, &self.special().join("src.bundle"), None) |
| 84 | .map_err(Error::CannotReadManifestFromRepository)?; |
| 85 | @@ -282,7 +289,7 @@ impl Workspace { |
| 86 | } |
| 87 | |
| 88 | pub fn unmount(&self) -> Result<(), Error> { |
| 89 | - // crate::overlay::unmount(&self.rootfs())?; |
| 90 | + crate::overlay::unmount(&self.rootfs())?; |
| 91 | Ok(()) |
| 92 | } |
| 93 |