[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