Страница 1 из 1

rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2010-10-24 22:18:50
nemchin
Предлагаю всем кто использует в хозяйстве Virtualbox поделиться своим вариантом скрипта автозапуска/автоостановки. Мой вариант ниже.

/usr/local/etc/rc.d/vms:

Код: Выделить всё

#!/bin/sh

. /etc/rc.subr
BASEDIR="/usr/local/bin/"
USER="vbox_user"
name="vms"
start_cmd="${name}_start"
stop_cmd="${name}_stop"

vms_start()
{
   if [ -x ${BASEDIR}/VBoxManage ]; then
     echo "Starting virtual machines..."
     su -l ${USER} -c "${BASEDIR}/VBoxManage startvm JUPITER --type headless" >/dev/null 2>&1
     su -l ${USER} -c "${BASEDIR}/VBoxManage startvm PLUTO --type headless" >/dev/null 2>&1
   fi
}

vms_stop()
{
   if [ -x ${BASEDIR}/VBoxManage ]; then
    echo "Saving virtual machines state..."
    su -l ${USER} -c "${BASEDIR}/VBoxManage controlvm JUPITER savestate" >/dev/null 2>&1
    su -l ${USER} -c "${BASEDIR}/VBoxManage controlvm PLUTO savestate" >/dev/null 2>&1
   fi
}

load_rc_config $name
run_rc_command "$1"
+ не забыть добавить строку в /etc/rc.conf

Код: Выделить всё

...
vms_enable="YES"

Re: rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2010-10-24 22:22:30
Alex Keda
неуниверсально....

Re: rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2010-10-25 22:43:15
nemchin
Alex Keda писал(а):неуниверсально....
согласен :-)
Есть десяток путей автоматизации и жизнеоблегченья...
Но, главное, что делает скрипт - не даёт guest-машинам "упасть" при внезапном host-system shutdown.

Обновление моего скрипта /etc/rc.d/vms:

Код: Выделить всё

#!/bin/sh

# PROVIDE: vms
# REQUIRE: vboxnet
# KEYWORD: shutdown

. /etc/rc.subr
BASEDIR="/usr/local/bin/"
USER="vbox_user"
name="vms"
rcvar=${name}_enable
start_cmd="${name}_start"
stop_cmd="${name}_stop"

vms_start()
{
   if [ -x ${BASEDIR}/VBoxManage ]; then
     echo "Starting virtual machines..."
     su -l ${USER} -c "${BASEDIR}/VBoxManage startvm JUPITER --type headless" >/dev/null 2>&1
         sleep 15
         su -l ${USER} -c "${BASEDIR}/VBoxManage startvm PLUTO --type headless" >/dev/null 2>&1
   fi
}

vms_stop()
{
   if [ -x ${BASEDIR}/VBoxManage ]; then
        echo "Saving virtual machines state..."
        su -l ${USER} -c "${BASEDIR}/VBoxManage controlvm JUPITER savestate" >/dev/null 2>&1
        su -l ${USER} -c "${BASEDIR}/VBoxManage controlvm PLUTO savestate" >/dev/null 2>&1
   fi
}

load_rc_config $name
: ${vms_enable="NO"}
run_rc_command "$1"

Re: rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2010-10-25 22:57:24
hizel
see man rc.subr, Luke
${name}_user
User to run command as, using chroot(8). if
${name}_chroot is set, otherwise uses su(1). Only
supported after /usr is mounted.

Re: rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2010-10-26 0:15:14
gloom
тоже не универсальный
сделал только то что было надо прямо сейчас
#!/bin/sh
# PROVIDE: vbox
# REQUIRE: LOGIN NETWORKING SERVERS
# KEYWORD: shutdown

. /etc/rc.subr

name="vbox"
rcvar=`set_rcvar`

load_rc_config $name

: ${vbox_enable="NO"}
: ${vbox_user=""}
: ${vbox_virtual=""}

