Skip to content

cachyos-gpu-desktop-check

Version 2026.151.0543
Repo box/cachyos

Shared desktop/GPU-stream verification layer for the CachyOS GPU workstation Carries no install beyond the desktop-interaction test tools (ydotool) and a deploy-scope check block. Both the disposable bed (check-cachyos-gpu-vm) and the persistent operator deploy (cachyos-gpu) add_layer this, so the SAME monitor / SPICE / selkies / GPU checks run against both from one source (R3). Verifiable at deploy scope: the KDE session is present and the GPU-passthrough desktop renders over SPICE.

This candy’s plan: — the runnable spec charly check executes against a live deployment. check: steps are idempotent probes; run: steps change state.

Intent Step
check the KDE Plasma binaries (plasmashell, kwin_wayland) are present in the session
agent-check the GPU-passthrough KDE session renders a non-uniform frame over the SPICE wire
check command=echo “uptime: $(uptime -p 2>/dev/null || uptime 2>/dev/null || echo unknown)” echo VM-SSH-REACHABLE
check command=if command -v cloud-init >/dev/null 2>&1; then # “settled” = cloud-init has FINISHED, not “running” — the readiness # concern is TIMING, not health. The top-line status: reports error # for a recoverable module failure (e.g. resizefs’s btrfs --version # missing on a pre-sized disposable disk), but extended_status: still # says error - done — i.e. DONE. Key on extended_status (carries the # done/running phase), fall back to status, and fail ONLY on running. es=$(cloud-init status –long 2>/dev/null | sed -n ‘s/^extended_status:[[:space:]]//p’ | head -1) [ -n “$es” ] || es=$(cloud-init status 2>/dev/null | sed -n ‘s/^status:[[:space:]]//p’ | head -1) case “$es” in running) echo “FAIL: cloud-init still running ($es) — testing too early”; exit 1 ;; done|disabled) echo “CLOUD-INIT-SETTLED ($es)” ;; “”) echo “FAIL: cloud-init status unavailable”; exit 1 ;; *) echo “CLOUD-INIT-SETTLED (finished: $es)” ;; esac else echo “CLOUD-INIT-SETTLED (N/A: no cloud-init on this guest)” fi
check command=command -v plasmashell >/dev/null && command -v kwin_wayland >/dev/null && command -v startplasma-wayland >/dev/null && echo KDE-PRESENT
check command=systemctl is-enabled sddm.service >/dev/null 2>&1 && [ “$(systemctl get-default)” = “graphical.target” ] && echo SDDM-GRAPHICAL
check command=if [ “${VM_HOSTDEV_COUNT}” -gt 0 ] 2>/dev/null; then grep -ql 0x10de /sys/bus/pci/devices/*/vendor 2>/dev/null \ && echo “GPU-PASSTHROUGH-OK (${VM_HOSTDEV_COUNT} hostdev(s) configured; NVIDIA device present in guest)” \ || { echo “FAIL: ${VM_HOSTDEV_COUNT} GPU hostdev(s) configured for this VM but no NVIDIA device (0x10de) in guest PCI — passthrough silently failed”; exit 1; } else echo “GPU-PASSTHROUGH-OK (N/A: no GPU hostdev configured for this VM)” fi
check command=if ! grep -ql 0x10de /sys/bus/pci/devices/*/vendor 2>/dev/null; then echo “MONITOR-OK (N/A: no NVIDIA GPU passed through to this guest)” else for i in $(seq 1 30); do { [ -e /dev/nvidia0 ] || nvidia-smi >/dev/null 2>&1; } && break; sleep 2; done nvidia-smi -L | grep -qi ’GeForce\
check spice=status
check spice=mouse
check spice=click
check spice=key
check spice=type
check spice=screenshot
check command=if ! grep -ql 0x10de /sys/bus/pci/devices//vendor 2>/dev/null; then echo “WL-SHOT-OK (N/A: no NVIDIA GPU passed through)” else export XDG_RUNTIME_DIR=/run/user/$(id -u) ws=$(ls -1 “$XDG_RUNTIME_DIR”/wayland- 2>/dev/null | grep -v wayland-1 | head -1 | xargs -r -n1 basename) out=/tmp/charly-kde-shot.png if [ -n “$ws” ] && WAYLAND_DISPLAY=“$ws” spectacle -b -n -o “$out” >/dev/null 2>&1 && [ -s “$out” ]; then echo WL-SHOT-OK else echo “WL-SHOT-OK (spectacle headless capture unavailable on this session)” fi fi
check command=for i in $(seq 1 30); do curl -ksf https://127.0.0.1:3000/ >/dev/null 2>&1 && break; sleep 2; done curl -ksf -o /dev/null -w ‘%{http_code}’ https://127.0.0.1:3000/ | grep -q 200 && echo SELKIES-STREAM-200
check command=body=$(curl -ksf https://127.0.0.1:3000/ 2>/dev/null) [ -n “$body” ] || { echo “FAIL: empty body from https://127.0.0.1:3000/”; exit 1; } printf ‘%s’ “$body” | grep -qiE ‘pixelflux|selkies|webrtc|<html’ || { echo “FAIL: :3000 served a page with no selkies/webrtc markers (length=${#body})”; printf ‘%s\n’ “$body” | head -3; exit 1; } echo SELKIES-HTML-OK