Настройка автозапуска 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 лицензией.

darkhan (не проверено)
Добрый день! Спасибо за статью, все выполнил по инструкции, но при выключении debiana скрипт vboxautostart не срабатывает, проверил в "rc0.d – выполнение скрипта при выключении системы;" он есть, в чем может быть проблема?
Владимир (не проверено)
Здравствуйте, скрипт работает, но как указать в скрипте какую именно нужно Виртуалку запускать? Запускает сразу две штуки. Куда вставлять названия виртуалок в скрипт? Или он только для одной и запускает всё что создано в VB?

Добавить комментарий