VirtualBox Auto Start VM Centos Fedora RedHat
Scenario / Question:
How do I get my VirtualBox Guest VM’s to start and stop when the host system reboots, shutdown, or starts.
Solution / Answer:
Create an init.d script so that VirtualBox Guest VM are controlled as a system service.
Install VirtualBox VM Service script
The original script was for Ubuntu systems found here . Modified for Centos by Kevin Swanson found here .
Create Config File for vboxcontrol service script
# mkdir /etc/virtualbox # touch /etc/virtualbox/machines_enabled
The file “machines_enabled” located in “/etc/virtualbox” is where we list the names of the Guest VM’s that we want vboxcontrol to control.
To get a list of your current Guest VM names execute the following command and notice the name is in ” “:
$ VBoxManage list vms
"Centos_HDLES_x86_1" {5087b02a-5816-4c76-b302-c13175623023}
"Centos_HDLES_x86_3" {bcae660a-f627-46d6-8c95-9da97363eeea}
"Centos_HDLES_LAMP" {3907173c-cc15-4820-a930-f0bb3c13cb7e}
Add Guest VM’s to “machines_enabled” include one VM name per line
# vi /etc/virtualbox/machines_enabled Centos_HDLES_x86_1 Centos_HDLES_x86_3 Centos_HDLES_LAMP
Add VirtualBox VM Service script
Create new init.d service script file and give execute permissions
# touch /etc/init.d/vboxcontrol # chmod 755 /etc/init.d/vboxcontrol
Copy the following code into file “/etc/init.d/vboxcontrol”
#! /bin/sh
# vboxcontrol Startup script for VirtualBox Virtual Machines
#
# chkconfig: 345 98 02
# description: Manages VirtualBox VMs
# processname: vboxcontrol
#
# pidfile: /var/run/vboxcontrol/vboxcontrol.pid
#
### BEGIN INIT INFO
#
### END INIT INFO
#
# Version 20090301 by Kevin Swanson <kswan.info> based on:
# Version 2008051100 by Jochem Kossen <jochem.kossen@gmail.com>
# http://farfewertoes.com
#
# Released in the public domain
#
# This file came with a README file containing the instructions on how
# to use this script.
#
# Source function library.
if [ -f /etc/init.d/functions ] ; then
. /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
. /etc/rc.d/init.d/functions
else
exit 1
fi
################################################################################
# INITIAL CONFIGURATION
VBOXDIR="/etc/virtualbox"
VM_USER="vmadmin"
USE_NAT="no"
export PATH="${PATH:+$PATH:}/bin:/usr/bin:/usr/sbin:/sbin"
if [ -f $VBOXDIR/config ]; then
. $VBOXDIR/config
fi
SU="su $VM_USER -c"
VBOXMANAGE="VBoxManage -nologo"
################################################################################
# FUNCTIONS
# Determine if USE_NAT is set to "yes"
use_nat() {
if [ "$USE_NAT" = "yes" ]; then
return `true`
else
return `false`
fi
}
log_failure_msg() {
echo $1
}
log_action_msg() {
echo $1
}
# Check for running machines every few seconds; return when all machines are
# down
wait_for_closing_machines() {
RUNNING_MACHINES=`$SU "$VBOXMANAGE list runningvms" | wc -l`
if [ $RUNNING_MACHINES != 0 ]; then
sleep 5
wait_for_closing_machines
fi
}
################################################################################
# RUN
case "$1" in
start)
if [ -f /etc/virtualbox/machines_enabled ]; then
cat /etc/virtualbox/machines_enabled | while read VM; do
log_action_msg "Starting VM: $VM ..."
$SU "$VBOXMANAGE startvm "$VM" -type vrdp"
RETVAL=$?
done
touch /var/lock/subsys/vboxcontrol
fi
;;
stop)
# NOTE: this stops all running VM's. Not just the ones listed in the
# config
$SU "$VBOXMANAGE list runningvms" | while read VM; do
log_action_msg "Shutting down VM: $VM ..."
$SU "$VBOXMANAGE controlvm "$VM" acpipowerbutton"
done
rm -f /var/lock/subsys/vboxcontrol
wait_for_closing_machines
;;
start-vm)
log_action_msg "Starting VM: $2 ..."
$SU "$VBOXMANAGE startvm "$2" -type vrdp"
;;
stop-vm)
log_action_msg "Stopping VM: $2 ..."
$SU "$VBOXMANAGE controlvm "$2" acpipowerbutton"
;;
poweroff-vm)
log_action_msg "Powering off VM: $2 ..."
$SU "$VBOXMANAGE controlvm "$2" poweroff"
;;
status)
echo "The following virtual machines are currently running:"
$SU "$VBOXMANAGE list runningvms" | while read VM; do
echo -n "$VM ("
echo -n `$SU "VBoxManage showvminfo ${VM%% *}|grep Name:|sed -e 's/^Name:s*//g'"`
echo ')'
done
;;
*)
echo "Usage: $0 {start|stop|status|start-vm <VM
name>|stop-vm <VM name>|poweroff-vm <VM name>}"
exit 3
esac
exit 0
Add vboxcontrol service to chkconfig registry
# chkconfig --add vboxcontrol
Tell chkconfig to create symlinks for runlevels and activate service vboxcontrol
# chkconfig vboxcontrol on
How to use vboxcontrol to control Guest VM’s running as a service
Start ALL VirtalMachines listed in machines_enable file:
# service vboxcontrol start
Stop ALL VirtualMachines currently running !!
# service vboxcontrol stop
View Status of Running VirtualMachines
# service vboxcontrol status
Start a Specific VirtualMachine Only !!
# service vboxcontrol start-vm <VM NAME>
Stop a Specific VirtualMachine Only ( send acpipowerbutton signal )
# service vboxcontrol stop-vm <VM-NAME>
Send Power Kill signal to VirtualMachine (immediate power off)
# service vboxcontrol poweroff-vm <VM-NAME>



Fabio,
Thank you for writing such a clear explanation of this process.
Hi,
It seem – at least in VirtualBox 3.1.0 – the output format of the VBoxManage list command has changed. It include both the name and the UUID of the VM. Unfortunatelly this is not accepted by the stop command.
I’ve changed the script to trim down the VM name cahngeing the line to:
$SU “$VBOXMANAGE list runningvms” | egrep -o “^\”[a-zA-Z09]*\”" | while read VM; do
and then I can properly close the VM.
Hopping it will help
Hi,
$SU “$VBOXMANAGE list runningvms” | egrep -o “^\”[a-zA-Z09]*\”” | while read VM; do
Did not work, changed a minor thing:
$SU “$VBOXMANAGE list runningvms” | egrep -o “^\”[a-zA-Z0-9]*\”” | while read VM; do
Cheers