Tuesday, March 15, 2011

VirtualBox Service

Here is how we run VirtualBox VMs as a service:

Create a run control script: /etc/init.d/rc.vm

Use chkconfig to start the service on boot:
chkconfig add rc.vm
chkconfig rc.vm on

Start and Stop individual VMs with:
service rc.vm startvm Meego-dev
service rc.vm stopvm Meego-dev

VMs are accessible over RDP using ports 9000+

Edit rc.vm to include:

#!/bin/sh
### BEGIN INIT INFO
# Provides: rc.vm
# Required-Start: $network $syslog $vboxdrv
# Required-Stop: $network $syslog
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Description: VirtualBox Virtual Machine autostart
### END INIT INFO

VM=("WinXP-VM" "Embedded-Linux-Yocto-VM" "Meego-dev" "SELX")

case "$1" in
        start)
        for ((i=0; i<${#VM[@]}; i+=1))
                do
                        echo "Starting VM: ${VM[$i]}"
                        /usr/bin/VBoxHeadless --startvm ${VM[$i]} --vrde=on --vrdeproperty "TCP/Ports"=$[9000+$i] 2>/dev/null &
                        sleep 3
                done
        ;;
        stop)
        for ((i=0; i<${#VM[@]}; i+=1))
                do
                        echo "Stopping VM: ${VM[$i]}"
                        /usr/bin/VBoxManage controlvm ${VM[$i]} poweroff 2>/dev/null
                done
        ;;
        status)
                /usr/bin/VBoxManage list runningvms 2>/dev/null
        ;;
        stopvm)
        if [ $# -gt 1 ]; then
                for ((i=0; i<${#VM[@]}; i+=1))
                        do
                                if [ "$2" = ${VM[$i]} ]; then
                                        echo "Stopping VM: ${VM[$i]}"
                                        /usr/bin/VBoxManage controlvm ${VM[$i]} poweroff 2>/dev/null
                                fi
                done
        fi
        ;;
        startvm)
        if [ $# -gt 1 ]; then
                for ((i=0; i<${#VM[@]}; i+=1))
                        do
                                if [ "$2" = ${VM[$i]} ]; then
                                        echo "Stopping VM: ${VM[$i]}"
                                        /usr/bin/VBoxHeadless --startvm ${VM[$i]} --vrde=on --vrdeproperty "TCP/Ports"=$[9000+$i] 2>/dev/null &
                                fi
                done
        fi
        ;;
        *)
        echo "Usage: $0 {start|stop|status}"
        exit 1
        ;;
esac

No comments:

Post a Comment