diff options
author | Dominique Martinet <dominique.martinet@cea.fr> | 2020-05-24 12:39:29 +0200 |
---|---|---|
committer | Dominique Martinet <dominique.martinet@cea.fr> | 2020-05-24 12:39:29 +0200 |
commit | 61faf553a3db0727f026f259cbbba05205d7519e (patch) | |
tree | 6c41832179cf6d9840aae43e8020621530a15cdf | |
parent | de9168e3c3b5990ef3e44d50ca26e436ce644752 (diff) |
build KVM_EXEC_CMD directly instead of having tons of variables
-rwxr-xr-x | kvm-wrapper.sh | 123 |
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\"") } |