[Sysadmins] VirtualBox автозапуск гостевой машины и vboxautostart-service
Alexander Yereschenko
ave4600 на gmail.com
Вс Дек 13 17:10:55 MSK 2015
11.12.2015 16:22, Yury Konovalov пишет:
> Вот я когда-то себе делал
> https://sites.google.com/site/speccyfan/virtualbox/init-skript-dla-zapuska-masin
> надеюсь не сильно устарело, думаю можно поправить и пользоваться
>
> 10 декабря 2015 г., 23:19 пользователь Alexander Yereschenko
> <ave4600 на gmail.com <mailto:ave4600 на gmail.com>> написал:
>
> Доброе!
> Нужно настроить на сервере (sysVinit) атозапуск при старте и
> корректное завершение при выключении гостевой машины VirtualBox.
> Почитав родную доку и погуглив, понял, что есть родное
> виртуалбоксовское средство для этого (через
> /etc/default/virtualbox и далее). Но при этом упоминается
> стартовый скрипт**/etc/init.d/vboxautostart-service, которого в
> нашей системе нет. Писать самому? Или всё-таки у нас автозапуск
> как-то по-другому штатно делается?
>
>
Отчитываюсь.
Итак, фактически ничего в скрипте не пришлось править, разве что на
всякий случай изменил порядок автозапуска на "# chkconfig: 35 91 9", ибо
"90 10" прописано у имеющегося сервиса virtualbox. (исправленный скрипт
в аттаче). Еще автор забыл упомянуть про файл $VBOXDIR/vbox.cfg ,
который вроде как для скрипта обязателен. Я туда поместил строчку со
своим значением VM_USER="ave".
Подправляя инструкцию автора получаем:
Скрипт копируем в /etc/init.d
Создаем пользователя, от которого будут стартовать виртуальные машины,
добавляем его в группу vboxusers, и прописываем его в строчку
VM_USER="имя_пользователя" в файл /etc/vbox/vbox.cfg (предварительно
создав этот файл). Создаем файлик /etc/vbox/machines_enabled, где
прописываем машины которые должны запускаться при старте и
останавливаться при завершени работы. Далее используем стандарнтый
chkconfig и service для управления ( chkconfig --add vbox-autostart ;
service vbox-autostart start )
По-хорошему бы этот скрипт доработать, чтобы и systemd его корректно
воспринимал, и чтобы в системный лог сообщения более расширенные
писались, про опакетить вообще не заикаюсь... Но страшное слово -
лень-матушка :)
--
Alexander
----------- следующая часть -----------
Вложение в формате HTML было удалено...
URL: <http://lists.altlinux.org/pipermail/sysadmins/attachments/20151213/820df5c2/attachment-0001.html>
----------- следующая часть -----------
#!/bin/sh
#
# chkconfig: 35 91 9
# description: VirtualBox Autorun
# (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
Подробная информация о списке рассылки Sysadmins