Настройка автозапуска VirtualBox в Ubuntu 16.04 Server

Доброго времени суток! Спасибо что снова с нами) Возникла у нас задача поднять сервер видеонаблюдения на базе уже приобретенного лицензионного ПО Линия, установленного на лицензионной ОС Windows, запущенной в свою очередь, в среде VirtualBox на ОС GNU/Linux. Т.к. по ходу пьесы возникло несколько подводных камней, то я решил написать на нашем сайте несколько заметок, скорее для себя, чтобы была всегда под рукой шпаргалка, понятная мне, а так же, возможно кто-то найдет здесь ответы на свои вопросы. Обоснование выбора именно такой конфигурации будет выложено в отдельной статье, которая будет считаться первой в этом цикле, но написана будет попозже.

Итак, серверное (Ubuntu Server 16.04) и прикладное ПО установлено и настроено, установлена Windows на VirtualBox, теперь необходимо чтобы эта виртуальная машина запускалась при старте сервера, т. к. обеспечить бесперебойное электропитание в режиме 24/7 представляется задачей, требующей вложений немалых денежных средств и для данного проекта нерентабельной.

Хочу заметить, что автозапуск VirtualBox, описанный в официальной документации, с созданием файла /etc/vbox/vboxautostart, у меня не заработал, скрипт запуска так и не появился в /etc/init.d , поэтому пришлось искать обходные решения, одним из которых я вполне успешно воспользовался, найдено оно было здесь.

Итак по порядку. Для начала проверим, будет ли запускаться наша ВМ из консоли. Останавливаем виртуальную машину, если она запущена, и выполняем команду:

$ vboxmanage startvm имя_виртуальной_машины

Рисунок 1.


Нам написали, что данная ВМ успешно стартовала. Должна запуститься VirtualBox в графическом режиме и открыться та ВМ, которую мы указали выше:

Рисунок 2.


Если все запустилось, значит можно продолжать дальше. Снова выключаем ВМ и, затем, выполняем команду:

$ vboxmanage startvm имя_виртуальной_машины --type headless

Рисунок 3.


Вывод данной команды ничем не отличается от предыдущей, однако ВМ запускается
в фоновом режиме, вот эту команду мы и будем использовать для автозапуска, результатом выполнения данной команды будет состояние Работает в программе VirtualBox Manager:

Рисунок 4.


С командой запуска определились, далее определимся с командой остановки. При внезапном выключении сервера будем эмулировать нажатие кнопки выключения питания:

$ vboxmanage controlvm имя_виртуальной_машины acpipowerbutton

(можно использовать опцию savestate вместо acpipowerbutton чтобы сохранить текущее состояние машины, но в моем конкретном случае требуется чтобы гостевая ОС заново поднимала подключение PPTP к VPN-серверу, который физически совпадает с хостом ВМ, поэтому был выбран режим отключения питания)

Рисунок 5.


Данная команда ничего не выводит, просто останавливая ВМ, удостоверимся
в этом открыв VirtualBox Manager:

Рисунок 6.


Итак, если всё вышеперичисленное у Вас работает, тогда можно создавать скрипт и помещать его в автозагрузку.

Создадим файл с именем vboxautostart (имя можно выбрать любое другое), в каталоге /etc/init.d и поместим туда текст скрипта, где в строке

VBOXUSER=username

вместо username укажем имя текущего пользователя от которого должна запускаться
VirtualBox:

#!/bin/bash
#
#This init script autostarts necessary vms at boot 
#and saves running vms on shutdown

# Sed explanation: sed -e 's/^.//' -e 's/.$//'
#   1.  -e means to allow multiple arguments in a single sed command
#   2.  's/^.//' means to substitute (s) / at the beginning of the line (^), any character (.) / [substitute with nothing] /
#   3.  's/.$//' means to substitute (s) / any character (.), at the end of the line / [substitute with nothing] /

VBOXUSER=
RUNNINGVMS=$(sudo -H -u $VBOXUSER vboxmanage list runningvms | cut -d " " -f1 | sed -e 's/^.//' -e 's/.$//')
STOPPEDVMS=$(sudo -H -u $VBOXUSER vboxmanage list vms | cut -d " " -f1 | sed -e 's/^.//' -e 's/.$//')

case "$1" in
  start)
        for i in $STOPPEDVMS
                do
                        echo "Starting" $i "VM"
                        sudo -H -u $VBOXUSER vboxmanage startvm $i --type headless
                        sleep 5
                done
    ;;
  stop)
        for i in $RUNNINGVMS
                do
                        echo "Saving state of" $i "VM"
                        sudo -H -u  $VBOXUSER vboxmanage controlvm $i  acpipowerbutton
                done
    ;;
  *)
    echo "Usage: /etc/init.d/startvm {start|stop}"
    exit 1
    ;;
esac

exit 0

Если присмотреться к скрипту, то он просто будет запускать команды на включение/выключение ВМ в зависимости от того стартует или выключается хостовая машина.

Для создания/редактирования файла я предпочитаю пользоваться редактором mcedit из состава Midnight Commander:

# mcedit /etc/init.d/vboxautostart

Рисунок 7.


Сохраняем файл и меняем права:

# chmod 755 /etc/init.d/vboxautostart

Рисунок 8.


Теперь осталось определить для скрипта уровни загрузки, сделаем это автоматически:

# update-rc.d vboxautostart defaults 99 01

Данная команда добавила скрипт во все необходимые уровни загрузки, теперь можно перезагрузиться и проверить как работает автозапуск ВМ VirtualBox.

Эта статья опубликована под Creative Commons Attribution ShareAlike лицензией.