X

VirtualBox: Создание клона виртуальной машины и запуск в headless режиме из консоли

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

Прежде всего Вам нужно подготовить базовый образ. Для этого создаете виртуалку и устанавливаете туда ОС. В моем случае, это был CentOS 7. Виртуалку я назвал "centos-minimal".

Далее, есть два пути. Первый это долгий - создавать полный клон виртуалки: копируются все файлы и настройки в новый образ. Или быстрый, создание клона, новый образ лишь содержит изменения относительно старого. Мне подошел второй вариант - создание клона.

Для создания клона через API VirtualBox, нужно создать Snapshot образа. Для этого переходим в панель Machine Tools, выбираем Snapshots и нажимаем кнопку Take

VirtualBox Snapshots

В появившемся окне, вводим название и запоминаем его, в моем случае это centos-minimal-snapshot

Virtualbox создание snapshot

Теперь, когда у нас есть snapshot, переходим к командам.

Прежде всего нам нужно создать клоны от базового образа. Для примера, я буду создавать два клона с именами: centos-minimal-test-1 и centos-minimal-test-2. Разумеется, вы можете создать любое кол-во по аналогии. Создать два клона от базового образа можно так:

VBoxManage clonevm "centos-minimal" \
    --snapshot "centos-minimal-snapshot" \
    --options link \
    --name "centos-minimal-test-1" \
    --register

VBoxManage clonevm "centos-minimal" \
    --snapshot "centos-minimal-snapshot" \
    --options link \
    --name "centos-minimal-test-2" \
    --register

Далее, в зависимости от того, как сделан snapshot (его можно сделать на включенной машине), нам может понадобиться сбросить его статус. Сделать это можно так:

VBoxManage discardstate "centos-minimal-test-1"
VBoxManage discardstate "centos-minimal-test-2"

Далее, нужно сконфигурировать сеть. В моем случае, в базовом образе, была одна сетевая карта, работающая в режиме Bridge. Т.е. сетевая карта виртуалки появится в той же сети, что и сетевая карта вашего ПК. В моем случае, у меня в роутере включен DHCP сервер, поэтому все данные по настройки сети (ip, dns, шлюз) виртуальная машина получает с него. В случае с клонами, есть одна особенность - у каждого клона будет тот же MAC-адрес, что и у базового образа. В случае с DHCP, при запуске клонов, это приведет к тому, что у всех машин, убудт одинаковые IP (MAC-то одинаковый). Поэтому, нужно поменять клонам MAC-адреса. Делается это так:

VBoxManage modifyvm "centos-minimal-test-1" --macaddress1 "0800273DE219"
VBoxManage modifyvm "centos-minimal-test-2" --macaddress1 "0800272A25A9"

Если у вас нет DHCP или вы просто хотите указать сетевые настройки вручную, то используйте параметры (их слишком много, чтобы описывать тут), из официального мануала: VirtualBox User Manual > Chapter 8. VBoxManage > 8.8.2. Networking Settings

Теперь, осталось запустить вирталки, делается это так

VBoxManage startvm "centos-minimal-test-1" --type headless
VBoxManage startvm "centos-minimal-test-2" --type headless

После этого, они заработают и вы можете приступать к Вашим делам.

VirtualBox машины запущенный в headless

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

vboxmanage controlvm "centos-minimal-test-1" poweroff
vboxmanage controlvm "centos-minimal-test-2" poweroff

И при необходимости удалить:

VBoxManage unregistervm "centos-minimal-test-1" --delete
VBoxManage unregistervm "centos-minimal-test-2" --delete

Используя эти данные, я сделал два скрипта: start.sh и stop.sh которые создают клоны и удаляют из после того, как я провел испытания. Вот код этих скриптов:

start.sh

#!/bin/bash

VBoxManage clonevm "centos-minimal" \
    --snapshot "centos-minimal-snapshot" \
    --options link \
    --name "centos-minimal-test-1" \
    --register

VBoxManage clonevm "centos-minimal" \
    --snapshot "centos-minimal-snapshot" \
    --options link \
    --name "centos-minimal-test-2" \
    --register

# только если snapshot был сделан на включенной машине
# VBoxManage discardstate "centos-minimal-test-1"
# VBoxManage discardstate "centos-minimal-test-2"

VBoxManage modifyvm "centos-minimal-test-1" --macaddress1 "0800273DE219"
VBoxManage modifyvm "centos-minimal-test-2" --macaddress1 "0800272A25A9"

VBoxManage startvm "centos-minimal-test-1" --type headless
VBoxManage startvm "centos-minimal-test-2" --type headless

stop.sh

 #!/bin/bash

vboxmanage controlvm "centos-minimal-test-1" poweroff
vboxmanage controlvm "centos-minimal-test-2" poweroff

VBoxManage unregistervm "centos-minimal-test-1" --delete
VBoxManage unregistervm "centos-minimal-test-2" --delete

Определение IP в гостевой системе.

Т.к. в моем случае IP гостевых систем (в клонах виртуалок) назначает DHCP, то хорошо бы, чтобы после запуска виртуалок, мне бы напечатались IP которые получили эти виртуалки. Способ это сделать есть, но, к сожалению, я так и не смог заставить его работать. Напишу тут подробности, чтобы разобраться позже. Если у Вас сработает, напишите в комментариях.

Итак, для запуска команд в гостевой системе, нужно установить VirtualBox Guest Additions. Для разных операционок, это делается по-разному (для CentOS7 тут), поэтому просто погуглите как это сделать. Суть в том, что следующая команда, будет работать только после установки этих дополнений.

Команда, для получения IP гостевой системы, для CentOS:

VBoxManage \
    --nologo \
    guestcontrol "centos-minimal-test-1" \
    --verbose \
    --username="<пользователь>" \
    --password="<пароль>" \
    run \
    --exe "/usr/sbin/ip" \
    --timeout 3000 \
    --wait-stdout \
    --wait-stderr \
    -- pwd/arg0 a

К сожалению, по какой-то причине, команда запускается на выполнение, но результат не возвращается. Вместо этого все "зависает" и судя по всему ждет ответа, а позже отваливается по timeout. От самой команды не зависит, т.е. точно так же зависает и с pwd и whoami. Причина распространенная (гугл знает о проблеме) и сводится к тому, что такой баг был(?) в прошлых версиях, но решения для себя я пока так не нашел. Если у Вас работает, напишите в комментариях.

Категории: Linux Заметки
Тэги: virtualbox