pidfile="/var/run/${name}.pid"
command="/usr/local/bin/VBoxManage"

start_cmd()
{
VPID=`ps -U ${vbox_user} |grep VBoxHeadless |grep ${vbox_virtual} |awk '{print $1}'`
if [ "$VPID" = "" ] ; then
echo "Starting vboxwebsrv..."
su -l ${vbox_user} -c "VBoxManage startvm --type headless ${vbox_virtual}"
echo $VPID > ${pidfile}
echo "Done."
else
echo "no start have runing service pid $VPID "
fi
}

stop_cmd()
{
VPID=`ps -U ${vbox_user} |grep VBoxHeadless |grep ${vbox_virtual} |awk '{print $1}'`
if [ "$VPID" != "" ] ; then
echo "stop vbox..."
su -l ${vbox_user} -c "VBoxManage controlvm ${vbox_virtual} acpipowerbutton"
rm -f ${pidfile}
echo "Done."
else
echo "No runing service"
fi
}

status_cmd()
{
su vb -c "VBoxManage list runningvms | grep ${vbox_virtual}"
VPID=`ps -U ${vbox_user} |grep VBoxHeadless |grep ${vbox_virtual} |awk '{print $1}'`
if [ "$VPID" != "" ] ; then
echo Service runing pid $VPID
ps axu -U ${vbox_user} |grep VBoxHeadless |grep ${vbox_virtual} |awk '{print "pid:"$2" ""%CPU:" $3" ""memMB:"$6 }'
else
echo "No runing service"
fi
}


start_cmd="start_cmd"
stop_cmd="stop_cmd"
status_cmd="status_cmd"

run_rc_command "$1"

Re: rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2010-10-26 11:04:46
nemchin
gloom писал(а):su -l ${vbox_user} -c "VBoxManage controlvm ${vbox_virtual} acpipowerbutton"
Спасибо за ваш вариант!

Кстати, насчёт acpipowerbutton: на мой взгляд, уместнее savestate.
Объясню: acpipowerbutton посылает сигнал и тут же возвращается в shell. Почти 100%, что guest-машина не успеет корректно выключиться в процессе host-shutdown.
Этим я хочу сказать, что делать rc-скрипт просто чтобы заменить VBoxManage бессмысленно.
Гораздо важнее, например, корректное засыпание (завершение) guest-машин при почти полной разрядке UPS-a.

Re: rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2010-10-26 13:01:04
gloom
ка-то не подумал насчет savestate...

надо будет как-то доделать скрипт для множества виртуалок

Re: rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2011-06-12 18:54:49
Костян
Немного переделал скриптик.... Но вот беда- перестала определяться переменная VPID.

Код: Выделить всё

#!/bin/sh
# PROVIDE: vbox
# REQUIRE: LOGIN NETWORKING SERVERS
# KEYWORD: shutdown

. /etc/rc.subr

name="vbox"
rcvar=`set_rcvar`

load_rc_config $name

: ${vbox_enable="NO"}
: ${vbox_user="root"}
: ${vbox_virtual=""}

pidfile="/var/run/${name}.pid"
command="/usr/local/bin/VBoxManage"

start_cmd()
{
$command list vms | awk '{print $1}' > /usr/local/etc/vbox/vmlist
VMNUM=`cat /usr/local/etc/vbox/vmlist | wc -l`
n=1

while [ $n -le $VMNUM ]
do
VMNAME=`cat -n /usr/local/etc/vbox/vmlist | grep $n | awk '{print $2}'`
VPID=`ps -U ${vbox_user} | grep VBoxHeadless | grep $VMNAME | awk '{print $1}'`
echo ">$VPID<"
        if [ "$VPID" = "" ] ; then
                echo "Starting $VMNAME"
                su -l ${vbox_user} -c "$command startvm --type headless $VMNAME"
                echo $VPID > "/var/run/$VMNAME.pid"
                echo "Done. $VMNAME"
        else
                echo "VM $VMNAME already runs "
        fi
        n=`expr $n + 1`
done

}

