Určitě jste již slyšeli buzzword posledních měsíců: virtualizace, virtuální stroj, virtual appliances… Pojďme si jednotlivé termíny definovat a představíme si jeden z virtuálních strojů: XEN.
Na začátek musím předeslat, že jsem se snažil o maximální jednoduchost a někdy jsem se nevyhnul definici v kruhu. Pokud něčemu nebudete zkraje rozumět, prostě čtěte dál. Pokud vás něco bude zajímat více, využijte externích odkazů v článku. Některé věci jsem musel značně zjednodušit, aby se z toho nestala nudná mnohostránková kniha.
Virtualizace je proces, kdy v jednom operačním systému (OS) spustíte pomocí virtualizačního systému jiný OS. Výhodou je, že systémy jsou od sebe odděleny a ani oprávnění roota na jednom počítači vám nepomůže k přístupu do druhého systému.
Virtualizační systém je program, který vám zprostředkovává vlastní virtualizaci. Já budu psát především o open source programu XEN, existují však i další. Nejznámější je komerční VMware, ale známe i KVM, Qemu a další. Např. na KVM je nejzajímavější, že je vyvíjen přímo kernel komunitou a jeho vývoj jde hodně dopředu.
Při virtualizaci se budete dokola setkávat se několika základními termíny: hypervisor, hostitel, host, kruhy a domény. Zkusme si je vyjasnit:
Ve virtualizaci je několik kruhů (angl. rings) ochrany. Hypervisor běží v kruhu 0 (nejzákladnější), kernely OS běží v kruhu 1 a běžné aplikace běží v kruhu 3. Kruh 2 se prakticky nepoužívá.
Hypervisor je věc, která je nahrána ještě dříve než jádro systému. (U KVM je hypervisor přímo součástí kernelu dom-0 jako modul). Jediné, co hypervisor umí, je obhospodařování paměti a obsluha I/O operací, které zprostředkovává hostům. Při bootu je hypervisor nahrán do kruhu 0 a nahraje patchovaný OS se XENem do kruhu 1. Ten je nazván jako dom-0 (doména 0).
Dom-0 se též nazývá hostitel (angl. host) a můžete z něj spouštět další domény, zavírat je, migrovat nebo jim nastavovat parametry. Další domény, které z hostitele spustíte, se označují jako domény U (dom-U) a jádra jejich OS běží taktéž v kruhu 1, stejně jako jádro hostitele.
Host (angl. guest) je každý další operační systém, který se nahraje pomocí virtualizačního systému. Povšimněte si, že český host a anglický host označují dvě odlišné věci!
Pokud nemáte moderní procesor, který podporuje virtualizační rozšíření (Vanderpool v případě Intelu nebo Pacifica v případě AMD), budete muset provozovat paravirtualizaci. V takovém případě musíte mít na dom0 a dom-U systému (host i hostitel) modifikované jádro. V případě XENu zakompilovanou podporu, v případě VMware zavedené jejich ovladače. Jak uvidíte později, paravirtualizace není nic špatného a je nakonec i pohodlnější.
Paravirtualizace znamená, že se některá operace (alokace paměti, IO operace) neprovádí přímo, ale požadavky jsou předávány z kernelu v dom-U do kernelu dom-0 (jedině dom-0 má přístup k HW). Zjednodušeně si lze paravirtualizaci představit jako jednoduchý kód, který předá požadavek na manipulaci s HW dále do dom-0 a sám s HW nedělá. Paravirtualize tedy předpokládá upravené jádro jak hosta, tak hostitele. V případě Linuxu to není žádný problém, protože zdrojové kódy jádra jsou k dispozici. Plná virtualizace nepředpokládá modifikované jádro hosta (guesta) a jeho spolupráci, a proto musí HW emulovat pomocí částí kódu z Qemu. Proto je v současné době paravirtualizace rychlejší než plná virtualizace. Bez plné virtualizace se neobejdete s uzavřenými OS – ty v paravirtualizací nerozjedete.
Jestliže váš procesor podporuje virtualizační rozšíření, můžete v dom-U systému provozovat systém bez nutnosti modifikovat jádro.
Jak poznáte zda váš procesor podporuje virtualizační rozšíření? V příkazové řádce spusťte tento příkaz:
# cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 15 model name : Intel(R) Core(TM)2 CPU 6300 @ 1.86GHz ... wp : yes flags : fpu tsc msr pae mce cx8 apic mtrr mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 cx16 xtpr lahf_lm bogomips : 4653.30
Příznak VMX znamená, že CPU umí plnou virtualizaci (Intel ji nazývá Vanderpool), pokud ji nemáte, tak se musíte spokojit s paravirtualizací. V případě AMD dostanete jiný výstup:
$ cat /proc/cpuinfo processor : 0 vendor_id : AuthenticAMD cpu family : 15 model : 75 model name : AMD Athlon(tm) 64 X2 Dual Core Processor 3600+ ... flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm cr8_legacy bogomips : 4024.72
U AMD se stejná technologie nazývá Pacifica a její příznak v cpuinfo objevíte jako SVM.
Nutno poznamenat, že samotný CPU nestačí. Virtualizaci musí podporovat i BIOS a chipset. Ale v podstatě platí, že pokud jste si CPU a desku koupili dohromady a CPU podporuje plnou virtualizaci, pak s deskou nebudou také problémy.
Pokud vás téma zaujalo a chcete vědět více, tak můžete pokračovat hlubším článkem o XENu a zde najdete hezký graf architektury XENu.
Příště se podíváme, jak si v praxi vytvořit guesta, ale ještě dnes se podíváme na několik otázek, které v diskuzi určitě padnou.
- Jak moc jsou virtuální stroje pomalejší oproti běžnému systému?
- Pokles je asi o 3 % procenta. Ale např. přenos dat po síti mezi dvěma guesty na stejném hostu je výrazně rychlejší než mezi dvěma fyzickými systémy, protože nejste omezováni rychlostí/pomalostí fyzické vrstvy.
- Proč vlastně mám chtít spouštět virtualní systémy? Proč to neudělat na fyzickém novém počítači?
- Uvedeme si několik scénářů, kdy se vám virtuální systém může hodit.
- Webhoster – zákazník by rád root přístup ke stroji, ale vy mu ho nechcete dát, protože na stejném počítači máte data dalších klientů. Řešení – vytvoříte nového hosta, zprovozníte tam služby, které zákazník vyžaduje a dáte přístup klientovi k tomuto questu. Pokud něco zkazí, tak se to neprojeví u jiných klientů.
- Vývojář – kolikrát jste si chtěli něco vyzkoušet a jenom vám chyběl další počítač (nebo více)? S pomocí virtualizace si můžete v 1GB paměti vytvořit 5 virtuálních počítačů (nebo i více). Navíc pokud se některý guest „kousne“ vaším přičiněním nebo nenabootuje, tak ho můžete jednoduše zrušit a vytvořit si nový. Na skutečném počítači by nastoupilo RescueCD a měli byste zbytečně těžkou hlavu.
- Nebo chcete zkusit nové či staré programy a nechcete si ničit vaše stabilní prostředí. Vytvoříte si guesta, v něm vyzkoušíte program a pak questa zase zrušíte. Vaše programy a prostředí zůstanou netknuty.
- Virtuální servery – spuštíte nějakou službu a nevíte, jak silný počítač budete potřebovat. Nainstalujte vše do guesta a můžete kdykoliv migrovat na jiný fyzický stroj s řádově sekundovými výpadky. Zpočátku může být guest na sdíleném počítači, později na vlastním, až nakonec skončíte na mnohaprocesorovém serveru.
Na závěr bych rád poděkoval Karlu Žákovi za věcnou kritiku tohoto textu.