feat: netvm start now auto-attaches network pci devices

This commit is contained in:
Lance Vick 2025-04-28 17:30:42 -07:00
parent ea07569187
commit 3985d8ac19
Signed by: lrvick
GPG Key ID: 8E47A1EC35A1551D
1 changed files with 26 additions and 9 deletions

View File

@ -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(){