summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDominique Martinet <dominique.martinet@cea.fr>2020-05-24 12:21:48 +0200
committerDominique Martinet <dominique.martinet@cea.fr>2020-05-24 12:21:48 +0200
commitde9168e3c3b5990ef3e44d50ca26e436ce644752 (patch)
treea0dbe2c5938977f128dd98302371a9844d0faa3f
parent565e17394b3d6f8eef83374a8cbaf9928e85f1dc (diff)
switch from eval to bash array for execution string
-rwxr-xr-xkvm-wrapper.sh100
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