From c608ad5ccde2f56f19790ed9f5d4a043b1c55dda Mon Sep 17 00:00:00 2001 From: Anton Livaja Date: Wed, 30 Apr 2025 18:48:15 -0700 Subject: [PATCH] feat: add hot plugging for usb devices --- src/host/rootfs/usr/local/bin/netvm | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/host/rootfs/usr/local/bin/netvm b/src/host/rootfs/usr/local/bin/netvm index 147147f..8ce6279 100755 --- a/src/host/rootfs/usr/local/bin/netvm +++ b/src/host/rootfs/usr/local/bin/netvm @@ -4,6 +4,7 @@ set -eu COMMAND=($@) LOCKFILE=/var/run/netvm.pid QGA_SOCK_PATH=/var/run/netvm_qga.sock +QMP_SOCK_PATH=/var/run/netvm_qmp.sock QGA_SOCK_FDS=false qga_connect() { @@ -107,9 +108,10 @@ function cmd_start(){ -net none \ -cdrom /guest.img \ -boot order=d \ - -chardev socket,path=/var/run/netvm_qga.sock,server=on,wait=off,id=qga0 \ + -chardev socket,path=${QGA_SOCK_PATH},server=on,wait=off,id=qga0 \ + -qmp unix:${QMP_SOCK_PATH},server,nowait \ $net_args \ - -device qemu-xhci \ + -device qemu-xhci,id=usb \ -device virtio-serial \ -device virtserialport,chardev=qga0,name=org.qemu.guest_agent.0 \ >/dev/null 2>&1 &! @@ -237,6 +239,20 @@ function cmd_run(){ done } +function cmd_attach() { + local id="${COMMAND[1]}" + IFS=":" read vendorid_hex productid_hex <<< "$id" + + vendorid=$(printf "%d\n" "0x$vendorid_hex") + productid=$(printf "%d\n" "0x$productid_hex") + echo $productid + echo $vendorid + ( + echo '{"execute":"qmp_capabilities"}' + echo '{"execute":"device_add","arguments":{"driver":"usb-host","bus":"usb.0","vendorid":'$vendorid',"productid":'$productid'}}' + ) | socat - UNIX-CONNECT:/var/run/netvm_qmp.sock +} + cmd_usage() { cat <<-_EOF netvm @@ -252,6 +268,8 @@ cmd_usage() { Start interactive network vm in the foreground netvm status Get hostname and uptime from running network vm + netvm attach + Hot-plug a USB device to network VM netvm push Push a local file to the network VM netvm pull