VirtualBox na serveru – automatický start virtuálních strojů

Pokud provozujete VirtualBox na serveru, třeba způsobem zmíněným v našem jiném článku, musíte se o virtuální stroje alespoň trochu starat. Nevýhodou třeba je, že virtuály se automaticky nenastartují, pokud dojde k restartu hostitelského stroje. Pokud navíc na virtuály přistupují další lidé, kterým nechcete dát přístup do administrace VirtualBoxu, všechno najednou padá na vás. Vypadne proud, hostitelský stroj naběhne, ale stejně musíte jít a guesty ručně nastartovat. Dnes si ukážeme, jak tuto nepříjemnost vyřešit.

Naším cílem bude vytvořit jednoduché skripty, které umístíme do /etc/rc.d/rcX.d/ podle runlevelu, ve kterém hostitele spouštíme. Skript se pak postará o nastartování všech virtuálních strojů. Se vším nám pomůže utilitka VBoxManage, která je standardně instalována s VirtualBoxem.

Vlastník VM

VirtualBox přistupuje ke guest strojům podle toho, který uživatel je vytvořil. Protože většinou nechceme spouštět vše přímo pod rootem, jak se děje v rcX.d skriptech, musíme se na nového uživatele přepnout. Naším prvním skriptem tedy bude velmi nudná záležitost, kterou necháme spouštět při startu systému.

#!/bin/bash
#virtualni stroje se vztahuji k uzivateli
#skript je spousten pod rootem - pod kterym neni VBox nainstalovany
#je treba su na uzivatele
USER=fiisch
#cesta ke skriptu, ktery startuje samotne VM
STARTVMSPATH=./startvms.sh
su $USER -c $STARTVMSPATH

Samozřejmě k tomuto nepotřebujeme zrovna celý skript, plánování v cronu je stejně dobrou cestou.

Start virtuálních strojů

Nyní použijeme utilitu VBoxManage k ovládání virtuálních strojů. Utilita dokáže ovládat virtuály buď podle jejich názvu nebo podle uuid. My použijeme uuid, protože v názvech se mohou vyskytovat všemožné znaky, které by nám mohly při parsování vadit.

Nejdříve si vylistujeme všechny virtuální stroje:

fiisch@linux-tpme:~> VBoxManage list vms
"Centos6.3 OpenAM,LDAP" {d8a08ed4-04a5-413d-9eef-be05d6cd2355}
"CentOS6.3 CzechIdM upgrade" {b373d816-88c6-43b1-bed3-e218a172137e}

Pokud bychom chtěli virtuál nyní nastartovat, použili bychom příkaz

VBoxManage startvm d8a08ed4-04a5-413d-9eef-be05d6cd2355

který selže. Při tomto volání totiž VirtualBox otevírá Qt okno s lokálním přístupem do virtuálního stroje – což se mu nepovede. Proto použijeme přepínač headless:

VBoxManage startvm d8a08ed4-04a5-413d-9eef-be05d6cd2355 --type headless

Celou podstatou skriptu je pak vzít seznam virtuálních strojů, vybrat z něj všechna uuid, a jim odpovídající stroje následně nastartovat. To realizuje druhý skript – startvms.sh. Skript musí být spustitelný uživatelem vlastnícím virtuální stroje.

#!/bin/bash
#nastartuje vsechny VM dostupne ve VirtualBoxu pro uzivatele, pod kterym je skript spusten
#pouziva /usr/bin/VBoxManage -> /usr/lib/virtualbox/VBoxManage symlink z /usr/bin
#masiny nastartuje jako headless (bez lokalniho VM okna)

echo "Running `basename $0`."
VIRTUALMACHINES=`VBoxManage list vms`
RES=$?
echo "Listing VMs exec. result: $RES"
echo ""
echo "Available machines:"
VBoxManage list vms
echo ""
echo "Starting VBox VMs..."
for VM in $VIRTUALMACHINES ; do
	TMP=`echo "$VM" | grep "^\{.*\}$"`
	if [ "x$TMP" != "x" ]; then
		echo ""
		TMP=`echo $TMP | sed 's/^.*{\(.*\)}$/\1/g'`
		echo "Starting VM: $TMP"
		VBoxManage startvm $TMP --type headless
		RES=$?
		echo "Starting VM exec. result: $RES"
		sleep 20
	fi
done

Vždy po spuštění guesta necháme skript na chvíli spát, aby se hostiteli neucvrkal harddisk.
Běh skriptu pak vypadá následovně:

linux-tpme:/home/fiisch/tmp/vbox # ./execstartvms.sh
Running startvms.sh.
Listing VMs exec. result: 0

Available machines:
"Centos6.3 OpenAM,LDAP" {d8a08ed4-04a5-413d-9eef-be05d6cd2355}
"CentOS6.3 CzechIdM upgrade" {b373d816-88c6-43b1-bed3-e218a172137e}

Starting VBox VMs...

Starting VM: d8a08ed4-04a5-413d-9eef-be05d6cd2355
Waiting for VM "d8a08ed4-04a5-413d-9eef-be05d6cd2355" to power on...
VM "d8a08ed4-04a5-413d-9eef-be05d6cd2355" has been successfully started.
Starting VM exec. result: 0

Starting VM: b373d816-88c6-43b1-bed3-e218a172137e
Waiting for VM "b373d816-88c6-43b1-bed3-e218a172137e" to power on...
VM "b373d816-88c6-43b1-bed3-e218a172137e" has been successfully started.
Starting VM exec. result: 0

Závěr

Dnes jsme si ukázali, jak lze jednoduše zajistit automatický start virtuálů při nastartování hostitelského stroje. Konzolové ovládání VirtualBoxu toho umí mnohem více, ale o tom třeba někdy příště. Pokud byste měli nějaké dotazy, neváhejte mi napsat na info@bcvsolutions.eu.