Files
appsandbox/tools/linux/dxgkrnl
James Stringer 2309cec029 Add Linux VM support with GPU-PV
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.
2026-05-19 20:21:43 -04:00
..
2026-05-19 20:21:43 -04:00
2026-05-19 20:21:43 -04:00
2026-05-19 20:21:43 -04:00

dxgkrnl — Hyper-V GPU-PV kernel module for Linux guests

Vendored from microsoft/WSL2-Linux-Kernel branch linux-msft-wsl-6.18.y, drivers/hv/dxgkrnl/. Distributed as a DKMS source package so it rebuilds automatically on kernel upgrades.

Layout

tools/dxgkrnl/
├── README.md
├── Makefile                          ← dev convenience: out-of-tree build for $(uname -r)
├── src/                              ← DKMS package contents (gets copied to /usr/src/dxgkrnl-2.0.3/)
│   ├── dkms.conf
│   ├── Kbuild
│   ├── dxgkrnl_compat.h              ← out-of-tree compat shims (vmbus device-ID GUIDs)
│   ├── dxgmodule.c, dxgadapter.c, ioctl.c, dxgvmbus.c, ...
│   └── include/uapi/misc/d3dkmthk.h  ← from kernel uapi, vendored
└── prebuilt/                         ← cache of binaries known to load on specific kernels
    └── <kernel-vermagic>/dxgkrnl.ko

Install on a Linux VM

The Linux VM-creation flow (TBD) stages src/ as /usr/src/dxgkrnl-2.0.3/ and runs:

dkms add  -m dxgkrnl -v 2.0.3
dkms build -m dxgkrnl -v 2.0.3
dkms install -m dxgkrnl -v 2.0.3
echo dxgkrnl > /etc/modules-load.d/dxgkrnl.conf

DKMS handles kernel-upgrade survival automatically via the kernel's postinst dkms autoinstall hook.

Why prebuilt/?

A backup of binaries that we know work. Each entry is keyed by uname -r (e.g. 7.0.0-14-generic). Useful when DKMS rebuild fails for any reason (rare). The signed .ko.zst files were signed with the VM's local MOK key — fine because AppSandbox Linux VMs run with test_mode=true (Secure Boot off), so signature verification is not enforced. They will load on any host's Ubuntu 26.04 / kernel 7.0.0-14-generic.

Adding support for a new kernel

  1. Build a VM with that kernel installed.
  2. Stage src/ as /usr/src/dxgkrnl-2.0.3/ and run the DKMS dance above.
  3. Copy /lib/modules/$(uname -r)/updates/dkms/dxgkrnl.ko.zst and its decompressed form back to tools/dxgkrnl/prebuilt/<uname -r>/.
  4. Commit.

Source origin

src/*.c, src/*.h, and src/include/uapi/misc/d3dkmthk.h are verbatim from microsoft/WSL2-Linux-Kernel (sparse-checkout). The upstream in-tree Makefile was dropped — out-of-tree builds use src/Kbuild instead. src/dxgkrnl_compat.h and src/dkms.conf are new files local to this repo.