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>

3 Comments so far

  1. Kevin Swanson on November 23rd, 2009

    Fabio,

    Thank you for writing such a clear explanation of this process.

  2. mirmit on December 9th, 2009

    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

  3. Marcel on January 22nd, 2010

    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

Leave a reply