diff options
author | Dominique Martinet <asmadeus@codewreck.org> | 2015-11-02 18:24:55 +0100 |
---|---|---|
committer | Dominique Martinet <asmadeus@codewreck.org> | 2015-11-02 18:24:55 +0100 |
commit | 0681a79c6aa62f6b0240b6ac10fc59f3b19114ec (patch) | |
tree | dba5d8c6c32ef371afe9580306b94ae3a304113c | |
parent | bbeeb12335293ab89283b572f8d1829f4a90768c (diff) |
cleaner cleanup
-rwxr-xr-x | kvm-wrapper.sh | 71 |
1 files changed, 37 insertions, 34 deletions
diff --git a/kvm-wrapper.sh b/kvm-wrapper.sh index b9b8109..e830220 100755 --- a/kvm-wrapper.sh +++ b/kvm-wrapper.sh @@ -460,8 +460,8 @@ function ib_sriov() function ib_unsriov() { for PCIDOMAIN in ${KVM_VFIO_DOMAIN}; do - [[ -e /sys/class/infiniband/*/iov/$PCIDOMAIN ]] || continue - grep -lZv none /sys/class/infiniband/*/iov/$PCIDOMAIN/ports/1/pkey_idx/* | \ + test -e /sys/class/infiniband/*/iov/"$PCIDOMAIN" || continue + grep -lZv none /sys/class/infiniband/*/iov/"$PCIDOMAIN"/ports/1/pkey_idx/* | \ tr '\0' '\n' | \ while read file; do echo none > $file @@ -588,6 +588,20 @@ function kvm_top () # Main function: start a virtual machine function kvm_start_vm () { + CLEANUP=( ) + cleanup() + { + echo "Cleaning up" + if [ ${#CLEANUP[*]} -gt 0 ]; then + local LAST_ELEMENT=$((${#CLEANUP[*]}-1)) + for i in `seq $LAST_ELEMENT -1 0`; do + eval ${CLEANUP[$i]} + done + fi + } + + trap cleanup EXIT + check_create_dir "$PID_DIR" check_create_dir "$MONITOR_DIR" check_create_dir "$SERIAL_DIR" @@ -595,6 +609,18 @@ function kvm_start_vm () [[ -z "$KVM_BIN" ]] && KVM_BIN="/usr/bin/kvm" require_exec "$KVM_BIN" + # More sanity checks: VM running, monitor socket existing, etc. + if [[ -z "$FORCE" ]]; then + test_pid_from_file "$PID_FILE" && fail_exit "VM $VM_NAME seems to be running already.\nPID file $PID_FILE exists" + rm -rf "$MONITOR_FILE" + rm -rf "$SERIAL_FILE" + test_socket "$MONITOR_FILE" && fail_exit "Monitor socket $MONITOR_FILE already existing and couldn't be removed" + test_socket "$SERIAL_FILE" && fail_exit "Serial socket $SERIAL_FILE already existing and couldn't be removed" + + # Fork change_perms + [[ -n "$SERIAL_USER" ]] || [[ -n "$SERIAL_GROUP" ]] && serial_perms_forked & + fi + # Build KVM Drives (hdd, cdrom) parameters local KVM_DRIVES="" KVM_DRIVE_IF="${KVM_DRIVE_IF:-ide-hd}" @@ -620,6 +646,7 @@ function kvm_start_vm () # If drive is a lv in the main vg, activate the lv prepare_disks + CLEANUP+=("unprepare_disks") # Network scripts local KVM_NET_SCRIPT="$ROOTDIR/net" @@ -660,16 +687,19 @@ function kvm_start_vm () local KVM_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]} " done # IB sriov - [[ -n "$KVM_SRIOV_PKEYS$KVM_SRIOV_DEV" ]] && ib_sriov "$KVM_SRIOV_PKEYS" "$KVM_SRIOV_DEV" + [[ -n "$KVM_SRIOV_PKEYS$KVM_SRIOV_DEV" ]] && ib_sriov "$KVM_SRIOV_PKEYS" "$KVM_SRIOV_DEV" && \ + CLEANUP+=("ib_unsriov") # vfio assignement local KVM_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]} " done @@ -680,17 +710,7 @@ function kvm_start_vm () # Build kvm exec string local EXEC_STRING="$KVM_BIN -name $VM_NAME,process=\"kvm-$VM_NAME\" -m $KVM_MEM -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 -pidfile $PID_FILE $KVM_ADDITIONNAL_PARAMS" - # More sanity checks: VM running, monitor socket existing, etc. - if [[ -z "$FORCE" ]]; then - test_pid_from_file "$PID_FILE" && fail_exit "VM $VM_NAME seems to be running already.\nPID file $PID_FILE exists" - rm -rf "$MONITOR_FILE" - rm -rf "$SERIAL_FILE" - test_socket "$MONITOR_FILE" && fail_exit "Monitor socket $MONITOR_FILE already existing and couldn't be removed" - test_socket "$SERIAL_FILE" && fail_exit "Serial socket $SERIAL_FILE already existing and couldn't be removed" - - # Fork change_perms - [[ -n "$SERIAL_USER" ]] || [[ -n "$SERIAL_GROUP" ]] && serial_perms_forked & - fi + CLEANUP+=("rm -f \"$PID_FILE\" \"$MONITOR_FILE\" \"$SERIAL_FILE\"") # Now run kvm echo $EXEC_STRING @@ -700,26 +720,9 @@ function kvm_start_vm () local KVM_RETURN_VALUE="$?" - # Cleanup files - rm -rf "$PID_FILE" - rm -rf "$MONITOR_FILE" - rm -rf "$SERIAL_FILE" - - # If drive is a lv in the main vg, deactivate the lv - unprepare_disks - ib_unsriov - for DOMAIN in ${KVM_PCIASSIGN_DOMAIN[@]}; do - pci_unstubify $DOMAIN - done - for DOMAIN in ${KVM_VFIO_DOMAIN[@]}; do - pci_unvfiofy $DOMAIN - done - - [[ "$KVM_RETURN_VALUE" != "0" ]] && fail_exit "Something went wrong with kvm execution, read above" + [[ "$KVM_RETURN_VALUE" != "0" ]] && fail_exit "qemu returned $KVM_RETURN_VALUE, read above" - - # Exit - return 0 + return $KVM_RETURN_VALUE } function kvm_stop_vm () @@ -907,7 +910,7 @@ function kvm_bootstrap_vm () fi } - local CLEANUP=( ) + CLEANUP=( ) set -e trap cleanup EXIT |