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
thanks
excellent article.
Works great. Really saved me a ton of time! I had a problem where my server would randomly sigfault and restart. This script at least ensures any virtual servers on it restart while i figure out the real problem.
Thanks!
[root@xxxxxx ~]# service vboxcontrol start-vm yyyyyyyy
Starting VM: yyyyyyyy …
su: user vmadmin does not exist
You need to set that variable to the unprivileged user who actually owns the vm.
Excelent, works in ClearOS 5.1 (ClarkConnect, use Centos 5.x). I try to traslate in my blog this in spanish, and minor modifications. Try for you blog and information.
HGJHJ the error is because not exist vmadmin user. If the machine run in a specific user, you may change user parameter in the script for run properly or create vmadmin user.
Excelent, works in CentOs 5.5. Thank you.
Maximus
How to ??
No I could do it any way, I have CentOs 5.5 (ClearOs 5.2)
Thx
I can’t get the VM’s to stop when I reboot the box (it hangs, waiting for them to shutdown), I tried manually stopping them and they still don’t stop! It gives:
ERROR: The machine ‘testVM’ does not have an open session
Details: code VBOX_E_INVALID_SESSION_STATE (0x80bb000b), component Machine, interface IMachine, callee nsISupports
Context: “OpenExistingSession(a->session, machineuuid)” at line 90 of file VBoxManageControlVM.cpp
You are DA MAN! This worked flawlessly in FC13, just had to change the VM_USER variable.
Way coolio, saved me a huge amount of time.
THANK YOU!
[root@Sonda1 ~]# service vboxcontrol stop
su: invalid option — n
Try `su –help’ for more information.
Finally I get with the solution.
$SU “$VBOXMANAGE list runningvms” | sed ‘s/.*”\(.*\)”.*/\1/’ | while read VM; do
Works better than egrep.
also, you need to add one “-” to nologo line.
VBOXMANAGE=”VBoxManage –nologo”
and in Windows 7, at power settings, please, select “shutdown” when button is pressed, otherwise it won’t shut down the machine.
By default, it does nothing.
thanks to Cristian Honorato for the SEC command.
It worked without modifications for VBox 3.2.10 with CentOS 5.5 host and guest. Thank you very much for posting this solution.
Please excuse but I’m a bit of a noob to Linux. The script gives me the following result:
The following virtual machines are currently running:
“Windows 7″ {e8c50298-9b2b-4d3e-8c05-4c5261eabf78} (bash: -c: line 0: unexpected EOF while looking for matching `”‘
bash: -c: line 1: syntax error: unexpected end of file
)
I assume this is because of the differentiating output format mentioned in earlier posts. I have tried pasting the above mods into the vboxcontrol script but I clearly am not doing it correctly.
So, for the slow kids, could someone PLEASE post their ENTIRE file so I can cut, paste and change the user name? Or at least be very specific in what exactly needs to be replaced?
THANK YOU!!!
Hi, you can find the complete text file on:
http://www.bsw.cl/VBox/VboxManagetext.txt.
Good Luck
$SU “$VBOXMANAGE list runningvms” | cut -d{ -f1 | while read VM; do
is simple and easy to solve the problem of machine name substr
Thanks a bunch,
It took me less than 10 minutes to have my virtual machine up and running as a service.
This was a real time saver.
(Plus, I got some good insights into how to create other services for future use.)
The only change I made to your script was to change the user to one that I had already configured.
Regards,
Amazing, thank you very much !!!
worked great on my CentOS 5.6 and safes me a lot of time
Seems not working with latest Centos 6.0 and Solaris vbox error:”env: /etc/init.d/vboxcontrol: No such file or directory” i think it is referring to “VBOXDIR=”/etc/virtualbox” ” witch does not exist.
Please Help.
Corection: “VBOXDIR=”/etc/virtualbox” does exist, something else is missing ??:(
Solved: Don’t edit with Windows Wordpad, use notepad instead
Worked perfect for me, You have sorted the running users account whose VMs owner-
Easy peacey. Thanks A lot.
[...] imabonehead: How to configure VirtualBox to Auto start and stop Guest VM | CentOS | Linux Tutorial (kernelhardware.org) [...]
[...] imabonehead: How to configure VirtualBox to Auto start and stop Guest VM | CentOS | Linux Tutorial (kernelhardware.org) [...]
[...] imabonehead: How to configure VirtualBox to Auto start and stop Guest VM | CentOS | Linux Tutorial (kernelhardware.org) [...]
[...] imabonehead: How to configure VirtualBox to Auto start and stop Guest VM | CentOS | Linux Tutorial (kernelhardware.org) [...]
[...] ini saya modifikasi dari script nya Kevin Swanson yang ditampilkan disini. Buat config file untuk vboxcontrol init.d [...]
VBoxManage : error : Failed to initialize COM!
I just thought I would add my own solution to the “VBoxManage list runningvms” line 95:
$SU “$VBOXMANAGE list runningvms | sed ‘s/ .*//’ | sed ‘s/\”//g’” | while read VM; do