diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml index 8445297..982c515 100644 --- a/.github/workflows/benchmarks.yml +++ b/.github/workflows/benchmarks.yml @@ -81,11 +81,14 @@ jobs: kraft-hyperlight --no-prompt build --plat hyperlight --arch x86_64 || true if [ ! -d ".unikraft/unikraft" ] || [ -z "$(ls -A .unikraft/unikraft 2>/dev/null)" ]; then echo "::warning::kraft didn't clone unikraft sources; cloning manually" - UK_BRANCH=$(grep -E '^ version:' kraft.yaml | head -1 | awk '{print $2}') + UK_SOURCE=$(awk '/^unikraft:/{f=1} f && /source:/{print $2; exit}' kraft.yaml) + UK_BRANCH=$(awk '/^unikraft:/{f=1} f && /version:/{print $2; exit}' kraft.yaml) + ELF_SOURCE=$(awk '/app-elfloader:/{f=1} f && /source:/{print $2; exit}' kraft.yaml) + ELF_BRANCH=$(awk '/app-elfloader:/{f=1} f && /version:/{print $2; exit}' kraft.yaml) mkdir -p .unikraft/apps .unikraft/libs rm -rf .unikraft/unikraft .unikraft/apps/elfloader .unikraft/libs/libelf .unikraft/build - git clone --branch $UK_BRANCH --depth 1 https://github.com/unikraft/unikraft.git .unikraft/unikraft - git clone --branch $UK_BRANCH --depth 1 https://github.com/unikraft/app-elfloader.git .unikraft/apps/elfloader + git clone --branch "$UK_BRANCH" --depth 1 "$UK_SOURCE" .unikraft/unikraft + git clone --branch "$ELF_BRANCH" --depth 1 "$ELF_SOURCE" .unikraft/apps/elfloader git clone --branch staging --depth 1 https://github.com/unikraft/lib-libelf.git .unikraft/libs/libelf kraft-hyperlight --no-prompt build --plat hyperlight --arch x86_64 fi diff --git a/.github/workflows/publish-examples.yml b/.github/workflows/publish-examples.yml index ca5091d..183652b 100644 --- a/.github/workflows/publish-examples.yml +++ b/.github/workflows/publish-examples.yml @@ -121,11 +121,14 @@ jobs: kraft-hyperlight --no-prompt build --plat hyperlight --arch x86_64 || true # Fallback: manual source clone + build if [ ! -f ".unikraft/build/${{ matrix.example.kernel }}" ]; then - UK_BRANCH=$(grep 'version:' kraft.yaml | head -1 | awk '{print $2}') + UK_SOURCE=$(awk '/^unikraft:/{f=1} f && /source:/{print $2; exit}' kraft.yaml) + UK_BRANCH=$(awk '/^unikraft:/{f=1} f && /version:/{print $2; exit}' kraft.yaml) + ELF_SOURCE=$(awk '/app-elfloader:/{f=1} f && /source:/{print $2; exit}' kraft.yaml) + ELF_BRANCH=$(awk '/app-elfloader:/{f=1} f && /version:/{print $2; exit}' kraft.yaml) mkdir -p .unikraft/apps .unikraft/libs rm -rf .unikraft/unikraft .unikraft/apps/elfloader - git clone --branch $UK_BRANCH --depth 1 https://github.com/unikraft/unikraft.git .unikraft/unikraft - git clone --branch $UK_BRANCH --depth 1 https://github.com/unikraft/app-elfloader.git .unikraft/apps/elfloader + git clone --branch "$UK_BRANCH" --depth 1 "$UK_SOURCE" .unikraft/unikraft + git clone --branch "$ELF_BRANCH" --depth 1 "$ELF_SOURCE" .unikraft/apps/elfloader git clone --branch staging --depth 1 https://github.com/unikraft/lib-libelf.git .unikraft/libs/libelf rm -rf .unikraft/build kraft-hyperlight --no-prompt build --plat hyperlight --arch x86_64 diff --git a/.github/workflows/test-examples.yml b/.github/workflows/test-examples.yml index 6be68af..0066959 100644 --- a/.github/workflows/test-examples.yml +++ b/.github/workflows/test-examples.yml @@ -118,11 +118,14 @@ jobs: # Manually clone the components and rebuild with --no-fetch/--no-update. if [ ! -d ".unikraft/unikraft" ] || [ -z "$(ls -A .unikraft/unikraft 2>/dev/null)" ]; then echo "::warning::kraft didn't clone unikraft sources; cloning manually" - UK_BRANCH=$(grep -E '^ version:' kraft.yaml | head -1 | awk '{print $2}') + UK_SOURCE=$(awk '/^unikraft:/{f=1} f && /source:/{print $2; exit}' kraft.yaml) + UK_BRANCH=$(awk '/^unikraft:/{f=1} f && /version:/{print $2; exit}' kraft.yaml) + ELF_SOURCE=$(awk '/app-elfloader:/{f=1} f && /source:/{print $2; exit}' kraft.yaml) + ELF_BRANCH=$(awk '/app-elfloader:/{f=1} f && /version:/{print $2; exit}' kraft.yaml) mkdir -p .unikraft/apps .unikraft/libs rm -rf .unikraft/unikraft .unikraft/apps/elfloader .unikraft/libs/libelf .unikraft/build - git clone --branch $UK_BRANCH --depth 1 https://github.com/unikraft/unikraft.git .unikraft/unikraft - git clone --branch $UK_BRANCH --depth 1 https://github.com/unikraft/app-elfloader.git .unikraft/apps/elfloader + git clone --branch "$UK_BRANCH" --depth 1 "$UK_SOURCE" .unikraft/unikraft + git clone --branch "$ELF_BRANCH" --depth 1 "$ELF_SOURCE" .unikraft/apps/elfloader git clone --branch staging --depth 1 https://github.com/unikraft/lib-libelf.git .unikraft/libs/libelf kraft-hyperlight --no-prompt build --plat hyperlight --arch x86_64 fi @@ -299,11 +302,14 @@ jobs: kraft-hyperlight --no-prompt build --plat hyperlight --arch x86_64 || true if [ ! -d ".unikraft/unikraft" ] || [ -z "$(ls -A .unikraft/unikraft 2>/dev/null)" ]; then echo "::warning::kraft didn't clone unikraft sources; cloning manually" - UK_BRANCH=$(grep -E '^ version:' kraft.yaml | head -1 | awk '{print $2}') + UK_SOURCE=$(awk '/^unikraft:/{f=1} f && /source:/{print $2; exit}' kraft.yaml) + UK_BRANCH=$(awk '/^unikraft:/{f=1} f && /version:/{print $2; exit}' kraft.yaml) + ELF_SOURCE=$(awk '/app-elfloader:/{f=1} f && /source:/{print $2; exit}' kraft.yaml) + ELF_BRANCH=$(awk '/app-elfloader:/{f=1} f && /version:/{print $2; exit}' kraft.yaml) mkdir -p .unikraft/apps .unikraft/libs rm -rf .unikraft/unikraft .unikraft/apps/elfloader .unikraft/libs/libelf .unikraft/build - git clone --branch $UK_BRANCH --depth 1 https://github.com/unikraft/unikraft.git .unikraft/unikraft - git clone --branch $UK_BRANCH --depth 1 https://github.com/unikraft/app-elfloader.git .unikraft/apps/elfloader + git clone --branch "$UK_BRANCH" --depth 1 "$UK_SOURCE" .unikraft/unikraft + git clone --branch "$ELF_BRANCH" --depth 1 "$ELF_SOURCE" .unikraft/apps/elfloader git clone --branch staging --depth 1 https://github.com/unikraft/lib-libelf.git .unikraft/libs/libelf kraft-hyperlight --no-prompt build --plat hyperlight --arch x86_64 fi @@ -440,11 +446,14 @@ jobs: just rootfs kraft-hyperlight --no-prompt build --plat hyperlight --arch x86_64 || true if [ ! -d ".unikraft/unikraft" ] || [ -z "$(ls -A .unikraft/unikraft 2>/dev/null)" ]; then - UK_BRANCH=$(grep -E '^ version:' kraft.yaml | head -1 | awk '{print $2}') + UK_SOURCE=$(awk '/^unikraft:/{f=1} f && /source:/{print $2; exit}' kraft.yaml) + UK_BRANCH=$(awk '/^unikraft:/{f=1} f && /version:/{print $2; exit}' kraft.yaml) + ELF_SOURCE=$(awk '/app-elfloader:/{f=1} f && /source:/{print $2; exit}' kraft.yaml) + ELF_BRANCH=$(awk '/app-elfloader:/{f=1} f && /version:/{print $2; exit}' kraft.yaml) mkdir -p .unikraft/apps .unikraft/libs rm -rf .unikraft/unikraft .unikraft/apps/elfloader .unikraft/libs/libelf .unikraft/build - git clone --branch $UK_BRANCH --depth 1 https://github.com/unikraft/unikraft.git .unikraft/unikraft - git clone --branch $UK_BRANCH --depth 1 https://github.com/unikraft/app-elfloader.git .unikraft/apps/elfloader + git clone --branch "$UK_BRANCH" --depth 1 "$UK_SOURCE" .unikraft/unikraft + git clone --branch "$ELF_BRANCH" --depth 1 "$ELF_SOURCE" .unikraft/apps/elfloader git clone --branch staging --depth 1 https://github.com/unikraft/lib-libelf.git .unikraft/libs/libelf kraft-hyperlight --no-prompt build --plat hyperlight --arch x86_64 fi diff --git a/examples/dotnet-nativeaot/kraft.yaml b/examples/dotnet-nativeaot/kraft.yaml index 69030cc..f5c2b2d 100644 --- a/examples/dotnet-nativeaot/kraft.yaml +++ b/examples/dotnet-nativeaot/kraft.yaml @@ -18,8 +18,11 @@ unikraft: CONFIG_OPTIMIZE_PIE: 'y' CONFIG_LIBVFSCORE: 'y' CONFIG_LIBVFSCORE_AUTOMOUNT_CI: 'y' - CONFIG_LIBVFSCORE_AUTOMOUNT_CI_INITRD: 'y' - CONFIG_LIBRAMFS: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI_CUSTOM: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_MP: '/' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_DRIVER: 'cpiovfs' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_UKOPTS_IFINITRD0: 'y' + CONFIG_LIBCPIOVFS: 'y' CONFIG_LIBUKCPIO: 'y' CONFIG_APPELFLOADER: 'y' CONFIG_APPELFLOADER_VFSEXEC: 'y' diff --git a/examples/go/kraft.yaml b/examples/go/kraft.yaml index 7537197..547d6d7 100644 --- a/examples/go/kraft.yaml +++ b/examples/go/kraft.yaml @@ -26,8 +26,11 @@ unikraft: # VFS and initrd support CONFIG_LIBVFSCORE: 'y' CONFIG_LIBVFSCORE_AUTOMOUNT_CI: 'y' - CONFIG_LIBVFSCORE_AUTOMOUNT_CI_INITRD: 'y' - CONFIG_LIBRAMFS: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI_CUSTOM: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_MP: '/' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_DRIVER: 'cpiovfs' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_UKOPTS_IFINITRD0: 'y' + CONFIG_LIBCPIOVFS: 'y' CONFIG_LIBUKCPIO: 'y' # ELF loader - Go binary location diff --git a/examples/helloworld-c/kraft.yaml b/examples/helloworld-c/kraft.yaml index f149bac..36e45f2 100644 --- a/examples/helloworld-c/kraft.yaml +++ b/examples/helloworld-c/kraft.yaml @@ -20,8 +20,11 @@ unikraft: CONFIG_OPTIMIZE_PIE: 'y' CONFIG_LIBVFSCORE: 'y' CONFIG_LIBVFSCORE_AUTOMOUNT_CI: 'y' - CONFIG_LIBVFSCORE_AUTOMOUNT_CI_INITRD: 'y' - CONFIG_LIBRAMFS: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI_CUSTOM: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_MP: '/' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_DRIVER: 'cpiovfs' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_UKOPTS_IFINITRD0: 'y' + CONFIG_LIBCPIOVFS: 'y' CONFIG_LIBUKCPIO: 'y' CONFIG_APPELFLOADER: 'y' CONFIG_APPELFLOADER_VFSEXEC: 'y' diff --git a/examples/hostfs-posix-c/kraft.yaml b/examples/hostfs-posix-c/kraft.yaml index e824d64..d2f937f 100644 --- a/examples/hostfs-posix-c/kraft.yaml +++ b/examples/hostfs-posix-c/kraft.yaml @@ -25,8 +25,11 @@ unikraft: # VFS + initrd as ramfs (for /bin/hello and the ELF loader) CONFIG_LIBVFSCORE: 'y' CONFIG_LIBVFSCORE_AUTOMOUNT_CI: 'y' - CONFIG_LIBVFSCORE_AUTOMOUNT_CI_INITRD: 'y' - CONFIG_LIBRAMFS: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI_CUSTOM: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_MP: '/' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_DRIVER: 'cpiovfs' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_UKOPTS_IFINITRD0: 'y' + CONFIG_LIBCPIOVFS: 'y' CONFIG_LIBUKCPIO: 'y' # devfs + /dev/hcall (needed for HYPERLIGHT_HCALL symbol; diff --git a/examples/hostfs-posix-py/kraft.yaml b/examples/hostfs-posix-py/kraft.yaml index cc5c251..ec17d14 100644 --- a/examples/hostfs-posix-py/kraft.yaml +++ b/examples/hostfs-posix-py/kraft.yaml @@ -25,8 +25,11 @@ unikraft: # VFS + initrd as ramfs (for /usr/local/bin/python3 and the ELF loader) CONFIG_LIBVFSCORE: 'y' CONFIG_LIBVFSCORE_AUTOMOUNT_CI: 'y' - CONFIG_LIBVFSCORE_AUTOMOUNT_CI_INITRD: 'y' - CONFIG_LIBRAMFS: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI_CUSTOM: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_MP: '/' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_DRIVER: 'cpiovfs' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_UKOPTS_IFINITRD0: 'y' + CONFIG_LIBCPIOVFS: 'y' CONFIG_LIBUKCPIO: 'y' # devfs + /dev/hcall (needed for HYPERLIGHT_HCALL symbol; diff --git a/examples/multifn-c/kraft.yaml b/examples/multifn-c/kraft.yaml index c8dc628..cc98096 100644 --- a/examples/multifn-c/kraft.yaml +++ b/examples/multifn-c/kraft.yaml @@ -19,8 +19,11 @@ unikraft: CONFIG_OPTIMIZE_PIE: 'y' CONFIG_LIBVFSCORE: 'y' CONFIG_LIBVFSCORE_AUTOMOUNT_CI: 'y' - CONFIG_LIBVFSCORE_AUTOMOUNT_CI_INITRD: 'y' - CONFIG_LIBRAMFS: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI_CUSTOM: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_MP: '/' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_DRIVER: 'cpiovfs' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_UKOPTS_IFINITRD0: 'y' + CONFIG_LIBCPIOVFS: 'y' CONFIG_LIBUKCPIO: 'y' CONFIG_APPELFLOADER: 'y' CONFIG_APPELFLOADER_VFSEXEC: 'y' diff --git a/examples/powershell/kraft.yaml b/examples/powershell/kraft.yaml index a0ed3bc..8d3bcc9 100644 --- a/examples/powershell/kraft.yaml +++ b/examples/powershell/kraft.yaml @@ -22,18 +22,15 @@ unikraft: CONFIG_OPTIMIZE_SIZE: 'y' CONFIG_OPTIMIZE_PIE: 'y' - # VFS and initrd support - cpiovfs for zero-copy mount, ramfs for /tmp + # VFS and initrd support - cpiovfs for zero-copy mount CONFIG_LIBVFSCORE: 'y' CONFIG_LIBVFSCORE_AUTOMOUNT_CI: 'y' CONFIG_LIBVFSCORE_AUTOMOUNT_CI_CUSTOM: 'y' - CONFIG_LIBCPIOVFS: 'y' - CONFIG_LIBRAMFS: 'y' CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_MP: '/' CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_DRIVER: 'cpiovfs' - CONFIG_LIBVFSCORE_AUTOMOUNT_CI1_MP: '/tmp' - CONFIG_LIBVFSCORE_AUTOMOUNT_CI1_DRIVER: 'ramfs' - CONFIG_LIBVFSCORE_AUTOMOUNT_CI2_MP: '/root' - CONFIG_LIBVFSCORE_AUTOMOUNT_CI2_DRIVER: 'ramfs' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_UKOPTS_IFINITRD0: 'y' + CONFIG_LIBCPIOVFS: 'y' + CONFIG_LIBUKCPIO: 'y' # ELF loader - execute PowerShell binary CONFIG_APPELFLOADER: 'y' diff --git a/examples/python-agent-driver/kraft.yaml b/examples/python-agent-driver/kraft.yaml index a0181e7..4e4cc2e 100644 --- a/examples/python-agent-driver/kraft.yaml +++ b/examples/python-agent-driver/kraft.yaml @@ -11,17 +11,20 @@ unikraft: CONFIG_LIBUKINTCTLR_HYPERLIGHT: 'y' CONFIG_HYPERLIGHT_MAX_GUEST_LOG_LEVEL: 4 - CONFIG_LIBUKPRINT_KLVL_CRIT: 'y' + CONFIG_LIBUKPRINT_KLVL_INFO: 'y' CONFIG_LIBUKPRINT_PRINT_TIME: 'n' - CONFIG_LIBUKPRINT_PRINT_SRCNAME: 'n' + CONFIG_LIBUKPRINT_PRINT_SRCNAME: 'y' CONFIG_LIBUKBOOT_BANNER_NONE: 'y' CONFIG_OPTIMIZE_SIZE: 'y' CONFIG_OPTIMIZE_PIE: 'y' CONFIG_LIBVFSCORE: 'y' CONFIG_LIBVFSCORE_AUTOMOUNT_CI: 'y' - CONFIG_LIBVFSCORE_AUTOMOUNT_CI_INITRD: 'y' - CONFIG_LIBRAMFS: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI_CUSTOM: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_MP: '/' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_DRIVER: 'cpiovfs' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_UKOPTS_IFINITRD0: 'y' + CONFIG_LIBCPIOVFS: 'y' CONFIG_LIBUKCPIO: 'y' CONFIG_LIBDEVFS: 'y' diff --git a/examples/python-agent/kraft.yaml b/examples/python-agent/kraft.yaml index 51d16b7..d627dc3 100644 --- a/examples/python-agent/kraft.yaml +++ b/examples/python-agent/kraft.yaml @@ -25,8 +25,11 @@ unikraft: # VFS + initrd as ramfs (for /usr/local/bin/python3 and the ELF loader) CONFIG_LIBVFSCORE: 'y' CONFIG_LIBVFSCORE_AUTOMOUNT_CI: 'y' - CONFIG_LIBVFSCORE_AUTOMOUNT_CI_INITRD: 'y' - CONFIG_LIBRAMFS: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI_CUSTOM: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_MP: '/' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_DRIVER: 'cpiovfs' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_UKOPTS_IFINITRD0: 'y' + CONFIG_LIBCPIOVFS: 'y' CONFIG_LIBUKCPIO: 'y' # devfs + /dev/hcall (needed for HYPERLIGHT_HCALL symbol; diff --git a/examples/python-tools/kraft.yaml b/examples/python-tools/kraft.yaml index 5b13fb4..53de59f 100644 --- a/examples/python-tools/kraft.yaml +++ b/examples/python-tools/kraft.yaml @@ -26,8 +26,11 @@ unikraft: # VFS and initrd support CONFIG_LIBVFSCORE: 'y' CONFIG_LIBVFSCORE_AUTOMOUNT_CI: 'y' - CONFIG_LIBVFSCORE_AUTOMOUNT_CI_INITRD: 'y' - CONFIG_LIBRAMFS: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI_CUSTOM: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_MP: '/' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_DRIVER: 'cpiovfs' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_UKOPTS_IFINITRD0: 'y' + CONFIG_LIBCPIOVFS: 'y' CONFIG_LIBUKCPIO: 'y' # devfs and host call device (/dev/hcall) diff --git a/examples/python/kraft.yaml b/examples/python/kraft.yaml index 96a8e47..dba5357 100644 --- a/examples/python/kraft.yaml +++ b/examples/python/kraft.yaml @@ -29,8 +29,11 @@ unikraft: # VFS and initrd support CONFIG_LIBVFSCORE: 'y' CONFIG_LIBVFSCORE_AUTOMOUNT_CI: 'y' - CONFIG_LIBVFSCORE_AUTOMOUNT_CI_INITRD: 'y' - CONFIG_LIBRAMFS: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI_CUSTOM: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_MP: '/' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_DRIVER: 'cpiovfs' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_UKOPTS_IFINITRD0: 'y' + CONFIG_LIBCPIOVFS: 'y' CONFIG_LIBUKCPIO: 'y' # ELF loader - execute Python binary, script passed via cmdline diff --git a/examples/rust/kraft.yaml b/examples/rust/kraft.yaml index 5467c24..962a7e9 100644 --- a/examples/rust/kraft.yaml +++ b/examples/rust/kraft.yaml @@ -26,8 +26,11 @@ unikraft: # VFS and initrd support CONFIG_LIBVFSCORE: 'y' CONFIG_LIBVFSCORE_AUTOMOUNT_CI: 'y' - CONFIG_LIBVFSCORE_AUTOMOUNT_CI_INITRD: 'y' - CONFIG_LIBRAMFS: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI_CUSTOM: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_MP: '/' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_DRIVER: 'cpiovfs' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_UKOPTS_IFINITRD0: 'y' + CONFIG_LIBCPIOVFS: 'y' CONFIG_LIBUKCPIO: 'y' # ELF loader - Rust binary location diff --git a/examples/shell/kraft.yaml b/examples/shell/kraft.yaml index f94c782..242745b 100644 --- a/examples/shell/kraft.yaml +++ b/examples/shell/kraft.yaml @@ -23,12 +23,14 @@ unikraft: CONFIG_OPTIMIZE_SIZE: 'y' CONFIG_OPTIMIZE_PIE: 'y' - # VFS and initrd support - use ramfs with CPIO extraction - # (ramfs handles symlinks reliably, which BusyBox needs for applet symlinks) + # VFS and initrd support - cpiovfs for zero-copy mount from CPIO CONFIG_LIBVFSCORE: 'y' CONFIG_LIBVFSCORE_AUTOMOUNT_CI: 'y' - CONFIG_LIBVFSCORE_AUTOMOUNT_CI_INITRD: 'y' - CONFIG_LIBRAMFS: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI_CUSTOM: 'y' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_MP: '/' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_DRIVER: 'cpiovfs' + CONFIG_LIBVFSCORE_AUTOMOUNT_CI0_UKOPTS_IFINITRD0: 'y' + CONFIG_LIBCPIOVFS: 'y' CONFIG_LIBUKCPIO: 'y' # ELF loader - execute /bin/sh, script/command passed via cmdline diff --git a/host/examples/test_cpiovfs.rs b/host/examples/test_cpiovfs.rs new file mode 100644 index 0000000..3d93cdd --- /dev/null +++ b/host/examples/test_cpiovfs.rs @@ -0,0 +1,41 @@ +use hyperlight_unikraft::Sandbox; + +fn main() -> anyhow::Result<()> { + let kernel = std::env::args() + .nth(1) + .expect("usage: test_cpiovfs "); + let initrd = std::env::args() + .nth(2) + .expect("usage: test_cpiovfs "); + + eprintln!("=== Test: build + init + snapshot + restore + call ==="); + { + let mut sbox = Sandbox::builder(&kernel) + .initrd_file(&initrd) + .heap_size(3 * 512 * 1024 * 1024) + .build()?; + eprintln!(" build OK"); + sbox.restore()?; + let _: () = sbox.call_named("init", ())?; + eprintln!(" init OK"); + sbox.snapshot_now()?; + eprintln!(" snapshot OK"); + + let snap_path = "/tmp/cpiovfs_snapshot.hls"; + sbox.save_snapshot(snap_path)?; + let snap_size = std::fs::metadata(snap_path)?.len(); + eprintln!( + " snapshot size: {} MiB ({} bytes)", + snap_size / 1024 / 1024, + snap_size + ); + + sbox.restore()?; + eprintln!(" restore OK"); + let _: () = sbox.call_named("run", "print('test ok')".to_string())?; + eprintln!(" call OK"); + } + + eprintln!("=== All tests passed ==="); + Ok(()) +} diff --git a/host/src/bin/pyhl.rs b/host/src/bin/pyhl.rs index 6df59d0..2014df8 100644 --- a/host/src/bin/pyhl.rs +++ b/host/src/bin/pyhl.rs @@ -464,8 +464,12 @@ fn cmd_run(args: RunArgs) -> Result<()> { .map(|m| parse_mount(m)) .collect::>()?; + let initrd = home.join(INITRD_FILE); + let t_load = Instant::now(); - let mut sandbox = if run_preopens.is_empty() { + let mut sandbox = if initrd.is_file() { + Sandbox::from_snapshot_file_with_initrd(&snapshot, &run_preopens, &initrd)? + } else if run_preopens.is_empty() { Sandbox::from_snapshot_file(&snapshot)? } else { Sandbox::from_snapshot_file_with(&snapshot, &run_preopens)? diff --git a/host/src/lib.rs b/host/src/lib.rs index 0759ada..b3bdf1b 100644 --- a/host/src/lib.rs +++ b/host/src/lib.rs @@ -1424,7 +1424,7 @@ impl Sandbox { /// a 2.5 GB snapshot — enough to double the whole `pyhl run` wall /// time on simple scripts. pub fn from_snapshot_file>(path: P) -> Result { - Self::from_snapshot_file_with(path, &[]) + Self::from_snapshot_file_full(path, &[], None) } /// Load a previously-persisted snapshot and register a @@ -1439,6 +1439,26 @@ impl Sandbox { /// fixed at setup time because it lives in the snapshot's memory /// image. pub fn from_snapshot_file_with>(path: P, preopens: &[Preopen]) -> Result { + Self::from_snapshot_file_full(path, preopens, None) + } + + /// Load a snapshot with an initrd file re-mapped at the standard + /// guest VA (0xC000_0000). Required when the snapshot was taken + /// from a cpiovfs-backed guest whose VFS nodes point into the + /// initrd region. + pub fn from_snapshot_file_with_initrd, I: AsRef>( + path: P, + preopens: &[Preopen], + initrd: I, + ) -> Result { + Self::from_snapshot_file_full(path, preopens, Some(initrd.as_ref().to_path_buf())) + } + + fn from_snapshot_file_full>( + path: P, + preopens: &[Preopen], + initrd: Option, + ) -> Result { let loaded = Snapshot::from_file_unchecked(path.as_ref())?; let arc = Arc::new(loaded); @@ -1453,13 +1473,18 @@ impl Sandbox { tools_ref.dispatch(&payload) })?; - let inner = MultiUseSandbox::from_snapshot(arc.clone(), host_funcs, None)?; + let mut inner = MultiUseSandbox::from_snapshot(arc.clone(), host_funcs, None)?; + + const INITRD_MAP_BASE: u64 = 0xC000_0000; + if let Some(ref initrd_path) = initrd { + inner.map_file_cow(initrd_path, INITRD_MAP_BASE, Some("initrd"))?; + } Ok(Self { inner, snapshot: Some(arc), - file_mapping_path: None, - file_mapping_base: 0, + file_mapping_path: initrd, + file_mapping_base: INITRD_MAP_BASE, exit_code, }) } diff --git a/host/src/pyhl.rs b/host/src/pyhl.rs index df52d88..0d7d18b 100644 --- a/host/src/pyhl.rs +++ b/host/src/pyhl.rs @@ -223,7 +223,10 @@ impl Runtime { snap.display() ); } - let sandbox = if mounts.is_empty() { + let initrd = home.join(INITRD_FILE); + let sandbox = if initrd.is_file() { + Sandbox::from_snapshot_file_with_initrd(&snap, mounts, &initrd)? + } else if mounts.is_empty() { Sandbox::from_snapshot_file(&snap)? } else { Sandbox::from_snapshot_file_with(&snap, mounts)?