summaryrefslogtreecommitdiffstats
path: root/scripts/launch_qemu_vgpu.sh
diff options
context:
space:
mode:
authorArthur Hanson Rasmusson <arthur@vgpu.io>2026-09-13 18:36:21 -0400
committerArthur Hanson Rasmusson <arthur@vgpu.io>2026-09-13 18:36:21 -0400
commit00e54c13c7c9030c4d5f7151467f2d85a3730e29 (patch)
tree17a45239df8d2e4912ff3697ed06e85a10b969de /scripts/launch_qemu_vgpu.sh
downloadopen-iov-00e54c13c7c9030c4d5f7151467f2d85a3730e29.tar.gz
open-iov-00e54c13c7c9030c4d5f7151467f2d85a3730e29.zip
Initial commit: Open-IOV vGPU-IO complete stack
- Firmware decompilation: GSP 570.144W (28.5MB ELF, RV64IMAC), 132 decompiled C files - Kernel modules: nvidia.ko (34MB, OpenRM), open-iov-vfio.ko (2.8MB, VFIO mdev), gsp-vgpu.ko (1.8MB, guest driver) - Userspace: libiov.so/libvgpu.so (76KB), example_vgpu (28KB), rpc_emulator.c - PCI config space emulation (256B with PM, MSI, MSI-X, PCIe caps) - 12 RPC types fully mapped from firmware decompilation - BAR trap, WPR, scheduling, notification, migration emulation - Helper scripts: load_vgpu_stack, create_mdev, launch_qemu_vgpu, test_vgpu_stack, setup_guest_driver, unload_vgpu_stack - Architecture documentation - Wiki: 10 technical documents - Git LFS for large binaries (.ko, .bin, .iso, .img, .o, ghidra repos) - nvidia-open-gpu-kernel-modules as submodule
Diffstat (limited to 'scripts/launch_qemu_vgpu.sh')
-rwxr-xr-xscripts/launch_qemu_vgpu.sh183
1 files changed, 183 insertions, 0 deletions
diff --git a/scripts/launch_qemu_vgpu.sh b/scripts/launch_qemu_vgpu.sh
new file mode 100755
index 0000000..5a57737
--- /dev/null
+++ b/scripts/launch_qemu_vgpu.sh
@@ -0,0 +1,183 @@
+#!/bin/bash
+# launch_qemu_vgpu.sh - Launch QEMU with NVIDIA vGPU mediated device
+# Usage: ./launch_qemu_vgpu.sh [MDEV_UUID] [GUEST_IMAGE] [OPTIONS]
+
+set -euo pipefail
+
+MDEV_UUID="${1:-}"
+GUEST_IMAGE="${2:-/var/lib/libvirt/images/ubuntu-22.04.qcow2}"
+shift 2 || true
+EXTRA_QEMU_ARGS=("$@")
+
+# Find mdev device if UUID not specified
+if [[ -z "$MDEV_UUID" ]]; then
+ echo "Scanning for available mdev devices..."
+ mapfile -t MDEVS < <(find /sys/bus/mdev/devices -maxdepth 1 -name "????????-????-????-????-????????????" -printf "%f\n" 2>/dev/null)
+ if [[ ${#MDEVS[@]} -eq 0 ]]; then
+ echo "ERROR: No mdev devices found. Run create_mdev.sh first."
+ exit 1
+ elif [[ ${#MDEVS[@]} -eq 1 ]]; then
+ MDEV_UUID="${MDEVS[0]}"
+ echo "Auto-selected mdev: $MDEV_UUID"
+ else
+ echo "Multiple mdev devices found:"
+ for i in "${!MDEVS[@]}"; do
+ MDEV="${MDEVS[$i]}"
+ TYPE=$(cat "/sys/bus/mdev/devices/$MDEV/mdev_type/name" 2>/dev/null || echo "unknown")
+ echo " [$i] $MDEV ($TYPE)"
+ done
+ read -p "Select mdev [0-$((${#MDEVS[@]}-1))]: " idx
+ MDEV_UUID="${MDEVS[$idx]}"
+ fi
+fi
+
+MDEV_PATH="/sys/bus/mdev/devices/$MDEV_UUID"
+
+if [[ ! -d "$MDEV_PATH" ]]; then
+ echo "ERROR: mdev device $MDEV_UUID not found at $MDEV_PATH"
+ exit 1
+fi
+
+# Verify guest image
+if [[ ! -f "$GUEST_IMAGE" ]]; then
+ echo "ERROR: Guest image not found: $GUEST_IMAGE"
+ echo "Create one with: qemu-img create -f qcow2 $GUEST_IMAGE 50G"
+ exit 1
+fi
+
+# Check KVM
+if [[ ! -r /dev/kvm ]]; then
+ echo "ERROR: KVM not available (/dev/kvm not readable)"
+ exit 1
+fi
+
+# Check VFIO
+if [[ ! -e /dev/vfio/vfio ]]; then
+ echo "ERROR: VFIO not available"
+ exit 1
+fi
+
+# Get mdev info
+VGPU_TYPE=$(cat "$MDEV_PATH/mdev_type/name" 2>/dev/null || echo "unknown")
+PCI_ADDR=$(readlink -f "$MDEV_PATH/../../.." | xargs basename)
+
+echo "=========================================="
+echo "Launching QEMU with NVIDIA vGPU"
+echo "=========================================="
+echo "mdev UUID: $MDEV_UUID"
+echo "vGPU Type: $VGPU_TYPE"
+echo "PCI Addr: $PCI_ADDR"
+echo "Guest Image: $GUEST_IMAGE"
+echo "Extra Args: ${EXTRA_QEMU_ARGS[*]}"
+echo "=========================================="
+
+# CPU configuration for vGPU
+CPU_OPTS=(
+ -cpu host,hv_time,hv_relaxed,hv_vapic,hv_spinlocks=0x1fff,hv_vendor_id=NVIDIA42
+ -smp 8,sockets=1,cores=8,threads=1
+ -m 16G,slots=4,maxmem=64G
+ -mem-prealloc
+)
+
+# Memory backing for hugepages (better performance)
+HUGEPAGE_OPTS=(
+ -object memory-backend-file,id=mem,size=16G,mem-path=/dev/hugepages,share=on
+ -numa node,memdev=mem
+)
+
+# VFIO device configuration
+VFIO_OPTS=(
+ -device vfio-pci,sysfsdev="$MDEV_PATH",display=off,x-igd-opregion=on
+ -device vfio-pci,sysfsdev="$MDEV_PATH",display=off,romfile=
+)
+
+# Display (use SPICE/VNC for headless, or virtio-gpu for local)
+DISPLAY_OPTS=(
+ -vga none
+ -display none
+ # Uncomment for VNC:
+ # -vnc :1
+ # Uncomment for SPICE:
+ # -spice port=5900,addr=127.0.0.1,disable-ticketing=on
+ # -device virtio-serial-pci
+ # -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0
+ # -chardev spicevmc,id=spicechannel0,name=vdagent
+)
+
+# Network
+NET_OPTS=(
+ -netdev user,id=net0,hostfwd=tcp::2222-:22
+ -device virtio-net-pci,netdev=net0
+)
+
+# Storage
+STORAGE_OPTS=(
+ -drive file="$GUEST_IMAGE",format=qcow2,if=virtio,cache=writeback,aio=threads
+ # Add ISO for installation:
+ # -drive file=/path/to/ubuntu-22.04-live-server-amd64.iso,format=raw,if=virtio,media=cdrom
+)
+
+# USB tablet for better mouse integration
+USB_OPTS=(
+ -usb
+ -device usb-tablet
+)
+
+# RNG
+RNG_OPTS=(
+ -object rng-random,id=rng0,filename=/dev/urandom
+ -device virtio-rng-pci,rng=rng0
+)
+
+# TPM (optional, for Windows guests)
+# TPM_OPTS=(
+# -chardev socket,id=chrtpm,path=/var/run/tpm-emulator/swtpm-sock
+# -tpmdev emulator,id=tpm0,chardev=chrtpm
+# -device tpm-tis,tpmdev=tpm0
+# )
+
+# QEMU command
+QEMU_CMD=(
+ qemu-system-x86_64
+ -enable-kvm
+ -machine q35,accel=kvm,kernel_irqchip=split
+ -bios /usr/share/ovmf/OVMF.fd
+ "${CPU_OPTS[@]}"
+ "${HUGEPAGE_OPTS[@]}"
+ "${VFIO_OPTS[@]}"
+ "${DISPLAY_OPTS[@]}"
+ "${NET_OPTS[@]}"
+ "${STORAGE_OPTS[@]}"
+ "${USB_OPTS[@]}"
+ "${RNG_OPTS[@]}"
+ "${EXTRA_QEMU_ARGS[@]}"
+ -name "vGPU-Guest-$VGPU_TYPE"
+ -pidfile "/tmp/qemu-vgpu-$MDEV_UUID.pid"
+ -daemonize
+)
+
+echo "Starting QEMU..."
+echo "Command: ${QEMU_CMD[*]}"
+echo ""
+
+"${QEMU_CMD[@]}"
+
+sleep 2
+
+if [[ -f "/tmp/qemu-vgpu-$MDEV_UUID.pid" ]]; then
+ PID=$(cat "/tmp/qemu-vgpu-$MDEV_UUID.pid")
+ if kill -0 "$PID" 2>/dev/null; then
+ echo "SUCCESS: QEMU started with PID $PID"
+ echo ""
+ echo "Connect via SSH: ssh -p 2222 user@localhost"
+ echo "Or VNC: vncviewer localhost:1 (if enabled)"
+ echo ""
+ echo "To stop: kill $PID"
+ else
+ echo "ERROR: QEMU failed to start"
+ exit 1
+ fi
+else
+ echo "ERROR: QEMU PID file not created"
+ exit 1
+fi \ No newline at end of file