feat: netvm start now auto-attaches network pci devices
This commit is contained in:
parent
ea07569187
commit
3985d8ac19
|
@ -5,16 +5,17 @@ COMMAND=($@)
|
||||||
QGA_SOCKET=/var/run/netvm_qga.sock
|
QGA_SOCKET=/var/run/netvm_qga.sock
|
||||||
LOCKFILE=/var/run/netvm.pid
|
LOCKFILE=/var/run/netvm.pid
|
||||||
|
|
||||||
json() {
|
|
||||||
jq -ncM "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
qemu_execute() {
|
qemu_execute() {
|
||||||
local COMMAND ARGS
|
local COMMAND ARGS
|
||||||
COMMAND="$1"
|
COMMAND="$1"
|
||||||
ARGS="${2-}"
|
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
|
local LINE
|
||||||
read -t 5 -r -u $FD_SOCKET_IN LINE
|
read -t 5 -r -u $FD_SOCKET_IN LINE
|
||||||
|
@ -41,8 +42,9 @@ qemu_ga() {
|
||||||
FD_SOCKET_OUT=${FDS[1]}
|
FD_SOCKET_OUT=${FDS[1]}
|
||||||
|
|
||||||
local PID=$$
|
local PID=$$
|
||||||
qemu_execute guest-sync "$(json --argjson pid "$PID" '{"id": $pid}')"
|
qemu_execute guest-sync "$(jq -ncM --argjson pid "$PID" '{"id": $pid}')"
|
||||||
[[ "$(jq -re . <<< "$GA_RETURN")" = "$$" ]] || (echo "guest-sync mismatch" >&2 && return 1)
|
[[ "$(jq -re . <<< "$GA_RETURN")" = "$$" ]] \
|
||||||
|
|| (echo "guest-sync mismatch" >&2 && return 1)
|
||||||
|
|
||||||
qemu_execute "$COMMAND" "$ARGS"
|
qemu_execute "$COMMAND" "$ARGS"
|
||||||
echo "$GA_RETURN" 2>&1
|
echo "$GA_RETURN" 2>&1
|
||||||
|
@ -57,8 +59,20 @@ qemu_ga() {
|
||||||
|
|
||||||
function cmd_start(){
|
function cmd_start(){
|
||||||
[ ! -f "${LOCKFILE}" ] || { echo "Error: Netvm already running"; exit 1; }
|
[ ! -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";
|
echo "Starting netvm";
|
||||||
qemu-system-x86_64 -m 512M \
|
qemu-system-x86_64 \
|
||||||
|
-m 512M \
|
||||||
--machine q35 \
|
--machine q35 \
|
||||||
-nographic \
|
-nographic \
|
||||||
-serial none \
|
-serial none \
|
||||||
|
@ -67,13 +81,16 @@ function cmd_start(){
|
||||||
-cdrom /guest.img \
|
-cdrom /guest.img \
|
||||||
-boot order=d \
|
-boot order=d \
|
||||||
-chardev socket,path=/var/run/netvm_qga.sock,server=on,wait=off,id=qga0 \
|
-chardev socket,path=/var/run/netvm_qga.sock,server=on,wait=off,id=qga0 \
|
||||||
|
$net_args \
|
||||||
-device virtio-serial \
|
-device virtio-serial \
|
||||||
-device virtserialport,chardev=qga0,name=org.qemu.guest_agent.0 &
|
-device virtserialport,chardev=qga0,name=org.qemu.guest_agent.0 &
|
||||||
echo $! > "${LOCKFILE}"
|
echo $! > "${LOCKFILE}"
|
||||||
|
#TODO: Poll here for VM to come up and respond to QMP agent ping
|
||||||
}
|
}
|
||||||
|
|
||||||
function cmd_stop(){
|
function cmd_stop(){
|
||||||
pkill -F "${LOCKFILE}" && rm "${LOCKFILE}"
|
pkill $(cat "${LOCKFILE}")
|
||||||
|
rm "${LOCKFILE}"
|
||||||
}
|
}
|
||||||
|
|
||||||
function cmd_status(){
|
function cmd_status(){
|
||||||
|
|
Loading…
Reference in New Issue