Kategória: VirtualBox

Zmenené: 14. august 2011

VirtualBox - nástroj VBoxManage

Ak používate program VirtualBox, iste poznáte jeho okno pre správu virtuálnych počítačov. Mnohým možnosti, ktoré nájdu v tomto grafickom správcovi plne postačujú. Ale ani zďaleka to nie je všetko, čo môžete s virtuálnymi strojmi robiť. K úplne všetkým možnostiam sa dostanete až z príkazového riadku, napríklad pomocou nástroja VBoxManage.

VBoxManage je správcovské rozhranie príkazového riadku pre správu virtuálnych strojov. Čo ešte k tomu na úvod dodať? Asi len toľko, že úplný výpis možností programu získate pomocou prepínača –help. Sami sa presvedčte, že tých možností je naozaj neúrekom:

VBoxManage --help

Vyprodukovaný výstup je dosť obsiahly (ako možnosti tohoto nástroja), preto ho tu nebudem kopírovať. Ale v krátkosti zhrniem, čo všetko je možné týmto nástrojom robiť:

  • spravovať virtuálne stroje,
  • spúšťať virtuálne stroje,
  • spravovať virtuálne disky,
  • spravovať obrazy CD/DVD, či diskiet,
  • zobrazovať informácie o virtuálnom prostredí,
  • a ďalšie…

Všeobecná syntax príkazu VBoxManage pozostáva z dvoch častí, a to príkazu a podpríkazu, ktorý bližšie špecifikuje, čo má príkaz robiť:

VBoxManage <prikaz> <podpríkaz>

jednotlivé príkazy a podpríkazy môžu prijímať ďalšie voľby, či parametre, ktorými môžte podrobnejšie riadiť činnosť programu. Napríklad samotný prepínač -v (--version) vytlačí verziu a skončí:

VBoxManage --version
1.6.2r31466

Pri každom spustení nástroja VBoxManage vytlačí najprv hlavičku, ak Vám to vadí, môžete to zakázať pomocou prepínača -nologo, pred samotným príkazom nástroja, čiže:

VBoxManage -nologo <príkaz> ...

Aby som Vás motivoval k ďalšiemu štúdiu, uvediem stručný zoznam všetkých príkazov nástroja VBoxManage:

  • adoptstate
  • bandwidthctl
  • clonehd
  • clonevm
  • closemedium
  • controlvm
  • convertfromraw
  • createhd
  • createvm
  • debugvm
  • dhcpserver
  • discardstate
  • export
  • extpack
  • getextradata
  • guestcontrol
  • guestproperty
  • hostonlyif
  • import
  • list
  • metrics
  • modifyhd
  • modifyvm
  • registervm
  • setextradata
  • setproperty
  • sharedfolder
  • showhdinfo
  • showvminfo
  • snapshot
  • startvm
  • storageattach
  • storagectl
  • unregistervm
  • usbfilter

Niektoré možnosti popíšem ďalej v článku.

Získavanie Informácií

Celkové informácie

Začnime, hádam, preskúmavaním, čo to v tom systéme máme. Pre zisťovanie informácií o systéme a nastaveniach VirtualBoxu slúži príkaz list. Jeho úplná syntax vyzerá takto:

VBoxManage list [--long|-l] vms|runningvms|ostypes|hostdvds|hostfloppies|
                            bridgedifs|hostonlyifs|dhcpservers|hostinfo|
                            hostcpuids|hddbackends|hdds|dvds|floppies|
                            usbhost|usbfilters|systemproperties|extpacks

Sami vidíte, že za samotným príkazom list nasleduje množina podpríkazov. Úlohou jednotlivých podpríkazov je:

  • vms, hdds, dvds a floppies - všetky vypíšu informácie o virtuálnych strojoch a obrazoch diskov (CD, DVD, či diskiet), vrátane ich všetkých nastavení, identifikátorov a príslušných súboroch. Zdôrazním to všetkých, pretože výpis môže byť naozaj dlhý (v závislosti od počtu strojov, či diskov).
  • ostypes - vypíše všetky podporované typy operačných systémov (podporovaných pre virtuálne stroje).
  • hostdvds a hostfloppies - vypíše mená zariadení DVD a disketových mechaník, použitých pre prístup vo vnútri VirtualBox.
  • hostusb supplies information about USB devices attached to the host, notably information useful for constructing USB filters and whether they are currently in use by the host.
  • usbfilters - vypisuje všetky globálne USB filtre, registrované vo VirtualBox, a ich parametre teda filtre pre zariadenia, ktoré sú prístupné pre všetky virtuálne stroje.
  • systemproperties - vypíše niektoré všeobecné nastavenia VirtualBoxu.
  • extpacks - vypíše zoznam nainštalovaných rozšírení.