stop_cmd()
{
$command list runningvms | awk '{print $1}' > /usr/local/etc/vbox/vmlist
VMNUM=`cat /usr/local/etc/vbox/vmlist | wc -l`
n=1

while [ $n -le $VMNUM ]
do
        VMNAME=`cat -n /usr/local/etc/vbox/vmlist | grep $n | awk '{print $2}'`
        VPID=`ps -U ${vbox_user} |grep VBoxHeadless |grep $VMNAME |awk '{print $1}'`
        echo "$VMNAME $VPID ${vbox_user} $1"
        if [ "$VPID" != "" ] ; then
                echo "stopping $VMNAME"
                su -l ${vbox_user} -c "$command controlvm $VMNAME poweroff"
                rm -f "/var/run/$VMNAME.pid"
                echo "Done. $VMNAME"
        else
                echo "No runing service"
        fi
        n=`expr $n + 1`
done
}

status_cmd()
{
su vb -c "VBoxManage list runningvms | grep ${vbox_virtual}"
VPID=`ps -U ${vbox_user} |grep VBoxHeadless |grep ${vbox_virtual} |awk '{print $1}'`
if [ "$VPID" != "" ] ; then
        echo Service runing pid $VPID
        ps axu -U ${vbox_user} |grep VBoxHeadless |grep ${vbox_virtual} |awk '{print "pid:"$2" ""%CPU:" $3" ""memMB:"$6 }'
else
        echo "No runing service"
fi
}


start_cmd="start_cmd"
stop_cmd="stop_cmd"
status_cmd="status_cmd"

run_rc_command "$1"


З.Ы.: сильно плиз не кричите... это мой первый опыт... :)

Re: rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2011-06-13 15:16:40
dekloper
nemchin писал(а): Кстати, насчёт acpipowerbutton: на мой взгляд, уместнее savestate.
Объясню: acpipowerbutton посылает сигнал
кстати, да, иной "гость" может просто покласть на этот сигнал (если это КД, к примеру, или политики там внутре хитрые могут быть..)

Re: rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2011-08-11 22:08:36
EARL
Мой скрипт автозапуска virtualbox

Код: Выделить всё

#!/bin/sh
#
# PROVIDE: vbox
# REQUIRE: DAEMON
#

. /etc/rc.subr

name="vbox"
rcvar=${name}_enable

load_rc_config $name
: ${name}_enable="NO"
: ${name}_user=""
: ${name}_virtual=""

BASEDIR="/usr/local/bin/"
pidfile="/var/run/${name}.pid"

start_cmd=vbox_start
stop_cmd=vbox_stop

vbox_start()
{
    echo "Starting vbox machines..."
    for vbox in $(eval echo \${${name}_virtual});
    do
        user=$(eval echo \${${name}_user})
        pid=`ps -U ${user} | grep VBoxHeadless | grep ${vbox} | awk '{ print $1; }'`
        if [ "$pid" = "" ]; then
            echo "Starting $vbox..."
            if [ $(eval echo \${${name}_${vbox}_vnc}) = "YES" ]; then
                port=$(eval echo \${${name}_${vbox}_vncport})
                pass=$(eval echo \${${name}_${vbox}_vncpass})
                su -l $(eval echo \${${name}_user}) -c "${BASEDIR}/VBoxHeadless --startvm $vbox --vnc --vncport $port --vncpass $pass > /dev/null 2>&1 &"
            else
                su -l $(eval echo \${${name}_user}) -c "${BASEDIR}/VBoxManage startvm $vbox --type headless > /dev/null 2>&1"
            fi
        else
            echo "$vbox already running? (PID=$pid)."
        fi
    done
}

