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

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

05.02.2019 0 comments » Views: 1,128

Логотип VirtualBox

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

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

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

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

VirtualBox Snapshots

VirtualBox Snapshots

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

Virtualbox создание snapshot

Virtualbox создание snapshot

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

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

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

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

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

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

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

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

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

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

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

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

start.sh

stop.sh

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

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

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

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

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

Author: | Rating: 4/5 | Tags:

Leave a Reply

Your email address will not be published. Required fields are marked *

Allowed HTML-tags: <a>, <code>, <i>, <em>, <strong>, <b>, <u>, <strike>