Bash Script: Zeile wird nicht komplett ausgeführt

wakko0815

Ensign
Registriert
Juni 2007
Beiträge
181
Mein derzeitiger Rechner hat 64GB RAM und um den mal sinnlos auszunutzen habe ich eine VirtualBox VM in einer Ramdisk installiert und erfolgreich laufen. Um die VM nun trotzdem persistent zu halten muss das VDI vor dem unmounten des Ramdisk immer auf einen "richigten" Datenträger kopiert werden.
Um das etwas zu automatisieren habe ich mir ein bash-Script gebaut, das folgendes tut:
--setup
  • mount ramdisk
  • copy VDI from persistent storage to Ramdisk
  • start VM (with vboxmanage)

--backup
- copy VDI from Ramdisk to persistent storage

--stop
  • stop VM
  • (optional but default) --backup (see above)
  • unmount Ramdisk

Das Problem wohnt in der --stop Methode, wo das unmounten nicht ausgeführt wird. Zeile 53 ff. Das "umount" nach dem backup passiert nur, wenn ich die --stop Methode aufrufe und das backup abwähle. Nur dann wird ge-unmounted, vermutlich aus Zeile 59. Aber warum wird bei aktiviertem backup keins der umounts ausgeführt?
Vermutlich ist da irgendwas an meiner zusammengegoogelten if oder case Syntax falsch, aber ich finde nicht was... Hat da jemand eine Idee?
Bash:
#!/bin/bash

RAMDISK_DIR="/mnt/ramdisk"
RAMDISK_SZIE=48G
VM_ORG_DIR="/opt/VirtualBox VMs"
VM_NAME="Ramdisk_Manjaro"

setup() {
  echo "Setting up Ramdisk VM"
  if [ -d "$RAMDISK_DIR" ]
  then
    echo "Directory $RAMDISK_DIR exists. Skipping!"
  else
    echo "Creating directory $RAMDISK_DIR."
    sudo mkdir $RAMDISK_DIR
  fi
  owner=$(ls -ld $RAMDISK_DIR | awk '{print $3}')
  if [ "$owner" = "$USER" ]
  then
    echo "Mount-dir permissions already correct. Skipping."
  else
    sudo chown "$USER":"$USER" $RAMDISK_DIR
  fi
  echo "Mounting ramdisk."
  sudo mount -t tmpfs -o rw,size=$RAMDISK_SZIE tmpfs $RAMDISK_DIR
  echo "Syncing VDI to ramdisk. This might take a while depending on HD read speed."
  rsync -av --progress --stats "$VM_ORG_DIR/$VM_NAME" "$RAMDISK_DIR"
  echo "Sync finished. Ramdisk is running."
  echo "Starting VM $VM_NAME"
  vboxmanage startvm $VM_NAME
  exit 0
}

backup() {
  echo "Backing up Ramdisk VM"
  rsync -av --progress --stats "$RAMDISK_DIR/$VM_NAME" "$VM_ORG_DIR/"
  echo "Ramdisk backup complete!"
  exit 0
}

stop() {
  echo "Stopping VM $VM_NAME!"
  running_vms=$(vboxmanage list runningvms)
  echo $running_vms
  if [[ "$running_vms" == *"$VM_NAME"* ]]; then
    echo "$VM_NAME is running. Stopping now."
    vboxmanage controlvm $VM_NAME poweroff
  fi
  echo "Stopping the ramdisk!"
  while true; do
    read -p "Do you want to backup before stopping the ramdisk? We will backup by default! Y/n/*: " yn
    case $yn in
        [Yy]* ) backup; sudo umount -v $RAMDISK_DIR; break;;
        [Nn]* ) break;;
        * ) echo "Performing Backup!"; backup; sudo umount -v $RAMDISK_DIR; break;;
    esac
  done
  echo "Unmounting ramdisk..."
  sudo umount -v $RAMDISK_DIR
  exit 0
}

help() {
  echo "Usage:"
  echo "Setup: sh ramdisk_vm.sh --setup"
  echo "  This will setup the ramdisk and copy the VM files into it. And then automatically start the VM"
  echo "Backup: sh ramdisk_vm.sh --backup"
  echo "  This will backup the VM files from the ramdisk to persistent storage."
  echo "Stop ramdisk: sh ramdisk_vm.sh --stop"
  echo "  This will stop the VM, unmount the the ramdisk and release all reserved memory."
  echo "  IMPORTANT! Back up your VM before stopping the ramdisk!"
  exit 0
}


while [ True ]; do
if [ "$1" = "--setup" ]; then
  setup
elif [ "$1" = "--backup" ]; then
  backup
elif [ "$1" = "--help" ]; then
  help
elif [ "$1" = "--stop" ]; then
  stop
else
  help
fi
done
 
bash -x sh -x set -o xtrace set -x
ist dein Freund
 
  • Gefällt mir
Reaktionen: wakko0815
Hat ein paar Minuten gedauert zu verstehen was Du sagen wolltest, aber am Ende war das hilfreich genug.
 
Zurück
Oben