init скрипт для запуска машин
Скрипт копируем в /etc/init.d
Создаем пользователя, от которого будут стартовать виртуальные машины, в данном примере это пользователь vbox, добавляем его в группу vboxusers. Создаем файлик /etc/vbox/machines_enabled, где прописываем машины которые должны запускаться при старте и останавливаться при завершени работы. Далее используем стандарнтый chkconfig и service для управления. Скрипт работает на версии 3.0.10, замечаны проблемы с запуском виртуальных машин через VBoxManage в версиях 3.0.12 и 3.1.0, но с версии 3.1.4 все опять работает :-)
#!/bin/sh
#
# chkconfig: 35 90 10
# description: VirtualBox
# (c) Yury Konovalov aka Speccyfan (2:453/53)
VBOXDIR="/etc/vbox"
VM_USER="vbox"
WITHOUT_RC_COMPAT=1
LOCKFILE=/var/lock/subsys/vbox
# source function library
. /etc/init.d/functions
RETVAL=0
export PATH="${PATH:+$PATH:}/bin:/usr/bin:/usr/sbin:/sbin:/opt/VirtualBox"
if [ -f $VBOXDIR/vbox.cfg ]; then
. $VBOXDIR/vbox.cfg
else
echo "ERROR: $VBOXDIR/vbox.cfg does not exist. Exiting."
exit 1
fi
SU="su - $VM_USER -c"
VBOXMANAGE="VBoxManage -nologo"
TIMER=/tmp/vboxtimer
# Check for running machines every few seconds; return when all machines are
# down
wait_for_closing_machines() {
RUNNING_MACHINES=`$SU "$VBOXMANAGE list runningvms" | awk '{ print $1 }'|grep \" | sed -e 's/"//g' | wc -l`
if [ $RUNNING_MACHINES != 0 ]; then
sleep 5
T=`cat $TIMER`
let T="$T+1"
echo $T > $TIMER
#echo $T
if [ $T = "60" ]; then
#killing machines
echo \"acpipowerbutton\" timeout
echo Forcing \"poweroff\" ...
echo 0 > $TIMER
$SU "VBoxManage list runningvms"|awk '{ print $1 }'|grep \"|sed -e 's/"//g' | while read VM; do
$SU "$VBOXMANAGE controlvm \"$VM\" poweroff"
done
fi
wait_for_closing_machines
fi
}
start()
{
if [ -f /etc/vbox/machines_enabled ]; then
cat /etc/vbox/machines_enabled | while read VM; do
$SU "$VBOXMANAGE startvm \"$VM\" -type headless"
RETVAL=0
done
touch $LOCKFILE
fi
success
}
stop()
{
$SU "VBoxManage list runningvms"|awk '{ print $1 }'|grep \"|sed -e 's/"//g' | while read VM; do
$SU "$VBOXMANAGE controlvm \"$VM\" acpipowerbutton"
done
echo 0 > $TIMER
wait_for_closing_machines
rm -f $LOCKFILE
success
}
status()
{
$SU "VBoxManage list runningvms"| grep \"| while read VM; do
echo Running $VM
done
return 0
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
*)
msg_usage "${0##*/} {start|stop|status}"
RETVAL=1
esac
exit $RETVAL