Hlavní navigace

Konfigurace virtualizace v libvirt

22. 6. 2009
Doba čtení: 9 minut

Sdílet

V pokračování článku o virtualizaci v Ubuntu si blíže rozebereme jeden z nástrojů, který jsme použili, a to libvirt. Podíváme se na konfigurační soubor, který ubuntu-vm-builder vygeneroval, a řekneme si, jak upravit některé parametry a jak do něj přidat disk, síťovou kartu nebo USB zařízení.

Minulý článek o virtualizaci byl zaměřen převážně na Ubuntu a jeho nástroj ubuntu-vm-builder. Jak jsme si řekli, pomocí něj se dá velmi jednoduše a rychle vytvořit obraz systému. Když máme obraz, asi na něj nebudeme chtít jen koukat a ukázali jsme si také, jak obraz uvedeme do chodu. Také jsme si nastavili síť do bridge a náš virtuální systém nasával IP adresy, jako kdyby byl fyzický. Operace s vygenerovaným systémem jsme prováděli pomocí libvirt a v tom dnes budeme pokračovat.

K čemu libvirt slouží

Libvirt ke to knihovna, která pokládá jednu ovládací vrstvu snad nad všechny dnes používané virtualizační technologie. Některé znáte určitě dobře. Jejich seznam vypadá takto:

  • Xen
  • QEMU
  • LXC
  • Test
  • OpenVZ
  • VirtualBox

Libvirt je určen k virtualizaci na serverech, takže QEMU resp. KVM a Xen budou pravděpodobně nejpoužívanější volbou. V minulém a tomto článku se pro jednoduchost zabývám pouze Qemu/KVM.

Pokud se má administrátor rozhodnout, jestli je pro něj libvirt užitečný či zbytečný, musí vědět, co s ním dokáže a jak toho dokáže. Jelikož se libvirt snaží být rozhraním pro všechny, tak zde nemůžeme naplno čerpat z výhod jednotlivých implementací virtualizace. Je to daň za jednoduchost. Libvirt nabídne administrátorovi nástroje, pomocí kterých může bez práce spravovat virtuální stroje. Může se k nim připojovat přes konsoly, přes VNC, přes síť nebo jim jen může změnit množství přidělených prostředků. K tomu slouží nástroj virsh, který se umí připojit i na vzdálené stroje a dokáže k tomu využít i SSH.

Obecně o konfiguraci

Tady se dostáváme k té slabší stránce libvirt. Určitě znáte diskuse na téma XML vs. klasické textové konfigurační soubory. XML se velmi dobře čte strojům, ale člověk už z toho tak nejásá. Libvirt má konfigurační soubory psané pomocí XML a to ještě dost rozvětvené.

Všechno s čím budeme pracovat je uloženo v /etc/libvirt/. Pohledem do tohoto adresáře zjistíte, že libvirt se za knihovnu na svých stránkách vydává, ale jinak běží jako klasický daemon a hlídá, co mu administrátor dá pod ruku. Konfigurace libvirtd je jednoduchá a jediné co v ní můžeme ovlivnit je způsob a omezení připojení. Jak jsem naznačil výše, k daemonu se připojuje pomocí virsh. Další konfigurační soubor, který tam najdeme se jmenuje qemu.conf a slouží pro nastavení parametrů qemu, konkrétně VNC serveru.

Dále už to začíná být zajímavější a dostáváme se ke skutečnému jádru pudla. Zatímco konfigurační soubory zmíněné o odstavec výše byly klasické textové, od teď nás čekají už jen XML. Pokud máte ještě systém ponechaný ve stavu z minulého článku, najdete v /etc/libvirt adresář qemu a v něm XML soubory s definicí hostovaných operačních systémů. XML soubory obsahují vše, co se dá třeba ve VirtualBoxu naklikat. Bohužel u XML není administrátor veden za ručičku, a tak se s případnými problémy musí vypořádat sám. Dnes si tedy ukážeme, jak k vytvořenému systému přidat disk, jak vytvořit další síťové rozhraní a jak ovlivnit některé další parametry.

Konfigurace

Abychom pochopili libvirt, musíme si ujasnit tři pojmy:

  • Node
  • Hypervizor
  • Doména

