I’ve been playing around with VirtualBox some more today (more on it, and other virtualization related stuff might follow later). I got a Windows XP instance running fine (and fast!) in it. Still got some issues (shared folders seem not to work when logged in as a non-administrator user in XP, although I tend to blame Windows for this issue, not VirtualBox), played around with a little Linux installation acting as an iSCSI target for its virtual block devices, accessing them from Windows using the Microsoft iSCSI initiator, etc. Here’s a screenshot of all this.
I added a launcher for my Windows VM to my panel, which was simply running ‘VBoxManage startvm <VM UUID>’. This was not an optimal solution though, as I wanted it to show a little error dialog when something went wrong when attempting to launch the VM (eg because I forgot it was already running), when the virtual disk files aren’t accessible (because I forgot to mount the volume they reside on), etc.
So I cooked a little script which runs some sanity checks before launching the virtual machine, and reports any errors. Here it is:
#!/bin/bash # This script was written by Nicolas Trangez <eikke eikke com> # It can act as a launcher script for VirtualBox virtual machines # and provides some basic error checking/reporting when doing so. # It might be useful when using a shortcut to launch machines in a # desktop environment. VBOXMANAGE=$(which VBoxManage) ZENITY=$(which zenity) VBOXVMUUID=$1 if [ ! -x ${ZENITY} ]; then echo "Error: The zenity tool could not be found." exit 1 fi if [ ! $# = 1 ]; then ${ZENITY} --error --title "Argument required" --text "This script should be called with one argument: the UUID of the VirtualBox virtual machine you want to start. To find out this UUID, run \"${VBOXMANAGE} list vms\"." exit 2 fi if ! ${VBOXMANAGE} list vms | grep ^UUID | grep ${VBOXVMUUID} > /dev/null; then ${ZENITY} --error --title "Unknown Virtual Machine" --text "No VirtualBox virtual machine with UUID \"${VBOXVMUUID}\" could be found." exit 3 fi if ${VBOXMANAGE} showvminfo ${VBOXVMUUID} | grep ^Primary\ master > /dev/null; then DISKFILE=$(${VBOXMANAGE} showvminfo ${VBOXVMUUID} | grep ^Primary\ master | sed -e "s/Primary\ master:\ *//" -e 's/\ *(UUID.*$//') if [ ! -r ${DISKFILE} ]; then ${ZENITY} --error --title "Primary master not found" --text "The image file for the primary master disk, ${DISKFILE}, could not be found." exit 1 fi fi if ${VBOXMANAGE} showvminfo ${VBOXVMUUID} | grep ^Primary\ slave > /dev/null; then DISKFILE=$(${VBOXMANAGE} showvminfo ${VBOXVMUUID} | grep ^Primary\ slave | sed -e "s/Primary\ slave:\ *//" -e 's/\ *(UUID.*$//') if [ ! -r ${DISKFILE} ]; then ${ZENITY} --error --title "Primary slave not found" --text "The image file for the primary slave disk, ${DISKFILE}, could not be found." exit 1 fi fi if ${VBOXMANAGE} showvminfo ${VBOXVMUUID} | grep ^Secondary\ slave > /dev/null; then DISKFILE=$(${VBOXMANAGE} showvminfo ${VBOXVMUUID} | grep ^Secondary\ slave | sed -e "s/Secondary\ slave:\ *//" -e 's/\ *(UUID.*$//') if [ ! -r ${DISKFILE} ]; then ${ZENITY} --error --title "Secondary slave not found" --text "The image file for the secondary slave disk, ${DISKFILE}, could not be found." exit 1 fi fi VBOXOUT=$(${VBOXMANAGE} startvm ${VBOXVMUUID}) VBOXCODE=$? if [ ! ${VBOXCODE} = 0 ]; then echo -e ${VBOXOUT} VBOXERROR=$(echo ${VBOXOUT} | grep "\[\!\]\ Text" | sed "s/.*\[\!\]\ Text\ *=\ *//") VBOXERROR=$(echo ${VBOXERROR} | sed "s/\ \[\!\].*//") ${ZENITY} --error --title "Error starting Virtual Machine" --text "An error occured while starting the virtual machine: ${VBOXERROR} Run \"${VBOXMANAGE} startvm ${VBOXVMUUID}\" to see more details." exit 4 fi
Enjoy!
This script fails on paths containing spaces. Adding a few well placed quote marks seems to fix it.
I’m an absolute noob when it comes to scripting so how do I use this script. Thanks in advance.