summaryrefslogtreecommitdiffstats
path: root/crates/runner/src/init.rs
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2021-10-25 00:19:45 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2021-10-25 00:19:45 +0200
commit34ac18d20c13a78914d447fee83204811a27b1e4 (patch)
tree56763d4ea46927105fcc6a71e03d5bd75a6947a6 /crates/runner/src/init.rs
parenta1a185370da27f2cc3df84d3a8d7141f9ce7db16 (diff)
downloadrebel-34ac18d20c13a78914d447fee83204811a27b1e4.tar
rebel-34ac18d20c13a78914d447fee83204811a27b1e4.zip
Move runner into separate crate
Diffstat (limited to 'crates/runner/src/init.rs')
-rw-r--r--crates/runner/src/init.rs71
1 files changed, 71 insertions, 0 deletions
diff --git a/crates/runner/src/init.rs b/crates/runner/src/init.rs
new file mode 100644
index 0000000..783faf4
--- /dev/null
+++ b/crates/runner/src/init.rs
@@ -0,0 +1,71 @@
+use std::fs::File;
+
+use nix::mount::{self, MsFlags};
+
+use common::error::*;
+
+use super::{tar, util::fs};
+use crate::paths;
+
+fn prepare_rootfs(rootfs: &str) -> Result<()> {
+ tar::unpack(File::open(paths::ROOTFS_ARCHIVE)?, rootfs)
+ .context("Unpacking build container rootfs failed")?;
+
+ mount::mount::<_, _, str, str>(Some(rootfs), rootfs, None, MsFlags::MS_BIND, None)
+ .context("Failed to bind mount container rootfs")?;
+
+ for dir in IntoIterator::into_iter(["pts", "shm"]) {
+ fs::mkdir(paths::join(&[rootfs, "dev", dir]))?;
+ }
+
+ for (link, target) in IntoIterator::into_iter([
+ ("fd", "/proc/self/fd"),
+ ("stdin", "/proc/self/fd/0"),
+ ("stdout", "/proc/self/fd/1"),
+ ("stderr", "/proc/self/fd/2"),
+ ("ptmx", "pts/ptmx"),
+ ]) {
+ let path = paths::join(&[rootfs, "dev", link]);
+ std::os::unix::fs::symlink(target, &path)
+ .with_context(|| format!("Failed to create link {}", path))?;
+ }
+
+ for dev in IntoIterator::into_iter(["null", "zero", "full", "random", "urandom", "tty"]) {
+ let source = paths::join(&["/dev", dev]);
+ let target = paths::join(&[rootfs, "dev", dev]);
+ fs::create(&target)?;
+ mount::mount::<str, str, str, str>(Some(&source), &target, None, MsFlags::MS_BIND, None)
+ .with_context(|| format!("Failed to bind mount {}", source))?;
+ }
+
+ mount::mount::<str, _, str, str>(
+ None,
+ rootfs,
+ None,
+ MsFlags::MS_REMOUNT | MsFlags::MS_BIND | MsFlags::MS_RDONLY,
+ None,
+ )
+ .context("Failed to mount container rootfs read-only")?;
+
+ Ok(())
+}
+
+pub fn init_runner() -> Result<()> {
+ fs::mkdir(paths::LAYER_STATE_DIR)?;
+ fs::mkdir(paths::OUTPUT_STATE_DIR)?;
+
+ mount::mount::<_, _, _, str>(
+ Some("buildtmp"),
+ paths::TMP_DIR,
+ Some("tmpfs"),
+ MsFlags::empty(),
+ None,
+ )
+ .context("Mounting build tmpfs failed")?;
+ mount::mount::<str, _, str, str>(None, paths::TMP_DIR, None, MsFlags::MS_PRIVATE, None)
+ .context("Failed to set MS_PRIVATE for build tmpfs")?;
+
+ prepare_rootfs(paths::ROOTFS_DIR)?;
+
+ Ok(())
+}