Pokud si pamatujete z minulého článku vytváření obrazu systému, vyplňovali jsme tam parametr hypervizor. V libvirt a i v ubuntu-vm-builder je hypervizorem myšlena virtualizační technologie. V našem případě se bude jednat o KVM. Node je v překladu uzel. V tomto případě jde o fyzický stroj, na kterém je libvirt, nějaká distribuce a ta hostuje ostatní systémy. Název node byl zvolen proto, protože libvirt podporuje migraci systémů mezi nody. Pokud vás už přestane bavit spouštět si server na jednom stroji, můžete ho přesunout jinam, ale v praxi půjde o vážnější důvody k provedení podobného kroku. Ubuntu také pomalu směřuje k virtualizaci známé pod pojmem „cloude server“ a tam je migrace více než potřeba. Poslední pojem je doména. To není nic jiného než jeden hostovaný systém. Na jednom nodu může být více domén a ty mohou využívat různé hypervizory.

My si dnes ukážeme převážně konfiguraci v souboru s doménou. Libvirt umožňuje i vytvoření samostatných sítí či disků, které se pak dynamicky připojují do stojících i běžících systémů. Bohužel tuhle vlastnost s hypervizorem KVM libvirt nepodporuje.

Doména

S konfiguračním souborem domény si vystačíme, pokud nebudeme žádat žádné dynamické chování, jako třeba přidávání disků a síťových rozhraní za chodu systému. Ve většině případů to není nějak rozhodující. Konfigurační soubor by se dal pomyslně rozdělit na dvě části. V první se nastaví parametry samotného virtuálního serveru a v druhé se nastaví zařízení k serveru připojené, jako jsou disky a síťové karty, případně přístup ke stroji z vnějšku.

Obecná část

Každý konfigurační soubor domény má na začátku:

<domain type='kvm'> 

a na konci samozřejmě odpovídající ukončovací tag. Parametr type říká libvirtu, co má použít za virtualizační technologii.

Dále se podíváme na doménu z minulého článku:

<name>ubuntu1</name>
<uuid>ff0a994e-d83c-345a-eaa7-6e6ddd24cf55</uuid>
<memory>1048576</memory>
<currentMemory>1048576</currentMemory>
<vcpu>2</vcpu>A 

První řádek je jasný. Druhý řádek obsahuje tzv. UUID a to slouží k jednoznačné identifikaci virtuálního stroje. Pokud ho vynecháme, bude nám vygenerováno náhodně. Třetí a čtvrtý řádek mluví o paměti. Pokud nechceme dynamicky měnit množství paměti, tak parametry memory a currentMemory nastavíme na stejné hodnoty nebo currentMemory rovnou vynecháme. Tag vcpu přidělí stroji námi definovaný počet CPU.

<os>
    <type arch='x86_64' machine='pc'>hvm</type>
    <boot dev='hd'/>
</os> 

Tímhle říkáme, že virtualizovaný systém je 64 bitový, používá plnou virtualizaci a bude bootovat z disku. Další možnosti pro volbu boot jsou fd, cdrom a network. Tedy disketová mechanika, CD-ROM mechanika a síť.

<features>
    <acpi/>
</features> 

Do vlastností systému můžeme zadat <pae/>, <acpi/> a <apic/> podle potřeby. Většinou si s tímto výchozím vystačíme.

<clock offset='utc'/> 

Nastavení času na UTC.

<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash> 

Těmito třemi volbami určíme, jak se bude chovat virtuální stroj při požadavku na vypnutí, restart nebo když se s ním něco stane. Do všech třech voleb můžeme dát:

  • destroy – Kompletní vypnutí virtuálního stroje a uvolnění prostředků
  • restart – Klasický reboot
  • preserve – Systém bude vypnut, ale prostředky zůstanou pro další analýzu
  • rename-restart – Restart systému s novým jménem

Přejdeme teď ke druhé části, kde si nastavíme rozhraní pro přístup do sítě a diskové jednotky.

Zařízení

Veškerá zařízení se umísťují do tagů <devices></de­vices>. Rozebereme si sekci devices opět z minulého článku.

<emulator>/usr/bin/kvm</emulator> 

Nejdříve musíme říci, co se bude starat o emulaci zařízení. V tomto případě je to kvm.

<disk type='file' device='disk'>
    <source file='/mnt/disk/virttest/ubuntu-kvm/disk0.qcow2'/>
    <target dev='hda' bus='ide'/>
</disk> 

