diff options
author | Alyssa Ross <alyssa.ross@unikie.com> | 2023-07-21 18:00:19 +0000 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2023-07-28 12:09:17 +0000 |
commit | ed8271dc5db12278b71e071dee1b8153af1d36e0 (patch) | |
tree | 091578eee0a23ce0145e6bae00a07de3c174a078 | |
parent | 76b6acdb22a49e296fda9626398414839c01efbe (diff) | |
download | spectrum-ed8271dc5db12278b71e071dee1b8153af1d36e0.tar spectrum-ed8271dc5db12278b71e071dee1b8153af1d36e0.tar.gz spectrum-ed8271dc5db12278b71e071dee1b8153af1d36e0.tar.bz2 spectrum-ed8271dc5db12278b71e071dee1b8153af1d36e0.tar.lz spectrum-ed8271dc5db12278b71e071dee1b8153af1d36e0.tar.xz spectrum-ed8271dc5db12278b71e071dee1b8153af1d36e0.tar.zst spectrum-ed8271dc5db12278b71e071dee1b8153af1d36e0.zip |
host: add support for Wayland in VMs
When a VM is configured with Wayland support, the ext-rc-init service will create an additional service to supervise the crosvm GPU backend, and start-vm will pass the required arguments to cloud-hypervisor to tell it how to connect to crosvm. Signed-off-by: Alyssa Ross <alyssa.ross@unikie.com> Signed-off-by: Alyssa Ross <hi@alyssa.is> Message-Id: <20230721180015.597099-6-hi@alyssa.is>
-rw-r--r-- | Documentation/using-spectrum/creating-vms.adoc | 5 | ||||
-rw-r--r-- | host/rootfs/Makefile | 4 | ||||
-rw-r--r-- | host/rootfs/default.nix | 6 | ||||
-rw-r--r-- | host/rootfs/etc/s6-rc/ext-rc-init/up | 7 | ||||
-rwxr-xr-x | host/rootfs/etc/template/gpu/data/check | 5 | ||||
-rw-r--r-- | host/rootfs/etc/template/gpu/notification-fd | 1 | ||||
-rw-r--r-- | host/rootfs/etc/template/gpu/notification-fd.license | 2 | ||||
-rwxr-xr-x | host/rootfs/etc/template/gpu/run | 9 | ||||
-rw-r--r-- | host/rootfs/etc/template/gpu/type | 1 | ||||
-rw-r--r-- | host/rootfs/etc/template/gpu/type.license | 2 | ||||
-rw-r--r-- | host/start-vm/lib.rs | 10 | ||||
-rw-r--r-- | vm-lib/make-vm.nix | 9 |
12 files changed, 57 insertions, 4 deletions
diff --git a/Documentation/using-spectrum/creating-vms.adoc b/Documentation/using-spectrum/creating-vms.adoc index f7560f0..9e37856 100644 --- a/Documentation/using-spectrum/creating-vms.adoc +++ b/Documentation/using-spectrum/creating-vms.adoc @@ -3,6 +3,7 @@ :page-nav_order: 2 // SPDX-FileCopyrightText: 2022 Alyssa Ross <hi@alyssa.is> +// SPDX-FileCopyrightText: 2022 Unikie // SPDX-License-Identifier: GFDL-1.3-no-invariants-or-later OR CC-BY-SA-4.0 == Configuration @@ -33,6 +34,10 @@ providers/net:: A directory containing a file named for each VM that should provide networking to this VM. The contents of these files are ignored. +wayland:: An empty file, whose presence indicates that the host should +set up a virtio-gpu device supporting the cross-domain context type, +for the VM to send Wayland messages over. + === Example A configuration directory for a VM called "appvm-lynx" dedicated to diff --git a/host/rootfs/Makefile b/host/rootfs/Makefile index be31fc3..64decbc 100644 --- a/host/rootfs/Makefile +++ b/host/rootfs/Makefile @@ -27,6 +27,10 @@ FILES = \ etc/template/fs/notification-fd \ etc/template/fs/run \ etc/template/fs/type \ + etc/template/gpu/data/check \ + etc/template/gpu/notification-fd \ + etc/template/gpu/run \ + etc/template/gpu/type \ etc/xdg/weston/autolaunch \ etc/xdg/weston/weston.ini \ usr/bin/lsvm \ diff --git a/host/rootfs/default.nix b/host/rootfs/default.nix index 85a1331..16477f4 100644 --- a/host/rootfs/default.nix +++ b/host/rootfs/default.nix @@ -46,8 +46,8 @@ let foot = pkgsGui.foot.override { allowPgo = false; }; packages = [ - cloud-hypervisor e2fsprogs execline jq kmod mdevd s6 s6-linux-init s6-rc - socat start-vm virtiofsd + cloud-hypervisor e2fsprogs execline jq kmod mdevd + s6 s6-linux-init s6-rc socat start-vm virtiofsd (cryptsetup.override { programs = { @@ -73,7 +73,7 @@ let CONFIG_RMMOD n ''; }) - ] ++ (with pkgsGui; [ foot westonLite ]); + ] ++ (with pkgsGui; [ crosvm foot westonLite ]); nixosAllHardware = nixos ({ modulesPath, ... }: { imports = [ (modulesPath + "/profiles/all-hardware.nix") ]; diff --git a/host/rootfs/etc/s6-rc/ext-rc-init/up b/host/rootfs/etc/s6-rc/ext-rc-init/up index 8b5c29e..cd5d2d0 100644 --- a/host/rootfs/etc/s6-rc/ext-rc-init/up +++ b/host/rootfs/etc/s6-rc/ext-rc-init/up @@ -26,6 +26,13 @@ if { touch -- ${name}/dependencies.d/${name}-fs-${fsname} } + if { + if -t { test -e ${dir}/wayland } + if { cp -R -- /etc/template/gpu ${name}-gpu } + if { mkdir -- ${name}-gpu/env } + touch -- ${name}/dependencies.d/${name}-gpu + } + elglob -0 paths /ext/svc/data/${name}/providers/net/* forx -po0 -E path { $paths } backtick -E dep { basename -- $path } diff --git a/host/rootfs/etc/template/gpu/data/check b/host/rootfs/etc/template/gpu/data/check new file mode 100755 index 0000000..113dcf0 --- /dev/null +++ b/host/rootfs/etc/template/gpu/data/check @@ -0,0 +1,5 @@ +#!/bin/execlineb -P +# SPDX-License-Identifier: EUPL-1.2+ +# SPDX-FileCopyrightText: 2022 Unikie + +test -S env/crosvm.sock diff --git a/host/rootfs/etc/template/gpu/notification-fd b/host/rootfs/etc/template/gpu/notification-fd new file mode 100644 index 0000000..00750ed --- /dev/null +++ b/host/rootfs/etc/template/gpu/notification-fd @@ -0,0 +1 @@ +3 diff --git a/host/rootfs/etc/template/gpu/notification-fd.license b/host/rootfs/etc/template/gpu/notification-fd.license new file mode 100644 index 0000000..2241beb --- /dev/null +++ b/host/rootfs/etc/template/gpu/notification-fd.license @@ -0,0 +1,2 @@ +SPDX-License-Identifier: CC0-1.0 +SPDX-FileCopyrightText: 2022 Unikie diff --git a/host/rootfs/etc/template/gpu/run b/host/rootfs/etc/template/gpu/run new file mode 100755 index 0000000..eaac8d6 --- /dev/null +++ b/host/rootfs/etc/template/gpu/run @@ -0,0 +1,9 @@ +#!/bin/execlineb -P +# SPDX-License-Identifier: EUPL-1.2+ +# SPDX-FileCopyrightText: 2022 Unikie + +s6-notifyoncheck -d +crosvm --no-syslog device gpu + --socket env/crosvm.sock + --wayland-sock /run/user/0/wayland-1 + --params "{\"context-types\":\"cross-domain\"}" diff --git a/host/rootfs/etc/template/gpu/type b/host/rootfs/etc/template/gpu/type new file mode 100644 index 0000000..5883cff --- /dev/null +++ b/host/rootfs/etc/template/gpu/type @@ -0,0 +1 @@ +longrun diff --git a/host/rootfs/etc/template/gpu/type.license b/host/rootfs/etc/template/gpu/type.license new file mode 100644 index 0000000..2241beb --- /dev/null +++ b/host/rootfs/etc/template/gpu/type.license @@ -0,0 +1,2 @@ +SPDX-License-Identifier: CC0-1.0 +SPDX-FileCopyrightText: 2022 Unikie diff --git a/host/start-vm/lib.rs b/host/start-vm/lib.rs index adf9915..8834202 100644 --- a/host/start-vm/lib.rs +++ b/host/start-vm/lib.rs @@ -1,5 +1,6 @@ // SPDX-License-Identifier: EUPL-1.2+ // SPDX-FileCopyrightText: 2022-2023 Alyssa Ross <hi@alyssa.is> +// SPDX-FileCopyrightText: 2022 Unikie mod ch; mod net; @@ -127,6 +128,15 @@ pub fn vm_command( Err(e) => return Err(format!("reading directory {:?}: {}", blk_dir, e)), } + if config_dir.join("wayland").exists() { + command.arg("--gpu").arg({ + let mut gpu = OsString::from("socket=../"); + gpu.push(vm_name); + gpu.push("-gpu/env/crosvm.sock"); + gpu + }); + } + let shared_dirs_dir = config_dir.join("shared-dirs"); match shared_dirs_dir.read_dir() { Ok(entries) => { diff --git a/vm-lib/make-vm.nix b/vm-lib/make-vm.nix index 80e6ef5..c3533ec 100644 --- a/vm-lib/make-vm.nix +++ b/vm-lib/make-vm.nix @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MIT # SPDX-FileCopyrightText: 2022 Alyssa Ross <hi@alyssa.is> +# SPDX-FileCopyrightText: 2022 Unikie { pkgs ? import <nixpkgs> {} @@ -13,7 +14,7 @@ pkgs.pkgsStatic.callPackage ( { lib, runCommand, writeReferencesToFile, erofs-utils }: -{ run, providers ? {}, sharedDirs ? {} }: +{ run, providers ? {}, sharedDirs ? {}, wayland ? false }: let inherit (lib) @@ -26,6 +27,8 @@ assert !(any (hasInfix "\n") (concatLists (attrValues providers))); runCommand "spectrum-vm" { nativeBuildInputs = [ erofs-utils ]; + inherit wayland; + providerDirs = concatStrings (concatLists (mapAttrsToList (kind: map (vm: "${kind}/${vm}\n")) providers)); passAsFile = [ "providerDirs" ]; @@ -53,6 +56,10 @@ runCommand "spectrum-vm" { popd + if [ -n "$wayland" ]; then + touch "$out/wayland" + fi + ln -s /usr/img/appvm/blk/root.img "$out/blk" ln -s /usr/img/appvm/vmlinux "$out" '' |