Informácie o jednotlivom stroji

Ak Vás zaujímajú nastavenia len jedného virtuálneho stroja je lepšou voľbou príkaz showvminfo. Tento príkaz zobrazuje tie isté informácie ako VBoxManage list vms, ale len o zadanom virtuálnom stroji, namiesto o všetkých. Jeho syntax je:

VBoxManage showvminfo <meno_stroja>

Pričom meno_stroja je meno Virtuálneho stroja, tak ako ste ho zadali pri jeho vytvorení. Ak meno obsahuje medzery, uzatvorte ho do úvodzoviek. A takto vyzerá výstup pre stroj nazvaný ldap:

VBoxManage showvminfo ldap

Name:      ldap
Guest OS:    Debian
UUID:      6aa78d72-69fd-4bd5-02a3-b060a3409527
Config file:   /home/virtual/virtbox/Machines/ldap/ldap.xml
Memory size:   256MB
VRAM size:    8MB
Boot menu mode: message and menu
ACPI:      on
IOAPIC:     off
PAE:       off
Time offset:   0 ms
Hardw. virt.ext: off
State:      powered off (since 2008-06-29T17:41:30.000000000)
Monitor count:  1
Floppy:     empty
SATA:      disabled
Primary master: /home/virtual/virtbox/VDI/ldap.vdi (UUID: 381b52b2-56e0-4096-8d9f-942085ef4aef)
DVD:       empty
NIC 1:      MAC: 080027602635, Attachment: NAT, Cable connected: on, Trace: off (file: none), \
                 Type: Am79C973, Reported speed: 0 Mbps
NIC 2:      disabled
NIC 3:      disabled
NIC 4:      disabled
UART 1:     disabled
UART 2:     disabled
Audio:      disabled (Driver: Unknown, Controller: Unknown)
Clipboard Mode: Bidirectional
VRDP:      disabled
USB:       disabled

USB Device Filters: <none>
Shared folders:     <none>
Guest:
Statistics update:  disabled

Informácie o virtuálnom disku

Ak chcete zistiť, čo to máte za virtuálny disk, použite príkaz showvdiinfo, ktorý vypíše informácie o danom disku. Ako argument môžete použiť UUID disku alebo meno súboru s virtuálnym diskom:

VBoxManage -nologo showvdiinfo /home/virtual/virtbox/VDI/ldap.vdi
UUID: 381b52b2-56e0-4096-8d9f-942085ef4aef
Registered: yes
Accessible: no
Access Error: Hard disk '/home/virtual/virtbox/VDI/ldap.vdi' is being exclusively used by another task
Size: 2048 MBytes
Current size on disk: 964 MBytes
Type: standard
Storage type: Virtual Disk Image (VDI)
In use by VM: 6aa78d72-69fd-4bd5-02a3-b060a3409527
Path: /home/virtual/virtbox/VDI/ldap.vdi

Vo výpise si môžete všimnúť, že hlási použitie disku iným procesom (virtuálny stroj je spustený), rovnako i to, že je to dynamický disk, ktorý má veľkosť 2 GB (2048 MB), ale na disku zaberá len 964 MB.

Virtuálne stroje

Spúšťanie

Správa virtuálnych strojov pozostáva z viacerých operácií. Asi najzaujímavejšou je možnosť spúšťať virtuálny stroj z príkazového riadku, čo možno využiť napríklad na vytvorenie položky v menu, či na spúšťanie viacerých virtuálnych strojov zo skriptu. Základná syntax vyzerá takto:

VBoxManage startvm          <uuid>|<meno>
                            [--type gui|sdl|headless]

Tento príkaz spustí zadaný virtuálny stroj. Ak sa preklepnete v mene (ja si občas popletiem veľké a malé písmená), program vypíše chybové hlásenie, napríklad:

