diff options
author | Dominique Martinet <dominique.martinet@cea.fr> | 2020-05-24 12:21:48 +0200 |
---|---|---|
committer | Dominique Martinet <dominique.martinet@cea.fr> | 2020-05-24 12:21:48 +0200 |
commit | de9168e3c3b5990ef3e44d50ca26e436ce644752 (patch) | |
tree | a0dbe2c5938977f128dd98302371a9844d0faa3f | |
parent | 565e17394b3d6f8eef83374a8cbaf9928e85f1dc (diff) |
switch from eval to bash array for execution string
-rwxr-xr-x | kvm-wrapper.sh | 100 |
1 files changed, 61 insertions, 39 deletions
diff --git a/kvm-wrapper.sh b/kvm-wrapper.sh index 499fa44..b9bb522 100755 --- a/kvm-wrapper.sh +++ b/kvm-wrapper.sh @@ -733,31 +733,31 @@ function kvm_start_vm_prep () fi # Build KVM Drives (hdd, cdrom) parameters - local KVM_DRIVES="" + local KVMARG_DRIVES=( ) KVM_DRIVE_IF="${KVM_DRIVE_IF:-ide-hd}" # backward compatibility - [[ -n "$KVM_DISK1" ]] && KVM_DRIVES="-drive if=none,id=disk1,file=\"$KVM_DISK1\"$KVM_DRIVE_OPT -device ${KVM_DRIVE1_IF:-$KVM_DRIVE_IF},drive=disk1 " - [[ -n "$KVM_DISK2" ]] && KVM_DRIVES+="-drive if=none,id=disk2,file=\"$KVM_DISK2\"$KVM_DRIVE_OPT -device ${KVM_DRIVE2_IF:-$KVM_DRIVE_IF},drive=disk2 " - [[ -n "$KVM_DISK3" ]] && KVM_DRIVES+="-drive if=none,id=disk3,file=\"$KVM_DISK3\"$KVM_DRIVE_OPT -device ${KVM_DRIVE3_IF:-$KVM_DRIVE_IF},drive=disk3 " - [[ -n "$KVM_DISK4" ]] && KVM_DRIVES+="-drive if=none,id=disk4,file=\"$KVM_DISK4\"$KVM_DRIVE_OPT -device ${KVM_DRIVE4_IF:-$KVM_DRIVE_IF},drive=disk4 " + [[ -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" ) KVM_DISK_IF[0]=${KVM_DISK_IF[0]-$KVM_DRIVE_IF} for i in ${!KVM_DISK[@]}; do - KVM_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} " + 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}" ) done - [[ -n "$KVM_CDROM" ]] && KVM_DRIVES="$KVM_DRIVES -cdrom \"$KVM_CDROM\"" - local LINUXBOOT="" - [[ -n "$KVM_KERNEL" ]] && LINUXBOOT+=" -kernel \"$KVM_KERNEL\"" - [[ -n "$KVM_INITRD" ]] && LINUXBOOT+=" -initrd \"$KVM_INITRD\"" - [[ -n "$KVM_APPEND" ]] && LINUXBOOT+=" -append \"$KVM_APPEND\"" + [[ -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" ) # If drive is a lv in the main vg, activate the lv prepare_disks CLEANUP+=("unprepare_disks") - local KVM_NET="" + local KVMARG_NET=( ) # backward compatibility - prioritize old values because new ones can come from the global config [[ -n "$KVM_MACADDRESS" ]] && { @@ -790,7 +790,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") - KVM_NET+="-device vfio-pci,id=net${i},host=${PCIDOMAIN} " + KVMARG_NET+=( -device "vfio-pci,id=net${i},host=${PCIDOMAIN}" ) continue ;; @@ -811,7 +811,7 @@ function kvm_start_vm_prep () ib_sriov_guid "${KVM_BR[i]}" "$VFNUM" "${KVM_MACADDR[i]}" fi - KVM_NET+="-device vfio-pci,id=net${i},host=${PCIDOMAIN} " + KVMARG_NET+=( -device "vfio-pci,id=net${i},host=${PCIDOMAIN}" ) continue ;; @@ -845,37 +845,37 @@ function kvm_start_vm_prep () exec {TAPFD}<>${TAPFILE} CLEANUP_FD+=("${TAPFD}") - KVM_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]} " + 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]}" ) 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") - KVM_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]} " + 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]}" ) fi done - [[ "$KVM_NET" == *"-net"* ]] || KVM_NET+="-net none " + [[ "${KVMARG_NET[*]}" == *"-net"* ]] || KVMARG_NET+=( -net none ) } # PCI passthrough assignement - local KVM_PCIASSIGN="" + local KVMARG_PCIASSIGN=( ) for i in ${!KVM_PCIASSIGN_DOMAIN[@]}; do pci_stubify "${KVM_PCIASSIGN_DOMAIN[$i]}" CLEANUP+=("pci_unstubify \"${KVM_PCIASSIGN_DOMAIN[$i]}\"") - KVM_PCIASSIGN+="-device pci-assign,id=${KVM_PCIASSIGN_ID[$i]:-pciassign${i}},host=${KVM_PCIASSIGN_DOMAIN[$i]} " + KVMARG_PCIASSIGN+=( -device "pci-assign,id=${KVM_PCIASSIGN_ID[$i]:-pciassign${i}},host=${KVM_PCIASSIGN_DOMAIN[$i]}" ) done # vfio assignement - local KVM_VFIO="" + local KVMARG_VFIO=( ) for i in ${!KVM_VFIO_DOMAIN[@]}; do pci_vfiofy "${KVM_VFIO_DOMAIN[$i]}" CLEANUP+=("pci_unvfiofy \"${KVM_VFIO_DOMAIN[$i]}\"") - KVM_VFIO+="-device vfio-pci,id=${KVM_VFIO_ID[$i]:-vfio${i}},host=${KVM_VFIO_DOMAIN[$i]} " + KVMARG_VFIO+=( -device "vfio-pci,id=${KVM_VFIO_ID[$i]:-vfio${i}},host=${KVM_VFIO_DOMAIN[$i]}" ) done - local KVM_PINNING="" + 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'* ]] && \ @@ -883,28 +883,49 @@ function kvm_start_vm_prep () } [[ -n "$KVM_PIN_NODE" && -z "$KVM_NUMACTL_OPT" ]] && \ - KVM_NUMACTL_OPT="-N $KVM_PIN_NODE" + KVM_NUMACTL_OPT=( -N "$KVM_PIN_NODE" ) [[ -n "$KVM_NUMACTL_OPT" ]] && { require_exec "$KVM_NUMACTL_BIN" - KVM_PINNING="$KVM_NUMACTL_BIN $KVM_NUMACTL_OPT --" + KVMARG_PINNING=( "$KVM_NUMACTL_BIN" "${KVM_NUMACTL_OPT[@]}" -- ) } - local KVM_MEMORY="" + local KVMARG_MEMORY="" [[ -n "$KVM_MEM_POLICY" ]] && { - KVM_MEMORY="-m $KVM_MEM -object memory-backend-ram,size=${KVM_MEM},policy=$KVM_MEM_POLICY,id=ram-0" - [[ -n "$KVM_PIN_NODE" ]] && KVM_MEMORY+=",host-nodes=$KVM_PIN_NODE" + 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_MEMORY="-m $KVM_MEM" + KVMARG_MEMORY=( -m "$KVM_MEM" ) } # Monitor/serial devices - local KVM_MONITORDEV="-monitor unix:$MONITOR_FILE,server,nowait" - local KVM_SERIALDEV="-serial chardev:char1 -chardev socket,id=char1,path=$SERIAL_FILE,server,nowait,telnet" - local KVM_RNGDEV="-device virtio-rng-pci,max-bytes=1024,period=1000" + 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 ) + + # 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 + read -ra KVMARG_BOOTDEVICE <<< "$KVM_BOOTDEVICE" + fi + local KVMARG_KEYMAP=( ) + if [[ -n "$KVM_KEYMAP" ]]; then + read -ra KVMARG_KEYMAP <<< "$KVM_KEYMAP" + fi + local KVMARG_OUTPUT=( ) + if [[ -n "$KVM_OUTPUT" ]]; then + read -ra KVMARG_OUTPUT <<< "$KVM_OUTPUT" + fi + # Build kvm exec string - EXEC_STRING="$KVM_PINNING $KVM_BIN -name $VM_NAME,process=\"kvm-$VM_NAME\" $KVM_MEMORY -smp $KVM_CPU_NUM $KVM_PREPEND_PARAMS $KVM_PCIASSIGN $KVM_VFIO $KVM_NET $KVM_DRIVES $KVM_BOOTDEVICE $KVM_KEYMAP $KVM_OUTPUT $LINUXBOOT $KVM_MONITORDEV $KVM_SERIALDEV $KVM_RNGDEV -pidfile $PID_FILE $KVM_ADDITIONNAL_PARAMS" + 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[@]}" ) CLEANUP+=("rm -f \"$PID_FILE\" \"$MONITOR_FILE\" \"$SERIAL_FILE\"") } @@ -912,13 +933,13 @@ function kvm_start_vm_prep () function kvm_start_vm_here() { # Now run kvm - echo $EXEC_STRING + echo "${KVM_EXEC_CMD[*]}" echo "" echo "" if [[ -n "$KVM_USER" ]]; then - su $KVM_USER -s /bin/sh -c "$EXEC_STRING" + su $KVM_USER -s /bin/sh -c "$(printf "%q " "${KVM_EXEC_CMD[@]}")" else - eval "$EXEC_STRING" + "${KVM_EXEC_CMD[@]}" fi local KVM_RETURN_VALUE="$?" @@ -931,7 +952,7 @@ function kvm_start_vm_here() # Main function: start a virtual machine function kvm_start_vm () { - local EXEC_STRING + local KVM_EXEC_CMD kvm_start_vm_prep kvm_start_vm_here @@ -996,9 +1017,10 @@ function kvm_run_disk () test_file_rw "${KVM_DISK[0]}" || test_blockdev_rw "${KVM_DISK[0]}" || fail_exit "Error: Couldn't read/write image file:\n${KVM_DISK[0]}" # Build kvm exec string - local EXEC_STRING="$KVM_BIN -net nic,model=rtl8139,macaddr=`random_mac` -net user -hda ${KVM_DISK[0]} -boot c $KVM_KEYMAP $KVM_OUTPUT $KVM_ADDITIONNAL_PARAMS" - echo "$EXEC_STRING" - eval "$EXEC_STRING" + local KVM_EXEC_CMD=( "$KVM_BIN" -net "nic,model=rtl8139,macaddr=$(random_mac)" -net user -hda "${KVM_DISK[0]}" -boot c "$KVM_KEYMAP" "$KVM_OUTPUT" ) + KVM_EXEC_CMD+=( "$KVM_ADDITIONNAL_PARAMS" ) + echo "${KVM_EXEC_CMD[*]}" + "${KVM_EXEC_CMD[@]}" unprepare_disks |