vbox_stop()
{
    echo "Stopping vbox machines..."
    for vbox in $(eval echo \${${name}_virtual});
    do
        echo "Stopping $vbox...";
        su -l $(eval echo \${${name}_user}) -c "${BASEDIR}/VBoxManage controlvm $vbox savestate > /dev/null 2>&1"
    done
}

run_rc_command $1
Если выполнить reboot или shutdown -p now, например, то машины не сохраняют своё состояние. Вопрос:
1. Почему?
2. Можно ли исправить и как?

Re: rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2012-04-18 19:43:32
DrCash
Да да люди помогите с этим.

Проблема в следующем, команда shutdown -p now не дожидается остановки виртуалок.
Как сделать так, что бы команды в скрипте выполнялись по таймауту или после окончания предыдущего задания.

Re: rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2012-04-18 21:09:34
Alex Keda
это уж скорей бага виртуалбокса...

Re: rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2012-04-18 21:36:14
DrCash
наверно не совсем по русски объяснил.

Есть сервак который хост виртуальных машин. Когда в реальном серваке пишешь shutdown -p now, начинает отрабатывать скрипт - витруалки начинают выключаться но реальная машина рубится быстрее и получается, что виртуалки некорректно завершают работу.

Re: rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2012-04-19 14:31:34
Alex Keda
Alex Keda писал(а):это уж скорей бага виртуалбокса...

Re: rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2012-04-19 14:50:11
dmtr
DrCash писал(а):наверно не совсем по русски объяснил.

Есть сервак который хост виртуальных машин. Когда в реальном серваке пишешь shutdown -p now, начинает отрабатывать скрипт - витруалки начинают выключаться но реальная машина рубится быстрее и получается, что виртуалки некорректно завершают работу.
а вы какой скрипт используете?
есть скрипт

Код: Выделить всё

/usr/local/etc/rc.d/vboxheadless
с ним виртуалка корректно завершается, правда у меня тока одна.

Re: rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2012-04-19 14:52:06
snorlov
Alex Keda писал(а):
Alex Keda писал(а):это уж скорей бага виртуалбокса...
Почему ты считаешь это багой виртуалбокса. А если, к примеру, в виртуалке запущен виндовый сервер, у которого стоят политики по умолчания, а там ведь неззя его выключить без логина на консоли, вот вбокс его его и срубает...

Re: rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2012-04-20 8:12:38
Alex Keda
помоему я понял - кажись товарисч тредстартер - гвест аддишен не установил

Re: rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2012-04-20 11:33:19
DrCash
В общемто так, из-за шаманства с phpvirtualbox стандартные скрипты не отрабатывают. И дополнение в к причинам энного, то что в phpvirtualbox виртуалки тоже под разными пользователями. И запускаются они у меня со своего скрипта с поддержкой vnc.

Решил проблему так, запускаются виртуалки через su phpvbuser и дальше все, что надо, создаем pid а при выключение ставим в скрипт wait_for_pids <vmpid> & wait_for_pids <vmpid> ... = кол-ву виртуалок и всё отрабатывает нормально.

Re: rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2012-04-26 16:59:26
ADRE
через скрин всё ок. (/usr/ports/sysutils/screen)
Тухнет процесс автоматом при выключении.
Поставил проверку существования процесса и всё.
--
Только странно что в phpvirtualbox есть превью а вот vrdp запилен.

Re: rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2012-04-26 20:37:34
Charlz_Klug_
ADRE писал(а): Только странно что в phpvirtualbox есть превью а вот vrdp запилен.
Имеете в виду что vrdp в VirtualBox под FreeBSD есть?

Re: rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2012-05-24 14:24:34
ADRE
он есть, активируется проверкой лицензий. думаю при определённых условиях можно обмануть. +)

Re: rc.d скрипт автозапуска Virtualbox для FreeBSD

Добавлено: 2012-05-24 17:03:30
Alvares
Дефолтный таймаут на выключение вроде как 30 сек. Потом рубится сервис. Где-то в rc.shutdown наверное можно поглядеть порядок выключения