- Uvod
IT svet dneska bezpochyby zacala vo vacsej miere ovladat virtualizacia, je faktom, ze predovsetkym v business sektore mame toto slovo pomerne casto sklonovane, pripadne transformovane do dalsich terminov, ako napriklad cloud computing, ci SAS - software as service.
Na trhu je niekolko virtualizacnych technologii, pricom pouzivatel/administrator ma moznost sirokeho vyberu od open-source rieseni az po eterprise produkty, ktore podliehaju korporatnym licenciam a je nutne za ne platit.
V tomto blogu by som sa chcel venovat pomyslenej strednej ceste a priblizit Vam niekolko menej znamych moznosti vyuzitia potencialu virtualizacnej platformy Virtualbox.
Stredna cesta? Toto oznacenie vyplyva z niekolych dovodov. Vbox je totiz platforma, ktora moze byt v jednom pripade zadarmo (ma oznacenie Virtualbox OSE a je vydana pod GNU/GPLv2.), no v pripade komercnych nasadeni prichadzaju urcite licencne podmienky v podobe VirutalBox PUEL, ktore prinasaju binarnu distribuciu s niekolkymi rozsirujucimi moznostami (RDP support, USB support a podobne)
Prevladajuci nazor na Virtualbox je, ze sa jedna o technologiu, ktora sprostredkuje predovsetkym desktopovu virtualizaciu a nie je vhodna na server.
S tymto tvrdenim sa da suhlasit len ciastocne, pretoze uvedene vylucne desktopove nasadenie je prevazne len mytus, nakolko je takym vseobecnym zvykom si na svojom lokalnom desktope postavit nejaku sekundardnu virtualnu masinu prave na "jednoduchom" Vboxe.
Suhlasim vsak s tvrdenim, ze primarnym ucelom by mala byt virtualizacia pracovnych stanic. :)
Bez akychkolvek obmedzeni je mozne tento hypervizor nainstalovat aj na server, v zasade sa zmeni len princip jeho ovladania – miesto standardneho “desktopoveho” grafickeho okna pouzijete tzv. Headless management.
Headless management je vlastne komplexne API, kde prostrednictvom jeho funkcii mozete vyvolavat rozne procesy/akcie priamo vo vnutri Virtualboxu, pripadne stavat rozne management scripty a rozhrania.
Niekolko zaujimavych a praktickych funkcii by som chcel ukazat v demonstracnych prikladoch.
1. Virtualbox port forwarding
Vsetci pozname siete s roznymi restrikciami a pravidlami vzhladom na pristup uzivatelov. Ja osobne ich zvyknem volat tzv. "akademicke" a mozeme ich najst napriklad v skolach, internatoch, studovniach ale samozrejme aj vo firmach.
Je pomerne beznym javom, ze uzivatel bud na zaklade poplatku, alebo ineho prejavu formy clenstva urcitej organizacie dostane pristup do internetu naviazany na MAC adresu jeho pocitaca.
Vsetky ostatne, neregistrovane adresy tento pristup mat nebudu.
Toto vsetko je v poriadku, predstavme si vsak situaciu, ze na svojom desktope prevadzkujeme VirtualBox, kde vo vnutri bezi linuxova masina, pre ktoru by sme potrebovali priamy pristup a zdielany networking.
Fakt, ze tato masina nedostane v ramci LAN IP adresu s pristupom do internetu ciastocne riesi priamo vo Vboxe tzv. NAT Networking mode - na zaklade ktoreho moze masina z fyzickym hostitelom zdielat aspon jedno pripojenie.
Co ak sa na masinu chcem ale SSHckovat, alebo tunelovat rozne spojenia, pripadne na nej pouzivam webserver pre ucely developmentu, alebo len skratka potrebujem dalsieho osobitneho clena LAN s pristupom do internetu?
Toto je pomerne casty problem na ktory ludia narazaju, na internete je velke mnozstvo for, kde sa tieto otazky zodpovedaju.
V headless mode mozme tuto situaciu vyriesit prostrednictvom nastroja VboxManage, ktoremu po predani dalsich direktiv mozeme priamo vo virtualnom stroji forwardovat prislusne porty sluzieb, ktore chceme mat dostupne bez toho, aby sme riesili akekolvek IP adresy, alebo nastavenia firewallu. Nehovoriac o tom, ze nie je potrebne kontaktovat adminov o povolenie dalsej MAC.
Pre tento ucel som napisal jednoduchy script, ktory tuto funckionalitu zhrna pod jednu strechu – staci zadefinovat len vstupne parametre (vid. help sekcia) - script zavola prislusne prikazy z VBoxManage a nasledne ich na masine vykona.
Vyhodou tejto utilitky je, ze moze byt zapojena do akehokolvek vyssieho administracneho rozhrania a nie je potrebne zakazdym dookola pisat zdlhave prikazy Virtualboxu.
Kod je dostupny na tejto URL a je mozne si ho prezriet, stiahnut pouzit, distribuovat, pricom samozrejme uvitam aj potencialne dodatocne modifikacie a vylespenia.
Vratme sa vsak opat do praxe a ukazme si jeho aplikaciu. Majme virtualny server, ktory vyuziva NAT a je skryty za IP adresou 10.1.1.5
Na hostitelskom systeme spustime:
/vbox-natfwd --name [vmname] --srcport [8080] --dstport [80] --type [Apache]
Tento zapis nam nasledne v urcenej virtualnej masine vytvori forward s nazvom Apache a nam uz len v hostitelovi staci otvorit si browser, zapisat do prehliadaca 127.0.0.1:8080 a sme priamo na virtualnom webserveri.
Tento postup je nasledne mozne aplikovat na akukolvek inu sietovu sluzbu, ci uz je to SSH, remote desktop, alebo povedzme proxy server.
Pre uplnost pridavam upravenu ukazku, ktora tento proces v scripte implementuje:
VBoxManage setextradata $VMNAME "VBoxInternal/Devices/pcnet/0/LUN#0/Config/$SERVICE/HostPort" $HOSTPORT
VBoxManage setextradata $VMNAME "VBoxInternal/Devices/pcnet/0/LUN#0/Config/$SERVICE/GuestPort" $GUESTPORT
VBoxManage setextradata $VMNAME "VBoxInternal/Devices/pcnet/0/LUN#0/Config/$SERVICE/Protocol" TCP
2. Storage management
Vo Virtualboxe je mozne riesit storage niekolkymi sposobmi. Na zaciatku je esencialny vyber controlleru, na ktory sa nasledne budu virtualizovane disky napajat. Na vyber je hned niekolko, od starsieho IDE, cez SATA az po SCSI, ci SAS.
Kazdy z nich obsahuje niekolko featur, ktore by stacili na dalsi clanok za zmienku vsak stoji jeden bug, ktory som nedavno v suvislosti so SATA controllerom reportoval. (http://www.virtualbox.org/ticket/7271)
Ked mame vyrieseny vyber controlleru, mozeme zacat napajat storage. Implicitne riesenie su nativne *.vdi images, ktore si vytvara priamo Virtualbox a mozme ich rozdelit na obrazy s fixnou velkostou, alebo obrazy dynamicky expandujuce po urceny strop. (Vyhodou je vzdy pouzit dynamicke riesenie, nakolko je v konecnom dosledku setrnejsie k fyzickemu storage servera na ktorom prevadzkujeme sluzbu – uzivatel nemusi vzdy nutne vsetok priestor zaplnit, castokrat ma len velke oci.)
Ja som sa na zaciatku rozhodol pouzit LVM oddiely.
V tomto pripade vsak nie je mozne nakonfigurovat virtualnu masinu priamo (napevno pripojit cielovu cestu ku konkretnemu LVM), ako je to napriklad v XENe – je nutne nad samotnym logickym oddielom vytvorit abstrakciu, ktora je podporovana controllerom a moze byt nasledne pripojena. V tomto pripade hovorime o formate *.vmdk, ktory je standadizovany spolocnostou VMWARE.
Nakolko Virtualbox ma plnu podporu formatu *.vdmk, je mozne tuto abstrakciu vytvorit velmi jednoducho:
VBoxManage internalcommands createrawvmdk -filename /home/daan/vbox/disks/daan-data.vmdk -rawdisk /dev/datacloud/daan-data
Z uvedeneho vidime, ze vo volume skupine datacloud mame jeden logicky oddiel s nazvom daan-data, na ktory sme do urciteho adresara vytvorili *.vmdk subor, ktory ma nasledovny textovy tento format:
# Disk DescriptorFile
version=1
CID=b4c7b16d
parentCID=ffffffff
createType="fullDevice"
# Extent description
RW 419430400 FLAT "/dev/datacloud/daan-data" 0
# The disk Data Base
#DDB
ddb.virtualHWVersion = "4"
ddb.adapterType="ide"
ddb.geometry.cylinders="16383"
ddb.geometry.heads="16"
ddb.geometry.sectors="63"
ddb.uuid.image="23dc43e4-db6c-4dcb-9fd3-c46e26fa7094"
ddb.uuid.parent="00000000-0000-0000-0000-000000000000"
ddb.uuid.modification="00000000-0000-0000-0000-000000000000"
ddb.uuid.parentmodification="00000000-0000-0000-0000-000000000000"
ddb.geometry.biosCylinders="1024"
ddb.geometry.biosHeads="255"
ddb.geometry.biosSectors="63"
Nasledne ho len pripojime do virtualneho stroja bud cez GUI, alebo opat cez headless mod v podobe prikazu:
VBoxManage storageattach <vmname> --storagectl <controller> --port 0 --device 0 --type hdd --medium "/home/daan/vbox/disks/daan-data.vmdk"
Pri tomto sposobe je vsak zlozitejsie v buducnosti velkost harddisku resizovat. Je potrebne najskor rozsirit standardne LVMko, nasledne pregenerovat *.vmdk image a znovu opat pripojit.
Navyse sa tu straca vyhoda dynamickeho expandovania, ktoru poskytuje standardne *.vdi.
Co sa tyka rozsirovania *.vdi disku, je tu pomerne jednoduchy trik:
- vytvorite novy image s pozadovanou velkostou
- spustite klonovanie originalneho disku
VBoxManage clonehd --existing oldhd.vdi newhd.vdi
- na controlleri prepnete novy storage
Pri cisto datovych particiach moze nastat situacia, kedy potrebujeme mat predpripraveny image so specifickymi udajmi. Jedzno z rieseni by bolo vytvorit si cisty image na kory svoje subory nakopirujeme (pripadne prostrednictvom commandu dd mozme nakopirovat aj obrazy systemovych particii)
RAW image mozme vytvorit cez qemu napriklad takto:
qemu-img create -f qcow2 winxp.img 5GB
nasledne ho vieme bud pripojit na urcity pripojny bod:
mount -o loop,offset=32256 /path/to/image.img /mnt/mountpoint
alebo opat cez virtualbox API pretransformovat na *.vdi harddisk:
VBoxManage convertfromraw -format VDI [filename].img [filename].vdi
Moznosti je este omnoho viac, kapitole storage technologii by som sa mohol venovat v potencialnom pokracovani clanku v buducnosti.
3. Controlling virtual machine
V ramci adaptacie roznych funkcii pre zakladne ovladanie virtualneho stroja som pripravil aj utilitu, kde pomocou prepinacov mozeme cez shell so strojom manipulovat. Najdolezitejsie je na zaciatku vediet efektivne spravovat/prepinat stav virtualneho stroja, script vbox-vmcontrol riesi power on/power off + pripadne nastavenia RDP, ci ACPI.
4. Creating virtual machine
V poslednom bode clanku by som chcel predstavit sposob, ktorym je mozne z prostredia shellu samotne virtualne stroje generovat.
Standardne sme s Virtualboxu zvyknuti na graficke rozhranie, kde sa vsetko naklika, opat je vsak mozne vyuzit moznost CLI a nasledne proces automatizovat.
Pre ilustraciu si demonstrujeme vytvorenie plnohodnotneho stroja s bridged networkingom, postaveneho na LVM storage systeme.
./vboxcreate-lvm --name TestingMachine --memory 1024 --processors 2 --type Debian_64 --controller sata --lvm daan-root --size 5
Po spusteni scriptu sa vygeneruje stroj s nazvom TestingMachine, bude mat pridelenych 1024 Mb RAM, 2 CPU jadra, SATA controller, logicky oddiel s velkosou 5Gb a bude pripraveny na instalaciu 64bit Debianu.
ISO image mozeme pripojit nasledovne:
./vboxcreate-lvm --name TestingMachine --iso /path/to/image.iso
Dodatocne este pripojim taktiez ukazku celeho procesu, ktory je v scripte implementovany:
echo -n "Creating and registering VM $VMNAME into VBox inventory. "
VBoxManage createvm --name "$VMNAME" --ostype "$TYPEOS" --register
echo -n "Alocating $MEMORY Mb RAM, adding $CPU CPU, configuring bridged networking and boot options. VBoxManage modifyvm "$VMNAME" --memory "$MEMORY" --cpus "$CPU" --nic1 bridged --boot1 dvd --boot2 disk --boot3 net
echo -n "Creating $VMNAME storage $CONTROLLER controller. "
VBoxManage storagectl "$VMNAME" --name "$VMNAME" --add "$CONTROLLER"
echo -n "Creating VDI harddisk $DISK.vdi of $DISKSIZE Mb. "
VBoxManage createhd --filename "$DISK" --size "$DISKSIZE" --remember
echo -n "Attching VDI harddisk $DISK.vdi into VM $VMNAME. "
VBoxManage storageattach "$VMNAME" --storagectl "$VMNAME" --port 0 --device 0 --type hdd --medium "$DISK.vdi"
Kompletny script v pripade LVM: vboxcreate-lvm a v pripade VDI: vboxcreate-vdi
- Zaver
Je vidiet, ze Virtualbox je mocny nastroj, ktorym sa daju na serveri s virtualnymi masinami robit rozne procesy a akcie. Tento clanok je len jemnym uvodom do jeho moznosti, v buducnosti by som rad napisal potencialne pokracovanie rozsirujucou technologickou analyzou, dalsimi praktickymi ukazkami a pripadne benchmarkom z implementacie pilotnej virtual desktop infrastructure.
Dobra clanok, len pripomienka ku GUI vs VboxManage. Command line ovladaniu sa nevyhnes ani na deskope nakolko cez gui nejdu spravit niektore extra veci. Vzdy si ale radsej spravim skript ked konecne vydolujem nastavenie nejakeho prikazu, ked to nepouzivam casto tak zabudnem a popis je dost dlhy na studovanie.
Pekny clanok, VBox je zaujimavy nastroj a vela ludi ani nevie, ze existuje.
vbox ma hlavne imho v sucasnosti problemy.
po tom ako ho prevzal oracle sa mi velmi nepaci smer, ktrym sa ubera. (kedze to ani nie je ich core business, niet sa co cudovat.)
napriklad ten spominany bug v clanku - testoval som to na roznych serveroch s inym hardware, ale nakoniec s rovnakym vysledkom.
na irc som sa rozpraval s nejakymi ludmi od nich a podla vsetkeho hlavnu technicku zmenu podstupil virtualbox prave v handlovani storage (rozumej - cele to prepisali.)
celkom dobre to vystihuje tento blog - http://www.muktware.com/news/26/2010/249