VirtualBox: Создание клона виртуальной машины и запуск в headless режиме из консоли
Для некоторых тестов, мне потребовалось несколько виртуальных машин. Точнее, мне нужно было запустить несколько копий одной машины. Важной особенностью было то, что в моих тестах, на эти машины ставилось ПО и проводились некоторые конфигурационные действия, которые сложно было откатить. В связи с этим, мне требовалось как-то их обнулять. На помощь пришло API VirtualBox и пара скриптов.
Прежде всего Вам нужно подготовить базовый образ. Для этого создаете виртуалку и устанавливаете туда ОС. В моем случае, это был CentOS 7. Виртуалку я назвал "centos-minimal".
Далее, есть два пути. Первый это долгий - создавать полный клон виртуалки: копируются все файлы и настройки в новый образ. Или быстрый, создание клона, новый образ лишь содержит изменения относительно старого. Мне подошел второй вариант - создание клона.
Для создания клона через API VirtualBox, нужно создать Snapshot образа. Для этого переходим в панель Machine Tools, выбираем Snapshots и нажимаем кнопку Take
В появившемся окне, вводим название и запоминаем его, в моем случае это centos-minimal-snapshot
Теперь, когда у нас есть snapshot, переходим к командам.
Прежде всего нам нужно создать клоны от базового образа. Для примера, я буду создавать два клона с именами: centos-minimal-test-1 и centos-minimal-test-2. Разумеется, вы можете создать любое кол-во по аналогии. Создать два клона от базового образа можно так:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 (его можно сделать на включенной машине), нам может понадобиться сбросить его статус. Сделать это можно так:
1 2 3 4 |
VBoxManage discardstate "centos-minimal-test-1" VBoxManage discardstate "centos-minimal-test-2" |
Далее, нужно сконфигурировать сеть. В моем случае, в базовом образе, была одна сетевая карта, работающая в режиме Bridge. Т.е. сетевая карта виртуалки появится в той же сети, что и сетевая карта вашего ПК. В моем случае, у меня в роутере включен DHCP сервер, поэтому все данные по настройки сети (ip, dns, шлюз) виртуальная машина получает с него. В случае с клонами, есть одна особенность - у каждого клона будет тот же MAC-адрес, что и у базового образа. В случае с DHCP, при запуске клонов, это приведет к тому, что у всех машин, убудт одинаковые IP (MAC-то одинаковый). Поэтому, нужно поменять клонам MAC-адреса. Делается это так:
1 2 3 4 |
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
Теперь, осталось запустить вирталки, делается это так
1 2 3 4 |
VBoxManage startvm "centos-minimal-test-1" --type headless VBoxManage startvm "centos-minimal-test-2" --type headless |
После этого, они заработают и вы можете приступать к Вашим делам.
Далее, когда потребуется, вы можете их остановить, вот так:
1 2 3 4 |
vboxmanage controlvm "centos-minimal-test-1" poweroff vboxmanage controlvm "centos-minimal-test-2" poweroff |
И при необходимости удалить:
1 2 3 4 |
VBoxManage unregistervm "centos-minimal-test-1" --delete VBoxManage unregistervm "centos-minimal-test-2" --delete |
Используя эти данные, я сделал два скрипта: start.sh и stop.sh которые создают клоны и удаляют из после того, как я провел испытания. Вот код этих скриптов:
start.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#!/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
1 2 3 4 5 6 7 8 9 |
#!/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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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. Причина распространенная (гугл знает о проблеме) и сводится к тому, что такой баг был(?) в прошлых версиях, но решения для себя я пока так не нашел. Если у Вас работает, напишите в комментариях.
Author: | Tags: /
| Rating:
Leave a Reply