Страница 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
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, начинает отрабатывать скрипт - витруалки начинают выключаться но реальная машина рубится быстрее и получается, что виртуалки некорректно завершают работу.
а вы какой скрипт используете?
есть скрипт
с ним виртуалка корректно завершается, правда у меня тока одна.
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 наверное можно поглядеть порядок выключения