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.
123 lines
4.6 KiB
Makefile
123 lines
4.6 KiB
Makefile
# tools/linux/Makefile
|
|
#
|
|
# Top-level orchestrator for everything that has to be built on a Linux box
|
|
# for AppSandbox to support Linux guests: the 5 agent daemons (userspace
|
|
# ELFs) plus the two out-of-tree kernel modules (dxgkrnl and asb_drm).
|
|
#
|
|
# Workflow
|
|
# --------
|
|
#
|
|
# 1. Clone the appsandbox repo onto a Linux machine that has matching kernel
|
|
# headers installed (e.g. Ubuntu 26.04 with linux-headers-generic).
|
|
# 2. cd tools/linux
|
|
# 3. make
|
|
# 4. Build artifacts land under tools/linux/dist/ — gitignored, this dir is
|
|
# only valid on this machine for this kernel.
|
|
# 5. Copy dist/ over to your Windows host's appsandbox checkout, into
|
|
# release/resources/linux/. Final instructions are printed at the end of
|
|
# a successful build.
|
|
# 6. On the Windows host, rebuild AppSandbox.sln. The existing PostBuildEvent
|
|
# on AppSandbox.vcxproj xcopies release/resources/ -> bin/<cfg>/resources/,
|
|
# so the Linux tree comes along for the ride.
|
|
#
|
|
# Targets
|
|
# -------
|
|
# make agents + modules + install to dist/ (default)
|
|
# make compile build only, don't populate dist/
|
|
# make agents build only the userspace daemons
|
|
# make modules build only the kernel modules
|
|
# make clean wipe build outputs (object files, binaries, .ko)
|
|
# make distclean clean + remove dist/
|
|
|
|
KVER := $(shell uname -r)
|
|
ARCH := $(shell uname -m)
|
|
DISTDIR := $(CURDIR)/dist
|
|
|
|
.PHONY: all compile agents modules dxgkrnl asb_drm install-agents install-modules \
|
|
clean distclean copy-help
|
|
|
|
all: compile install-agents install-modules copy-help
|
|
|
|
compile: agents modules
|
|
|
|
# ---- userspace daemons ------------------------------------------------------
|
|
|
|
# Re-uses the existing tools/linux/agent/Makefile which knows how to compile
|
|
# each daemon with the right libs (libdrm for display, libasound for audio,
|
|
# libxcb for clipboard).
|
|
agents:
|
|
$(MAKE) -C agent
|
|
|
|
install-agents: agents
|
|
@install -d $(DISTDIR)
|
|
@for bin in appsandbox-agent appsandbox-audio appsandbox-clipboard \
|
|
appsandbox-display appsandbox-input; do \
|
|
if [ -f agent/$$bin ]; then \
|
|
install -m 0755 agent/$$bin $(DISTDIR)/; \
|
|
echo " installed $(DISTDIR)/$$bin"; \
|
|
fi; \
|
|
done
|
|
|
|
# ---- kernel modules ---------------------------------------------------------
|
|
#
|
|
# Both modules use the standard out-of-tree kbuild idiom (`make -C
|
|
# /lib/modules/<kver>/build M=<src>`). We don't go through DKMS here —
|
|
# DKMS is a runtime concern handled by setup.sh inside the guest VM. Here
|
|
# we just produce a .ko for the current kernel.
|
|
|
|
modules: dxgkrnl asb_drm
|
|
|
|
dxgkrnl:
|
|
$(MAKE) -C /lib/modules/$(KVER)/build M=$(CURDIR)/dxgkrnl/src modules
|
|
|
|
asb_drm:
|
|
$(MAKE) -C /lib/modules/$(KVER)/build M=$(CURDIR)/asb_drm modules
|
|
|
|
install-modules: modules
|
|
@install -d $(DISTDIR)/modules/$(KVER)
|
|
@if [ -f dxgkrnl/src/dxgkrnl.ko ]; then \
|
|
install -m 0644 dxgkrnl/src/dxgkrnl.ko $(DISTDIR)/modules/$(KVER)/; \
|
|
echo " installed $(DISTDIR)/modules/$(KVER)/dxgkrnl.ko"; \
|
|
fi
|
|
@if [ -f asb_drm/asb_drm.ko ]; then \
|
|
install -m 0644 asb_drm/asb_drm.ko $(DISTDIR)/modules/$(KVER)/; \
|
|
echo " installed $(DISTDIR)/modules/$(KVER)/asb_drm.ko"; \
|
|
fi
|
|
|
|
# ---- cleanup ----------------------------------------------------------------
|
|
|
|
clean:
|
|
-$(MAKE) -C agent clean
|
|
-$(MAKE) -C /lib/modules/$(KVER)/build M=$(CURDIR)/dxgkrnl/src clean
|
|
-$(MAKE) -C /lib/modules/$(KVER)/build M=$(CURDIR)/asb_drm clean
|
|
|
|
distclean: clean
|
|
rm -rf $(DISTDIR)
|
|
|
|
# ---- copy-to-Windows reminder ----------------------------------------------
|
|
|
|
copy-help:
|
|
@printf '\n'
|
|
@printf '================================================================\n'
|
|
@printf 'Build complete. Artifacts staged in:\n'
|
|
@printf ' %s\n' '$(DISTDIR)'
|
|
@printf '\n'
|
|
@printf 'Next step (manual): get this dist/ tree onto your Windows host\n'
|
|
@printf 'and drop the contents at:\n'
|
|
@printf ' <appsandbox>/release/resources/linux/\n'
|
|
@printf '\n'
|
|
@printf 'A simple tarball is fine; transfer it by whatever means you\n'
|
|
@printf 'normally use to move files between this machine and the host\n'
|
|
@printf '(USB stick, shared drive, file-share VM, scp, etc.):\n'
|
|
@printf '\n'
|
|
@printf ' tar -C %s -czf ~/asb-linux.tar.gz .\n' '$(DISTDIR)'
|
|
@printf '\n'
|
|
@printf 'Then on the Windows host, in your appsandbox checkout, extract\n'
|
|
@printf 'over release/resources/linux/ (creating the dir if needed).\n'
|
|
@printf '\n'
|
|
@printf 'After copying, rebuild AppSandbox.sln (Release). The PostBuildEvent\n'
|
|
@printf 'on AppSandbox.vcxproj xcopies release/resources/ into\n'
|
|
@printf 'bin/<cfg>/resources/, so the Linux artifacts travel to the runtime\n'
|
|
@printf 'location automatically.\n'
|
|
@printf '================================================================\n'
|