diff --git a/runtime/init-container/src/init.c b/runtime/init-container/src/init.c index e6515a79..160903a5 100644 --- a/runtime/init-container/src/init.c +++ b/runtime/init-container/src/init.c @@ -1996,8 +1996,15 @@ int main(int argc, char **argv) { CHECK(mkdir("/mnt/overlay/work", S_IRWXU)); CHECK(mount("/dev/vda", "/mnt/image", "squashfs", MS_RDONLY, "")); - CHECK(mount("overlay", SYSROOT, "overlay", 0, - "lowerdir=/mnt/image,upperdir=/mnt/overlay/upper,workdir=/mnt/overlay/work")); + if (access("/dev/vdb", R_OK) == 0) { + CHECK(mkdir("/mnt/gpu-files", S_IRWXU)); + CHECK(mount("/dev/vdb", "/mnt/gpu-files", "squashfs", MS_RDONLY, "")); + CHECK(mount("overlay", SYSROOT, "overlay", 0, + "lowerdir=/mnt/image:/mnt/gpu-files,upperdir=/mnt/overlay/upper,workdir=/mnt/overlay/work")); + } else { + CHECK(mount("overlay", SYSROOT, "overlay", 0, + "lowerdir=/mnt/image,upperdir=/mnt/overlay/upper,workdir=/mnt/overlay/work")); + } g_sysroot_fd = CHECK(open(SYSROOT, O_RDONLY | O_DIRECTORY | O_CLOEXEC)); assert(g_sysroot_fd >= 3); diff --git a/runtime/src/vmrt.rs b/runtime/src/vmrt.rs index 354b4f42..09d38c1e 100755 --- a/runtime/src/vmrt.rs +++ b/runtime/src/vmrt.rs @@ -21,6 +21,7 @@ const DIR_RUNTIME: &str = "runtime"; const FILE_RUNTIME: &str = "vmrt"; const FILE_VMLINUZ: &str = "vmlinuz-virt"; const FILE_INITRAMFS: &str = "initramfs.cpio.gz"; +const FILE_NVIDIA_FILES: &str = "nvidia-files.squashfs"; #[derive(Default)] pub struct RuntimeData { @@ -115,6 +116,13 @@ pub async fn start_vmrt( cmd.arg("none"); } + if Path::new(FILE_NVIDIA_FILES).exists() { + cmd.arg("-drive"); + cmd.arg(format!( + "file={},cache=unsafe,readonly=on,format=raw,if=virtio", + FILE_NVIDIA_FILES).as_str()); + } + let (vpn, inet) = // backward-compatibility mode if vpn_remote.is_none() && inet_remote.is_none() {