summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDominique Martinet <dominique.martinet@cea.fr>2020-05-24 12:39:29 +0200
committerDominique Martinet <dominique.martinet@cea.fr>2020-05-24 12:39:29 +0200
commit61faf553a3db0727f026f259cbbba05205d7519e (patch)
tree6c41832179cf6d9840aae43e8020621530a15cdf
parentde9168e3c3b5990ef3e44d50ca26e436ce644752 (diff)
build KVM_EXEC_CMD directly instead of having tons of variables
-rwxr-xr-xkvm-wrapper.sh123
1 files changed, 64 insertions, 59 deletions
diff --git a/kvm-wrapper.sh b/kvm-wrapper.sh
index b9bb522..15dc8da 100755
--- a/kvm-wrapper.sh
+++ b/kvm-wrapper.sh
@@ -732,33 +732,57 @@ function kvm_start_vm_prep ()
[[ -n "$SERIAL_USER" ]] || [[ -n "$SERIAL_GROUP" ]] && serial_perms_forked &
fi
+ # backward compatibility transforms
+ if [[ -n "$KVM_PREPEND_PARAMS" && -z "${KVMARG_PREPEND_PARAMS[*]}" ]]; then
+ read -ra KVMARG_PREPEND_PARAMS <<< "$KVM_PREPEND_PARAMS"
+ fi
+ if [[ -n "$KVM_ADDITIONNAL_PARAMS" && -z "${KVMARG_ADDITIONNAL_PARAMS[*]}" ]]; then
+ read -ra KVMARG_ADDITIONNAL_PARAMS <<< "$KVM_ADDITIONNAL_PARAMS"
+ fi
+
+ # build KVM_EXEC_CMD -- wrappers first
+ KVM_EXEC_CMD=( )
+ [[ -n "$KVM_PIN_PCI" ]] && {
+ KVM_PIN_NODE=$(cat /sys/bus/pci/devices/*${KVM_PIN_PCI}/numa_node)
+ [[ "$KVM_PIN_NODE" == "-1" || "$KVM_PIN_NODE" == *$'\n'* ]] && \
+ fail_exit "$KVM_PIN_PCI does not look like a valid PCI to pin to (cat /sys/bus/pci/devices/*${KVM_PIN_PCI}/numa_node)"
+ }
+
+ [[ -n "$KVM_PIN_NODE" && -z "$KVM_NUMACTL_OPT" ]] && \
+ KVM_NUMACTL_OPT=( -N "$KVM_PIN_NODE" )
+
+ [[ -n "$KVM_NUMACTL_OPT" ]] && {
+ require_exec "$KVM_NUMACTL_BIN"
+ KVM_EXEC_CMD+=( "$KVM_NUMACTL_BIN" "${KVM_NUMACTL_OPT[@]}" -- )
+ }
+
+ # actual qemu command
+ KVM_EXEC_CMD+=( "$KVM_BIN" -name "$VM_NAME,process=\"kvm-$VM_NAME\"" )
+ KVM_EXEC_CMD+=( "${KVMARG_PREPEND_PARAMS[@]}" )
+
# Build KVM Drives (hdd, cdrom) parameters
- local KVMARG_DRIVES=( )
KVM_DRIVE_IF="${KVM_DRIVE_IF:-ide-hd}"
# backward compatibility
- [[ -n "$KVM_DISK1" ]] && KVMARG_DRIVES=( -drive "if=none,id=disk1,file=\"$KVM_DISK1\"$KVM_DRIVE_OPT" -device "${KVM_DRIVE1_IF:-$KVM_DRIVE_IF},drive=disk1" )
- [[ -n "$KVM_DISK2" ]] && KVMARG_DRIVES+=( -drive "if=none,id=disk2,file=\"$KVM_DISK2\"$KVM_DRIVE_OPT" -device "${KVM_DRIVE2_IF:-$KVM_DRIVE_IF},drive=disk2" )
- [[ -n "$KVM_DISK3" ]] && KVMARG_DRIVES+=( -drive "if=none,id=disk3,file=\"$KVM_DISK3\"$KVM_DRIVE_OPT" -device "${KVM_DRIVE3_IF:-$KVM_DRIVE_IF},drive=disk3" )
- [[ -n "$KVM_DISK4" ]] && KVMARG_DRIVES+=( -drive "if=none,id=disk4,file=\"$KVM_DISK4\"$KVM_DRIVE_OPT" -device "${KVM_DRIVE4_IF:-$KVM_DRIVE_IF},drive=disk4" )
+ [[ -n "$KVM_DISK1" ]] && KVM_EXEC_CMD+=( -drive "if=none,id=disk1,file=\"$KVM_DISK1\"$KVM_DRIVE_OPT" -device "${KVM_DRIVE1_IF:-$KVM_DRIVE_IF},drive=disk1" )
+ [[ -n "$KVM_DISK2" ]] && KVM_EXEC_CMD+=( -drive "if=none,id=disk2,file=\"$KVM_DISK2\"$KVM_DRIVE_OPT" -device "${KVM_DRIVE2_IF:-$KVM_DRIVE_IF},drive=disk2" )
+ [[ -n "$KVM_DISK3" ]] && KVM_EXEC_CMD+=( -drive "if=none,id=disk3,file=\"$KVM_DISK3\"$KVM_DRIVE_OPT" -device "${KVM_DRIVE3_IF:-$KVM_DRIVE_IF},drive=disk3" )
+ [[ -n "$KVM_DISK4" ]] && KVM_EXEC_CMD+=( -drive "if=none,id=disk4,file=\"$KVM_DISK4\"$KVM_DRIVE_OPT" -device "${KVM_DRIVE4_IF:-$KVM_DRIVE_IF},drive=disk4" )
KVM_DISK_IF[0]=${KVM_DISK_IF[0]-$KVM_DRIVE_IF}
for i in ${!KVM_DISK[@]}; do
- KVMARG_DRIVES+=( -drive "if=none,id=disk${i},file=${KVM_DISK[i]}${KVM_DISK_OPT[i]-${KVM_DISK_OPT[@]:0:1}}" -device "${KVM_DISK_IF[i]:-${KVM_DISK_IF[@]:0:1}},drive=disk${i}" )
+ KVM_EXEC_CMD+=( -drive "if=none,id=disk${i},file=${KVM_DISK[i]}${KVM_DISK_OPT[i]-${KVM_DISK_OPT[@]:0:1}}" -device "${KVM_DISK_IF[i]:-${KVM_DISK_IF[@]:0:1}},drive=disk${i}" )
done
- [[ -n "$KVM_CDROM" ]] && KVMARG_DRIVES+=( -cdrom "$KVM_CDROM" )
- local KVMARG_LINUXBOOT=( )
- [[ -n "$KVM_KERNEL" ]] && KVMARG_LINUXBOOT+=( -kernel "$KVM_KERNEL" )
- [[ -n "$KVM_INITRD" ]] && KVMARG_LINUXBOOT+=( -initrd "$KVM_INITRD" )
- [[ -n "$KVM_APPEND" ]] && KVMARG_LINUXBOOT+=( -append "$KVM_APPEND" )
+ [[ -n "$KVM_CDROM" ]] && KVM_EXEC_CMD+=( -cdrom "$KVM_CDROM" )
+ [[ -n "$KVM_KERNEL" ]] && KVM_EXEC_CMD+=( -kernel "$KVM_KERNEL" )
+ [[ -n "$KVM_INITRD" ]] && KVM_EXEC_CMD+=( -initrd "$KVM_INITRD" )
+ [[ -n "$KVM_APPEND" ]] && KVM_EXEC_CMD+=( -append "$KVM_APPEND" )
# If drive is a lv in the main vg, activate the lv
prepare_disks
CLEANUP+=("unprepare_disks")
- local KVMARG_NET=( )
-
# backward compatibility - prioritize old values because new ones can come from the global config
[[ -n "$KVM_MACADDRESS" ]] && {
KVM_MACADDR=("$KVM_MACADDRESS")
@@ -790,7 +814,7 @@ function kvm_start_vm_prep ()
ip link set "${KVM_BR[i]}" vf "$VFNUM" mac "${KVM_MACADDR[i]}" || fail_exit "Could not set MAC address for vf $VFNUM device ${KVM_BR[i]}"
CLEANUP+=("ip link set \"${KVM_BR[i]}\" vf \"$VFNUM\" mac 02:00:00:00:00:00")
- KVMARG_NET+=( -device "vfio-pci,id=net${i},host=${PCIDOMAIN}" )
+ KVM_EXEC_CMD+=( -device "vfio-pci,id=net${i},host=${PCIDOMAIN}" )
continue
;;
@@ -811,7 +835,7 @@ function kvm_start_vm_prep ()
ib_sriov_guid "${KVM_BR[i]}" "$VFNUM" "${KVM_MACADDR[i]}"
fi
- KVMARG_NET+=( -device "vfio-pci,id=net${i},host=${PCIDOMAIN}" )
+ KVM_EXEC_CMD+=( -device "vfio-pci,id=net${i},host=${PCIDOMAIN}" )
continue
;;
@@ -845,87 +869,68 @@ function kvm_start_vm_prep ()
exec {TAPFD}<>${TAPFILE}
CLEANUP_FD+=("${TAPFD}")
- KVMARG_NET+=( -netdev "type=tap,id=guest${i},fd=${TAPFD}${KVM_NET_OPT[i]}${VHOSTFD_OPT}" -device "${KVM_IF[i]},netdev=guest${i},mac=${KVM_MACADDR[i]}" )
+ KVM_EXEC_CMD+=( -netdev "type=tap,id=guest${i},fd=${TAPFD}${KVM_NET_OPT[i]}${VHOSTFD_OPT}" -device "${KVM_IF[i]},netdev=guest${i},mac=${KVM_MACADDR[i]}" )
else
ip tuntap add dev $TAPDEV mode tap ${KVM_USER+user $KVM_USER}
ip link set $TAPDEV ${KVM_NET_MTU[$i]:+mtu ${KVM_NET_MTU[$i]}} up
brctl addif ${KVM_BR[i]} $TAPDEV
CLEANUP+=("ip tuntap del dev $TAPDEV mode tap")
- KVMARG_NET+=( -netdev "type=tap,id=guest${i},ifname=${TAPDEV},script=no,downscript=no${KVM_NET_OPT[i]}${VHOSTFD_OPT}" -device "${KVM_IF[i]},netdev=guest${i},mac=${KVM_MACADDR[i]}" )
+ KVM_EXEC_CMD+=( -netdev "type=tap,id=guest${i},ifname=${TAPDEV},script=no,downscript=no${KVM_NET_OPT[i]}${VHOSTFD_OPT}" -device "${KVM_IF[i]},netdev=guest${i},mac=${KVM_MACADDR[i]}" )
fi
done
- [[ "${KVMARG_NET[*]}" == *"-net"* ]] || KVMARG_NET+=( -net none )
+ # XXX use -nodefaults instead
+ [[ "${KVM_EXEC_CMD[*]}" == *"-net"* ]] || KVM_EXEC_CMD+=( -net none )
}
# PCI passthrough assignement
- local KVMARG_PCIASSIGN=( )
for i in ${!KVM_PCIASSIGN_DOMAIN[@]}; do
pci_stubify "${KVM_PCIASSIGN_DOMAIN[$i]}"
CLEANUP+=("pci_unstubify \"${KVM_PCIASSIGN_DOMAIN[$i]}\"")
- KVMARG_PCIASSIGN+=( -device "pci-assign,id=${KVM_PCIASSIGN_ID[$i]:-pciassign${i}},host=${KVM_PCIASSIGN_DOMAIN[$i]}" )
+ KVM_EXEC_CMD+=( -device "pci-assign,id=${KVM_PCIASSIGN_ID[$i]:-pciassign${i}},host=${KVM_PCIASSIGN_DOMAIN[$i]}" )
done
# vfio assignement
- local KVMARG_VFIO=( )
for i in ${!KVM_VFIO_DOMAIN[@]}; do
pci_vfiofy "${KVM_VFIO_DOMAIN[$i]}"
CLEANUP+=("pci_unvfiofy \"${KVM_VFIO_DOMAIN[$i]}\"")
- KVMARG_VFIO+=( -device "vfio-pci,id=${KVM_VFIO_ID[$i]:-vfio${i}},host=${KVM_VFIO_DOMAIN[$i]}" )
+ KVM_EXEC_CMD+=( -device "vfio-pci,id=${KVM_VFIO_ID[$i]:-vfio${i}},host=${KVM_VFIO_DOMAIN[$i]}" )
done
- local KVMARG_PINNING=( )
- [[ -n "$KVM_PIN_PCI" ]] && {
- KVM_PIN_NODE=$(cat /sys/bus/pci/devices/*${KVM_PIN_PCI}/numa_node)
- [[ "$KVM_PIN_NODE" == "-1" || "$KVM_PIN_NODE" == *$'\n'* ]] && \
- fail_exit "$KVM_PIN_PCI does not look like a valid PCI to pin to (cat /sys/bus/pci/devices/*${KVM_PIN_PCI}/numa_node)"
- }
-
- [[ -n "$KVM_PIN_NODE" && -z "$KVM_NUMACTL_OPT" ]] && \
- KVM_NUMACTL_OPT=( -N "$KVM_PIN_NODE" )
-
- [[ -n "$KVM_NUMACTL_OPT" ]] && {
- require_exec "$KVM_NUMACTL_BIN"
- KVMARG_PINNING=( "$KVM_NUMACTL_BIN" "${KVM_NUMACTL_OPT[@]}" -- )
- }
-
- local KVMARG_MEMORY=""
[[ -n "$KVM_MEM_POLICY" ]] && {
- KVMARG_MEMORY=( -m "$KVM_MEM" -object "memory-backend-ram,size=${KVM_MEM},policy=$KVM_MEM_POLICY,id=ram-0" )
- [[ -n "$KVM_PIN_NODE" ]] && KVMARG_MEMORY[$((${#KVMARG_MEMORY[@]}-1))]+=",host-nodes=$KVM_PIN_NODE"
+ KVM_EXEC_CMD+=( -m "$KVM_MEM" -object "memory-backend-ram,size=${KVM_MEM},policy=$KVM_MEM_POLICY,id=ram-0${KVM_PIN_NODE:+,host-nodes=$KVM_PIN_NODE}" )
} || {
- KVMARG_MEMORY=( -m "$KVM_MEM" )
+ KVM_EXEC_CMD+=( -m "$KVM_MEM" )
}
# Monitor/serial devices
- local KVMARG_MONITORDEV=( -monitor "unix:$MONITOR_FILE,server,nowait" )
- local KVMARG_SERIALDEV=( -serial chardev:char1 -chardev "socket,id=char1,path=$SERIAL_FILE,server,nowait,telnet" )
- local KVMARG_RNGDEV=( -device virtio-rng-pci,max-bytes=1024,period=1000 )
+ KVM_EXEC_CMD+=( -monitor "unix:$MONITOR_FILE,server,nowait" )
+ KVM_EXEC_CMD+=( -serial chardev:char1 -chardev "socket,id=char1,path=$SERIAL_FILE,server,nowait,telnet" )
+ KVM_EXEC_CMD+=( -device virtio-rng-pci,max-bytes=1024,period=1000 )
- # backward compatibility
- if [[ -n "$KVM_PREPEND_PARAMS" && -z "${KVMARG_PREPEND_PARAMS[*]}" ]]; then
- read -ra KVMARG_PREPEND_PARAMS <<< "$KVM_PREPEND_PARAMS"
- fi
- if [[ -n "$KVM_ADDITIONNAL_PARAMS" && -z "${KVMARG_ADDITIONNAL_PARAMS[*]}" ]]; then
- read -ra KVMARG_ADDITIONNAL_PARAMS <<< "$KVM_ADDITIONNAL_PARAMS"
- fi
- local KVMARG_BOOTDEVICE=( )
- if [[ -n "$KVM_BOOTDEVICE" ]]; then
+ # Backward compat: support full arg with space or short option only
+ if [[ "$KVM_BOOTDEVICE" == *" "* ]]; then
+ local KVMARG_BOOTDEVICE=( )
read -ra KVMARG_BOOTDEVICE <<< "$KVM_BOOTDEVICE"
+ KVM_EXEC_CMD+=( "${KVMARG_BOOTDEVICE[@]}" )
+ elif [[ -n "$KVM_BOOTDEVICE" ]]; then
+ KVM_EXEC_CMD+=( -boot "order=$KVM_BOOTDEVICE" )
fi
- local KVMARG_KEYMAP=( )
- if [[ -n "$KVM_KEYMAP" ]]; then
+ if [[ "$KVM_KEYMAP" == *" "* ]]; then
+ local KVMARG_KEYMAP=( )
read -ra KVMARG_KEYMAP <<< "$KVM_KEYMAP"
+ KVM_EXEC_CMD+=( "${KVMARG_KEYMAP[@]}" )
+ elif [[ -n "$KVM_KEYMAP" ]]; then
+ KVM_EXEC_CMD+=( -k "$KVM_KEYMAP" )
fi
- local KVMARG_OUTPUT=( )
if [[ -n "$KVM_OUTPUT" ]]; then
+ local KVMARG_OUTPUT=( )
read -ra KVMARG_OUTPUT <<< "$KVM_OUTPUT"
+ KVM_EXEC_CMD+=( "${KVMARG_OUTPUT[@]}" )
fi
-
- # Build kvm exec string
- KVM_EXEC_CMD=( "${KVMARG_PINNING[@]}" "$KVM_BIN" -name "$VM_NAME,process=\"kvm-$VM_NAME\"" "${KVMARG_MEMORY[@]}" -smp "$KVM_CPU_NUM" "${KVMARG_PREPEND_PARAMS[@]}" "${KVMARG_PCIASSIGN[@]}" "${KVMARG_VFIO[@]}" "${KVMARG_NET[@]}" "${KVMARG_DRIVES[@]}" "${KVMARG_BOOTDEVICE[@]}" "${KVMARG_KEYMAP[@]}" "${KVMARG_OUTPUT[@]}" "${KVMARG_LINUXBOOT[@]}" "${KVMARG_MONITORDEV[@]}" "${KVMARG_SERIALDEV[@]}" "${KVMARG_RNGDEV[@]}" -pidfile "$PID_FILE" "${KVMARG_ADDITIONNAL_PARAMS[@]}" )
+ KVM_EXEC_CMD+=( "${KVMARG_ADDITIONNAL_PARAMS[@]}" )
CLEANUP+=("rm -f \"$PID_FILE\" \"$MONITOR_FILE\" \"$SERIAL_FILE\"")
}