mirror of
https://github.com/jamesstringer90/appsandbox.git
synced 2026-10-22 11:03:15 -05:00
Ubuntu 26.04 LTS guest end-to-end:
- cidata-driven autoinstall pipeline (subiquity user-data + nested
cloud-init bootcmd) in disk_util.c. Static NAT IP, ssh-via-vsock
marker, serial-debug kernel cmdline injected into ESP grub.cfg by
iso-patch.exe. Five separate firstboot pipeline fixes get the VM
to GDM unattended on Hyper-V Gen 2.
- Linux guest stack under tools/linux/:
- appsandbox-agent (vsock :1 control + clipboard helper spawn)
- appsandbox-audio (snd-aloop -> vsock :4)
- appsandbox-display (KMS framebuffer capture -> vsock :2)
- appsandbox-input (uinput injection <- vsock :3)
- appsandbox-clipboard (XCB selection bridge <-> vsock :5/:6)
Helper binaries staged via release/resources/linux/.
- asb_drm DRM module: virtual single-CRTC display sink the host
captures over vsock. Platform-bus, DRIVER_GEM/MODESET/ATOMIC/RENDER,
linear shmem framebuffers. asb-evict-simpledrm.service unbinds the
EFI simple-framebuffer before display-manager so mutter binds
asb_drm as the sole DRM card.
- dxgkrnl vendored byte-identical from microsoft/WSL2-Linux-Kernel
linux-msft-wsl-6.18.y with our DKMS/out-of-tree shim (dxgkrnl_compat.h
+ Kbuild + dkms.conf). Autoinstall late-commands dkms-builds against
every /target/lib/modules/<kver> so kernel-version drift between ISO
and post-update reboot still leaves a working .ko.
- wsl-mesa custom build (Mesa 25.3 + d3d12 gallium + microsoft-
experimental dzn Vulkan). Installs to /opt/wsl-mesa parallel to
Ubuntu's stock Mesa. Prebuilt tarball for ubuntu-26.04-amd64
shipped under tools/linux/wsl-mesa/prebuilt/ (21 MB).
- Per-VM GPU acceleration policy:
- /etc/systemd/user-environment-generators/50-appsandbox-gpu
emits GALLIUM_DRIVER=d3d12 + LD_LIBRARY_PATH + VK_DRIVER_FILES
into the user@1000 systemd-user environment when /dev/dxg and
/opt/wsl-mesa are present. Inherited by every app-*.scope a
.desktop launch creates.
- /etc/systemd/user/org.gnome.Shell@.service.d/no-gpu.conf
UnsetEnvironment= strips these for the compositor — mutter
stays on llvmpipe so asb_drm scanout works (the d3d12 pipe has
no GBM compatibility with asb_drm).
- /usr/local/bin/appsandbox-gpu wrapper for terminal-launched
opt-in GPU acceleration (probes /dev/dxg; no-op on no-GPU VMs).
- Host changes:
- vm_display_idd.c, vm_clipboard.c, vm_agent.c, vm_ssh_proxy.c,
asb_display.c: hcs_service_guid(os_type, port) so the same code
paths reach the per-OS service identifiers (HV_GUID for Windows,
vsock template for Linux).
- asb_core.c: linux_create_thread builds an empty VHDX, cidata
ISO with extras (agent ELFs, dxgkrnl src, asb_drm src, wsl-mesa
tarball, wsl-deps libs), and boots the desktop ISO + cidata.
- hcs_vm.c: HostLxssLib Plan9 share appended for Linux VMs;
VideoMonitor + ComPorts retained for serial debug.
- gpu_enum.c/h: gpu_append_lxsslib_share helper.
- vm_clipboard.c file-drop support (CF_HDROP / x-special/gnome-
copied-files round-trip).
- vm_display_idd.c: 32-bit S32_LE PCM audio path matches the
Linux daemon's snd-aloop capture format.
- iso-patch.c gains a patch_ubuntu_esp_grub_for_debug pass that
rewrites /EFI/ubuntu/grub.cfg via the FAT32 ESP, plus a qcow2->
vhdx converter with a RFC 1951 DEFLATE inflater for compressed
cluster handling.
- wsl-deps: Microsoft's libd3d12.so / libd3d12core.so / libdxcore.so
fetched on demand from the public NuGet feed
pkgs.dev.azure.com/shine-oss/wsl (no auth). Staged at
/opt/appsandbox/wsl-deps on the guest and put on /etc/ld.so.conf.d
rather than /usr/lib/wsl/lib (which is overlaid by the agent's
9P mount).
UI: web/{app.js,index.html} expose Linux VM creation + GPU selection,
distribution dropdown for cached Ubuntu ISOs, and the ISO picker for
custom images.
63 lines
2.0 KiB
Bash
63 lines
2.0 KiB
Bash
#!/bin/sh
|
|
# AppSandbox virtual DRM driver — first-cut deploy script for the running VM.
|
|
#
|
|
# Runs entirely on the guest. Builds the module against the running kernel,
|
|
# installs the DKMS package, drops the modprobe blacklist + autoload files,
|
|
# and rebuilds the initramfs so the changes survive reboot.
|
|
#
|
|
# Run as: sudo sh deploy.sh
|
|
set -eu
|
|
|
|
SRC_DIR=$(cd "$(dirname "$0")" && pwd)
|
|
PKG_VERSION=$(awk -F\" '/^PACKAGE_VERSION/ {print $2}' "$SRC_DIR/dkms.conf")
|
|
PKG_NAME=asb_drm
|
|
|
|
if [ "$(id -u)" != 0 ]; then
|
|
echo "Run as root (sudo sh $0)" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "--- installing build deps ---"
|
|
apt-get update -qq
|
|
apt-get install -y --no-install-recommends \
|
|
build-essential \
|
|
dkms \
|
|
"linux-headers-$(uname -r)" \
|
|
>/dev/null
|
|
|
|
echo "--- staging source at /usr/src/${PKG_NAME}-${PKG_VERSION} ---"
|
|
DST=/usr/src/${PKG_NAME}-${PKG_VERSION}
|
|
rm -rf "$DST"
|
|
mkdir -p "$DST"
|
|
cp "$SRC_DIR"/*.c "$SRC_DIR"/*.h "$SRC_DIR/Kbuild" "$SRC_DIR/Makefile" "$SRC_DIR/dkms.conf" "$DST"/
|
|
|
|
echo "--- DKMS add/build/install ---"
|
|
dkms add -m "$PKG_NAME" -v "$PKG_VERSION" 2>/dev/null || true
|
|
dkms build -m "$PKG_NAME" -v "$PKG_VERSION"
|
|
dkms install -m "$PKG_NAME" -v "$PKG_VERSION" --force
|
|
|
|
echo "--- system configs ---"
|
|
install -m 0644 "$SRC_DIR/modprobe.d-asb_drm.conf" /etc/modprobe.d/asb_drm.conf
|
|
install -m 0644 "$SRC_DIR/modules-load.d-asb_drm.conf" /etc/modules-load.d/asb_drm.conf
|
|
install -m 0644 "$SRC_DIR/systemd-asb-evict-simpledrm.service" \
|
|
/etc/systemd/system/asb-evict-simpledrm.service
|
|
systemctl daemon-reload
|
|
systemctl enable asb-evict-simpledrm.service
|
|
|
|
echo "--- rebuild initramfs (so hyperv_drm blacklist takes effect at boot) ---"
|
|
update-initramfs -u
|
|
|
|
cat <<EOF
|
|
--- done ---
|
|
The module is installed and will autoload on next boot.
|
|
To activate now without reboot:
|
|
|
|
sudo modprobe -r hyperv_drm 2>/dev/null
|
|
sudo modprobe asb_drm
|
|
|
|
Then verify with:
|
|
lsmod | grep asb_drm
|
|
ls /dev/dri/
|
|
dmesg | grep -i 'AppSandbox virtual display'
|
|
EOF
|