VirtualBox Startup Script
Please note that I no longer use VirtualBox on Linux and have migrated to Proxmox (KVM + OpenVZ) for my virtualization needs, so this script is mostly unmaintained. If you run into bugs, you can still contact me, though.
This script is a combination of my original start/stop scripts and is designed to run on startup and shutdown of the host. It works only if you are running headless, and is not designed to be used with a GUI.
It has been updated as of 04-27-2012
In order to use the script, copy the source listed on this page (or download the source) into a file and place that file in /etc/init.d/
Make sure it has execute permissions and then run this:
sudo update-rc.d vmboot defaults 99 01
Startup Script
#!/bin/bash
### BEGIN INIT INFO
# Provides: vmboot
# Required-Start: vboxdrv $local_fs
# Required-Stop: vboxdrv $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Stop/Start VMs before/after System shutdown
### END INIT INFO
# Updated 04/27/2012
# Add this script to /etc/init.d/
# Run "update-rc.d vmboot defaults 99 01" as root
# Written to work with VirtualBox 4.x
# This script will save the state of any running virtual machines.
# User who is running the VMs (Change this!)
VBOXUSER=vboxuser
# Environmental Variables (Do Not Modify!)
SU="sudo -H -u $VBOXUSER"
VBOXMANAGE="/usr/bin/VBoxManage --nologo"
# Get UUID of All Running VMs
# UUID looks like this: a02b5b54-a84d-48fa-8dac-2a3fad55717e
RUNNINGVMS=$($SU $VBOXMANAGE list runningvms | sed -e 's/^".*".*{\(.*\)}/\1/')
# Get UUID of All VMs
ALLVMS=$($SU $VBOXMANAGE list vms | sed -e 's/^".*".*{\(.*\)}/\1/')
# Functions
function getVMName()
{ echo $($SU $VBOXMANAGE list vms | grep "$1" | awk -F\" '{print $(NF -1)}'); }
# Check to ensure $ALLVMS is not null and exit if it is.
if [[ $ALLVMS = "" ]]; then
echo "No VMs are detected on this host! Did you configure the VBOXUSER variable?"; exit 1
fi
case $1 in
stop)
if [[ -n $RUNNINGVMS ]]; then
for v in $RUNNINGVMS; do
echo -e "Saving state of \"$(getVMName $v)\"..." && $SU $VBOXMANAGE controlvm $v savestate
done; else
echo "No running VMs to save!"
fi
;;
start)
for v in $ALLVMS; do
if [[ -n $($SU $VBOXMANAGE showvminfo $v | grep saved) ]]; then
echo -e "Waiting for VM \"$(getVMName $v)\" to power on..." && $SU $VBOXMANAGE startvm $v --type headless 1> /dev/null && echo "VM \"$(getVMName $v)\" started successfully!"
fi
# If the previous loop has an error, the loops exits and returns an error.
if [[ $? -ne 0 ]]; then
echo "There was an error starting $(getVMName $v)! Try starting it manually to see what the problem is."; break
fi
done
if [[ -z $($SU $VBOXMANAGE showvminfo $v | grep saved) ]]; then
echo "No Saved VMs to Start!"
fi
;;
status)
if [[ -n $RUNNINGVMS ]]; then
echo "List of Running VMs:" && $SU $VBOXMANAGE list runningvms; else
echo "No VMs Currently Running!"
fi
;;
list)
echo "List of All VMs:" && $SU $VBOXMANAGE list vms
;;
*)
echo "Usage: /etc/init.d/vmboot start | stop | status | list"; exit 1
;;
esac
exit 0
# eof
doas777 made some modifications to my original script and the thread with his script can be found here.