VBoxManage -nologo startvm debserver
[!] FAILED calling virtualBox->FindMachine(Bstr(argv[0]), machine.asOutParam()) at line 5417!
[!] Primary RC  = NS_ERROR_INVALID_ARG (0x80070057) - Invalid argument value
[!] Full error info present: true, basic error info present: true
[!] Result Code = NS_ERROR_INVALID_ARG (0x80070057) - Invalid argument value
[!] Text        = Could not find a registered machine named 'debserver'
[!] Component   = VirtualBox, Interface: IVirtualBox, {2d3b9ea7-25f5-4f07-a8e1-7dd7e0dcf667}
[!] Callee      = IVirtualBox, {2d3b9ea7-25f5-4f07-a8e1-7dd7e0dcf667

Ak si necháte vypísať návratovú hodnotu, zistíte, že je nastavená na 1:

echo $?
1

Ak zadáme meno správne, je výpis výrazne kratší:

VBoxManage -nologo startvm DebServer
Waiting for the remote session to open...
Remote session has been successfully opened.

A návratová hodnota je v tomto prípade 0, čiže oznamuje úspech operácie. Môže sa Vám podariť aj pokus o spustenie už bežiaceho stroja. Nie, nástroj ho nespustí druhý krát, ale opäť vypíše chybové hlásenie a návratová hodnota nástroja bude v tomto prípade 5:

BoxManage -nologo startvm DebServer
[!] FAILED calling virtualBox->OpenRemoteSession(session, uuid, sessionType, env, progress.asOutParam()) \
                               at line 5456!
[!] Primary RC  = E_ACCESSDENIED (0x80070005) - Access denied
[!] Full error info present: true, basic error info present: true
[!] Result Code = E_ACCESSDENIED (0x80070005) - Access denied
[!] Text        = A session for the machine 'DebServer' is currently open (or being opened or closed)
[!] Component   = Machine, Interface: IMachine, {f95c0793-7737-49a1-85d9-6da81097173b}
[!] Callee      = IVirtualBox, {2d3b9ea7-25f5-4f07-a8e1-7dd7e0dcf667}

echo $?
5

Riadenie behu

Po spustení virtuálneho stroja je možné z príkazového riadku riadiť aj jeho beh. Slúži na to príkaz controlvm, ktorého vybraná syntax vyzerá takto:

VBoxManage controlvm        <uuid>|<meno>
                            pause|resume|reset|poweroff|savestate|
                            acpipowerbutton|acpisleepbutton|
                            keyboardputscancode <hex> [<hex> ...]|
                            setlinkstate<1-4> on|off |
                            usbattach <uuid>|<adresa> |
                            usbdetach <uuid>|<adresa> |
                            setvideomodehint <xres> <yres> <bpp> [display]|
                            setcredentials <meno> <heslo> <doména>
                                           [-allowlocallogon <yes|no>]
                            screenshotpng <súbor [displej]
                            ...
  • pause dočasne pozastaví bežiaci virtuálny stroj,
  • resume spustí predtým pozastavený virtuálny stroj,
  • reset má rovnaký význam, ako keď na skutočnom počítači stlačíte tlačítko Reset, čiže okamžite vykoná studený reštart stroja (stav virtuálneho stroja nie je uložený a môže dôjsť k strate dát),
  • poweroff má zase rovnaký efekt, akoby došlo k strate napájania, či odpojeniu napájacieho kábla (i v tomto prípade môže dôjsť k strate dát) a stav virtuálneho stroja sa zmení na vypnutý,

Pomocou príkazu controlvm možno meniť aj kopu iných veci, ale tie hľadajte v manuáli.

Vytvorenie virtuálneho stroja

Pomocou nástroja príkazového riadku možno virtuálne stroje aj vytvárať. To dosiahnete pomocou príkazu createvm, ktorému možno zadať niekoľko parametrov:

VBoxManage createvm     --name <meno>
              [--register]
              [--basefolder <cesta> | --settingsfile <meno_súboru>]
              [--uuid <uuid>]

Parameter –name je povinný a udáva meno virtuálneho stroja, ostatné sú voliteľné. Parameter –basefolder udáva adresár virtuálneho stroja, –settingsfile udáva meno konfiguračného súboru. Príkaz štandardne iba vytvorí konfiguračný XML súbor, ale nezaregistruje ho vo VirtulBox. Ak to chcete zmeniť, použite parameter -register.

Keď máte konfiguračný XML súbor už vytvorený, môžete takýto virtuálny stroj vo VirtualBox registrovať pomocou príkazu registervm, nasledovaný menom súboru:

VBoxManage registervm    <meno_súboru>

Odstránenie stroja

Niekedy sa zíde virtuálny stroj odstrániť, to možno pomocou príkazu unregistervm, ktorý je určený na zrušenie registrácie konfiguračného súboru, ale ak mu dáme zároveň parameter -delete, bude virtuálny stroj (teda jeho konfiguračný súbor) z disku odstránený:

VBoxManage unregistervm   <uuid>|<meno>
              [--delete]

Úprava stroja

Existujúci virtuálny stroj možno aj upravovať pomocou príkazu modifyvm, ale jeho možnosti sú také rozsiahle, že to vydá na samostatný článok, takže túto možnosť tu spomínam len pre úplnosť.

Virtuálne disky

Trochu práce s virtuálnymi diskami som už spomínal pri riadení behu virtuálneho stroja. Jednalo sa o pripájanie, respektíve odpájanie virtuálnych diskov a obrazov diskiet, či DVD k virtuálnemu stroju počas jeho behu (controlvm). Pomocou nástroja VBoxManage je však možné robiť s diskami aj iné čary.

Vytvorenie disku

Samozrejme, jedná sa o vytvorenie virtuálneho disku, ktorý je reprezentovaný súborom. Na jeho vytvorenie slúži príkaz createhd, ktorého celá syntax vyzerá takto:

VBoxManage createhd         --filename <meno_súboru>
                            --size <MB>|--sizebyte <B>
                            [--format VDI|VMDK|VHD]
                            [--variant Standard,Fixed,Split2G,Stream,ESX]

Povinne musíte zadať meno súboru (--filename) a veľkosť v MB (--size). Pomocou parametra --format si môžete vybrať, v akom formáte má byť disk vytvorený. Voľba --variant umožňuje nastaviť príznaky variantu výstupného súboru. Je to čiarkou oddelený zoznam rôznych príznakov, pričom treba dať pozor, pretože nie všetky kombinácie sú dovolené.

Úprava disku

Na úpravu už raz vytvoreného virtuálneho disku slúži príkaz modifyhd. Pomocou tohoto príkazu môžete zhutniť disk, odstránením blokov, ktoré obsahujú len nuly, zmeniť jeho veľkosť, typ alebo nastaviť či má byť vymazaný pri každom spustení virtuálneho stroja. Kompletná syntax príkazu:

VBoxManage modifyhd         <uuid>|<menu_súboru>
                            [--type normal|writethrough|immutable|shareable|
                                    readonly|multiattach]
                            [--autoreset on|off]
                            [--compact]
                            [--resize <MB>|--resizebyte <B>]

Klonovanie diskov

Predstavte si situáciu, v ktorej potrebujete viacero virtuálnych strojov s rovnakým systémom. Samozrejme, môžete vytvárať a inštalovať jednotlivé stroje samostatne, ale to je strata času. Oveľa efektívnejšie je nainštalovať jeden systém, urobiť v ňom potrebné nastavenia a potom disky naklonovať (ale jeden disk môže používať aj viac systémov). Potom už stačí vytvoriť nové virtuálne stroje a priradiť im existujúce disky. Na to slúži príkaz clonehd, ktorého úplná syntax vyzerá takto:

VBoxManage clonehd     <uuid>|<meno_súboru> <uuid>|<meno_výst_súboru>
                          [--format VDI|VMDK|VHD|RAW|<iný>]
                          [--variant Standard,Fixed,Split2G,Stream,ESX]
                          [--existing]

Musíte mu zadať meno súboru s virtuálnym diskom (alebo jeho UUID) a samozrejme meno výstupného súboru, teda meno súboru s novým diskom. Môžete si nastaviť aký má byť formát výstupného disku (áno, môžete to využiť na konverziu formátov) a jeho varianty. Posledná voľba ( –existing) udáva, že nebude vytvorený nový súbor, ale použije sa existujúci.

Konverzia reálneho disku

Na záver som si pripravil spôsob, ako do virtuálneho stroja dostanete reálny systém. Potrebujete na to obraz disku, ktorý si vytvoríte pomocou príkazu dd, a tento obraz skonvertujete pomocou príkazu convertfromraw. Jeho syntax vyzerá takto:

VBoxManage convertfromraw  <meno_súboru> <meno_výst_súboru>
                            [--format VDI|VMDK|VHD]
                            [--variant Standard,Fixed,Split2G,Stream,ESX]

A to je celé. Len si dajte pozor, pretože nie každý systém zvládne takýto prenos, samozrejme mám na mysli konvertovaný systém, pretože dochádza k zmene hardvéru. Existuje i druhý variant tohoto príkazu, ktorý číta obraz disku zo štandardného vstupu, rozdiel je v tom, že namiesto mena vstupného súboru zadáte stdin.

Extradata

K virtuálnym strojom môžete pridať dodatočné textové (reťazcové) informácie, ktoré môžete využť na rôzne účely, napríklad na nastavenie smerovania portov do virtuálneho stroja. Slúžia na to príkazy setextradata a getextradata, ktorých syntax vyzerá nasledovne:

VBoxManage setextradata   global|<uuid>|<meno>
              <kľúč>
              [<hodnota>]

respektíve:

VBoxManage getextradata   global|<uuid>|<meno>
              <kľúč>|enumerate

Oba príkazy môžete použiť buď na získanie/nastavenie extra dát pre jednotlivý stroj (zadávate meno stroja, či jeho UUID) alebo pre VirtualBox, pomocou voľby global.

Použitie si ukážeme na príklade nastavenia smerovania portov do virtuálneho stroja. K samotnému nastaveniu smerovania portov do NATovaného virtuálneho stroja samozrejme potrebujeme vedieť, na ktorom porte beží služba vo virtuálnom stroji. Povedzme, že chceme vytvoriť prístup z reálneho stroja na virtuálny pomocou ssh. Vieme, že ssh beží nad protokolom TCP a štandardne na porte 22. Ostáva nám už len rozhodnúť sa, ktorý port použijeme na reálnom stroji, povedzme 2222. Potrebujeme dané smerovanie aj nejako pomenovať (aby sa nemiešali až ich bude viac), ja som si zvolil ldapssh. Smerovanie portov dosiahneme postupnosťou príkazov:

VBoxManage setextradata "ldap" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ldapssh/Protocol" TCP
VBoxManage setextradata "ldap" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ldapssh/GuestPort" 22
VBoxManage setextradata "ldap" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ldapssh/HostPort" 2222

Čiže nastavili sme interné parametre pre stroj ldap, ktoré vravia aby VirtualBox presmerova všetky TCP požiadavky na port 2222 na port 22 virtuálneho stroja ldap. Samozrejme podobným spôsobom môžete smerovať aj iné porty. Ak toto smerovanie budete chcieť zrušiť, stačí zopakovať všetky tri príkazy, ale bez hodnoty na konci:

VBoxManage setextradata "ldap" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guesthttp/Protocol"
VBoxManage setextradata "ldap" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guesthttp/GuestPort"
VBoxManage setextradata "ldap" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guesthttp/HostPort"

Ak si takýchto smerovaní nastavíte viac, ľahko v tom stratíte prehľad poslúži príkaz getextradata, ktorý môže byť použitý na vypísanie všetkých nastavených extradát, či už pre VirtualBox samotný:

VBoxManage -nologo getextradata global enumerate
Key: GUI/LicenseAgreed, Value: 1.5
Key: GUI/RegistrationData, Value: triesLeft=0
Key: GUI/Input/HostKey, Value: 65508
Key: GUI/Input/AutoCapture, Value: true
Key: GUI/LanguageID, Value: sk
Key: GUI/LastWindowPostion, Value: 321,210,861,704
Key: GUI/LastVMSelected, Value: {b8518b33-83a0-4522-5b8b-fd9c0a014240}
Key: GUI/SuppressMessages, Value: remindAboutAutoCapture,confirmInputCapture, \
            remindAboutMouseIntegrationOn,remindAboutMouseIntegrationOff,confirmVMReset,confirmGoingFullscreen,confirmReleaseImage

alebo pre daný virtuálny stroj:

VBoxManage -nologo getextradata ldap enumerate
Key: GUI/SaveMountedAtRuntime, Value: yes
Key: GUI/LastWindowPostion, Value: 250,137,1026,822
Key: GUI/Fullscreen, Value: off
Key: GUI/Seamless, Value: off
Key: GUI/AutoresizeGuest, Value: on
Key: VBoxInternal/Devices/pcnet/0/LUN#0/Config/ldapssh/Protocol, Value: TCP
Key: VBoxInternal/Devices/pcnet/0/LUN#0/Config/ldapssh/GuestPort, Value: 22
Key: VBoxInternal/Devices/pcnet/0/LUN#0/Config/ldapssh/HostPort, Value: 2222
Key: GUI/LastCloseAction, Value: powerOff

Samozrejme, je možné nechať si vypísať iba konkrétnu hodnotu, zadaním jej mena do parametra kľúč:

VBoxManage -nologo getextradata ldap VBoxInternal/Devices/pcnet/0/LUN#0/Config/ldapssh/GuestPort
Value: 22

Záver

Čo napísať na záver? Ani zďaleka som nepopísal všetky možnosti a ani to nebolo mojim cieľom. Na začiatku som spomínal, že to myslím motivačne, teda ako motiváciu na ďalšie štúdium. Takže hor sa do študovania, aby ste mohli svoj VirtualBox využiť na plno!

Ďalšie štúdium môžete zamerať na manuál VirtualBoxu, ktorý je možné stiahnuť vo formáte PDF z domovskej stránky prípadne aj na ďalšiu dokumentáciu tamtiež.