From 3985d8ac19a58f8285c02fa7557b708163c52899 Mon Sep 17 00:00:00 2001 From: "Lance R. Vick" Date: Mon, 28 Apr 2025 17:30:42 -0700 Subject: [PATCH] feat: netvm start now auto-attaches network pci devices --- src/host/rootfs/usr/local/bin/netvm | 35 +++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/src/host/rootfs/usr/local/bin/netvm b/src/host/rootfs/usr/local/bin/netvm index 4f3da67..4c3d940 100755 --- a/src/host/rootfs/usr/local/bin/netvm +++ b/src/host/rootfs/usr/local/bin/netvm @@ -5,16 +5,17 @@ COMMAND=($@) QGA_SOCKET=/var/run/netvm_qga.sock LOCKFILE=/var/run/netvm.pid -json() { - jq -ncM "$@" -} - qemu_execute() { local COMMAND ARGS COMMAND="$1" ARGS="${2-}" - json --arg cmd "$COMMAND" --argjson args "$ARGS" '{"execute": $cmd, "arguments": $args}' >&$FD_SOCKET_OUT + jq \ + -ncM \ + --arg cmd "$COMMAND" \ + --argjson args "$ARGS" \ + '{"execute": $cmd, "arguments": $args}' \ + >&$FD_SOCKET_OUT local LINE read -t 5 -r -u $FD_SOCKET_IN LINE @@ -41,8 +42,9 @@ qemu_ga() { FD_SOCKET_OUT=${FDS[1]} local PID=$$ - qemu_execute guest-sync "$(json --argjson pid "$PID" '{"id": $pid}')" - [[ "$(jq -re . <<< "$GA_RETURN")" = "$$" ]] || (echo "guest-sync mismatch" >&2 && return 1) + qemu_execute guest-sync "$(jq -ncM --argjson pid "$PID" '{"id": $pid}')" + [[ "$(jq -re . <<< "$GA_RETURN")" = "$$" ]] \ + || (echo "guest-sync mismatch" >&2 && return 1) qemu_execute "$COMMAND" "$ARGS" echo "$GA_RETURN" 2>&1 @@ -57,8 +59,20 @@ qemu_ga() { function cmd_start(){ [ ! -f "${LOCKFILE}" ] || { echo "Error: Netvm already running"; exit 1; } + local net_args="" + while read line; do + echo "Preparing PCI network device: $line" + bus=$(echo $line | awk '{ print $1 }') + id=$(echo $line | awk '{ print $4 }' | tr ':' ' ') + echo "$id" > /sys/bus/pci/drivers/vfio-pci/new_id || : + net_args="$net_args -device vfio-pci,host=${bus}" + done <<< "$(lspci | grep 0200 )" + if [[ -n "$net_args" ]]; then + echo Y > /sys/module/vfio_iommu_type1/parameters/allow_unsafe_interrupts + fi echo "Starting netvm"; - qemu-system-x86_64 -m 512M \ + qemu-system-x86_64 \ + -m 512M \ --machine q35 \ -nographic \ -serial none \ @@ -67,13 +81,16 @@ function cmd_start(){ -cdrom /guest.img \ -boot order=d \ -chardev socket,path=/var/run/netvm_qga.sock,server=on,wait=off,id=qga0 \ + $net_args \ -device virtio-serial \ -device virtserialport,chardev=qga0,name=org.qemu.guest_agent.0 & echo $! > "${LOCKFILE}" + #TODO: Poll here for VM to come up and respond to QMP agent ping } function cmd_stop(){ - pkill -F "${LOCKFILE}" && rm "${LOCKFILE}" + pkill $(cat "${LOCKFILE}") + rm "${LOCKFILE}" } function cmd_status(){