Скрипт копируем в /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=1LOCKFILE=/var/lock/subsys/vbox# source function library. /etc/init.d/functionsRETVAL=0export PATH="${PATH:+$PATH:}/bin:/usr/bin:/usr/sbin:/sbin:/opt/VirtualBox"if [ -f $VBOXDIR/vbox.cfg ]; then . $VBOXDIR/vbox.cfgelse echo "ERROR: $VBOXDIR/vbox.cfg does not exist. Exiting." exit 1fiSU="su - $VM_USER -c"VBOXMANAGE="VBoxManage -nologo"TIMER=/tmp/vboxtimer# Check for running machines every few seconds; return when all machines are# downwait_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=1esacexit $RETVAL