Pomocí tagu disk můžeme nastavit kromě samotných virtuálních disků také virtuální disketové a CD-ROM mechaniky. Kromě zařízení, které vytváříme, musíme určit typ zařízení, ze kterého budeme vycházet. V tomto případě to je file, ale můžeme použít i block. V tom případě bychom dali do atributu source tagu cestu k blokovému zařízení. Tag target je nastavení pro virtuální stroj a říká, jak se bude zařízení připojovat do virtuálního systému. V tomto případě se jedná o zařízení s názvem hda na sběrnici ide. Kromě ide můžeme použít ještě scsi, virtio, xen a usb. Pokud parametr bus se sběrnici vynecháme, pokusí se ho libvirt získat z parametru dev. Takže hda bude ide a sda zase scsi.

<interface type='bridge'>
    <source bridge='br0'/>
    <model type='virtio'/>
</interface> 

Síť je pro virtuální stroj skoro stejně důležitá jako disková zařízení. My jsme si minule ukázali, jak nastavit síť tak, aby se virtuální systém stal součástí bridge a všechny IP adresy virtuálních strojů si byly rovny. Problém je většinou takový, že od poskytovatele dostaneme jednotky IP adres a ne celé rozsahy, které bychom mohli naroutovat do vnitřních rozhraní. To se třeba zlomí s IPv6, ale prozatím musíme využívat bridge pro síťové karty virtuální systémů i toho fyzického. V nastavení stačí říct, že interface je typu bridge, stane se součástí br0 a v systému se objeví jako virtio zařízení. Tím dosáhneme i potřebného výkonu.

Ještě než se podíváme na možnosti komunikace s virtuálním systémem, ukážeme si, jak do něj připojit USB zařízení.

<hostdev mode='subsystem' type='usb'>
    <source>
        <vendor id='#####'/>
        <product id='#####'/>
    </source>
</hostdev> 

Prakticky k tomu potřebujeme jen výpis z lsusb, který v mém případě vypadá takto:

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 024: ID 04f3:0210 Elan Microelectronics Corp. AM-400 Hama Optical Mouse
Bus 002 Device 023: ID 147a:e02d Formosa Industrial Computing, Inc.
Bus 002 Device 022: ID 099a:610c Zippy Technology Corp. EL-610 Super Mini Electron luminescent Keyboard
Bus 002 Device 004: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub 

Druhý řádek odspodu patří bluetooth zařízení. Podpora bluetooth se ve virtuálním stroji může hodit z různých důvodů. Abychom tam zařízení připojili, použijeme k tomu identifikátor výrobce a zařízení. V případě mého bluetoothu to je 0a12:0001. Číslo před dvojtečkou je vendor a číslo za je product. Když je doplníme do části konfiguračního souboru výše, bude toto zařízení k dispozici v našem virtuálním systému.

Vstup a výstup

Sekce konfiguračního souboru pro vstupní a výstupní zařízení patří také mezi tagy <devices></de­vices>.

Myš

Libvirt je určen spíše pro serverová řešení než desktopová, takže sice podporu pro myš má, ale pravděpodobně bude zbytečná. Pokud se pro ni rozhodnete, můžete si vybrat mezi usb a ps2 variantou.

<input type='mouse' bus='ps2'/>

<input type='mouse' bus='usb'/> 

VNC

O VNC jsme přes pár měsíci psali článek. V něm bylo řečeno, že to je sice dobrý nástroj na lokální síti ale jeho odezvy nejsou nějak slavné. Pokud ho z nějakého důvodu potřebujeme, ať už to je nastavení nějaké grafické aplikace  nebo jen zvyk administrátora, uděláme to tagem <graphics/>. 

UX DAy - tip 2

<graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1'/> 

Tento řádek spustí VNC server k němuž si vygeneruje port a server poslouchá na lokálním loopbacku.

Závěr

Dnes byl článek spíše teoretický a vysvětlující. Příště se podíváme na spolupráci libvirt s dalšími hypervizory a ukážeme si, co všechno umí virsh. Také si blíže rozebereme vytváření síťových zařízení.

Byl pro vás článek přínosný?

Autor článku

Adam Štrauch je redaktorem serveru Root.cz a svobodný software nasazuje jak na desktopech tak i na routerech a serverech. Ve svém volném čase se stará o komunitní síť, ve které je již přes 100 členů.