Virtualizace se používá z mnoha různých důvodů, například:
Celá hardwarová platforma, na které běží virtualizovaný systém
se softwarově emuluje. Výhodou je možnost emulace nedostupného HW,
např. jiných architektur, nevýhodou velmi nízký výkon.
Příklad: QEMU (bez modulů jako KVM-Qemu nebo KQEMU)
Paravirtualizací se rozumí technika virtualizace, kdy se prostředí pro virtualizovaný stroj neemuluje plně, ale předává se abstrakce reálného prostředí. Předpokládá se spolupráce virtualizovaného stroje, podmínkou pro paravirtualizaci je tedy upravený kód jak guesta tak hosta.
Výhodou paravirtualizace je vysoký výkon - to je dáno skutečností, že se skutečný a virtuální HW tolik neliší. Nevýhodou je nemožnost virtualizovat úplně odlišný hardware (například jinou architekturu procesoru) a skutečnost, že je třeba upravit kód virtualizovaného systému, to znemožňuje paravirtualizovat systémy, k jejichž zdrojovým kódům nemáme přístup.
Plná virtualizace vyžaduje podporu ze strany HW. Instrukce se liší u AMD i u Intelu, proto i virtualizační nástroje, které je využívají, mají oddělený kód pro tyto architektury. U procesorů Intel bývá tato technologie nazývána Vanderpool, její přítomnost indikuje příznak vmx, u AMD se nazývá Pacifica, příznak svm.
Výhodou je, že není třeba žádné modifikace virtualizovaného OS. Nevýhodou je nutnost emulovat kompletní hardware virtualizovaného stroje a tedy o něco nižší výkon oproti paravirtualizaci.
Příklady: KVM, XenUser Mode Linux (UML) je virtualizační techika, při které guest OS běží jako uživatelský proces na host OS. Plánování virtualizovaných strojů nebo přidělování paměti se tedy řídí stejnými pravidly, jaké platí pro ostatní procesy v systému. Použitím UML může být např. vývoj jádra nebo jaderných modulů - protože kernel host OS je pouze běžný proces, je možné použít user-space ladící nástroje, jako například gdb. Pro provoz guest systémů není třeba modifikovat jádro host OS. Proces virtualizovaného jádra nemá žádný přístup k fyzickému HW, např. disky jsou řešeny pouze jako soubory na disku host OS.
UML je od verze 2.6 součástí jádra, k sestavení UML kernelu nejsou
tedy třeba žádné patche apod. Na úrovní zdrojových kódů kernelu je
UML vedeno jako další architektura, proces sestavení jádra je stejný
jako u nativního, pouze je třeba cross-kompilovat pro architekturu UM:
$ make defconfig ARCH=um # výchozí konfigurace pro UML jádra
$ make menuconfig ARCH=um # přizpůsobení konfigurace
$ make ARCH=um # kompilace jádra pro architekturu um
$ ./vmlinux ubd0=cesta/k/disku umid="název stroje" # spuštění stroje
Ke správě guest OS je kromě nástrojů pro správu procesů možné použít speciální management konzoli - uml_mconsole, pomocí které je možné např. připojovat se na konzoli virtuálních strojů, guest OS pozastavit, restartovat, zastavit,.. Je také možné připojit souborový systém z host OS, pomocí speciálního souborového systému hostfs
Xen je Open-Source hypervisor, vyvíjený převážně firmou XenSource (nyní Citrix). Architekturu celého systému ilustruje obrázek.
+------+ +----+ +----+ | App | |App | |App | +------+ +----+ +----+ +------+ +----+ +----+ | | | | | | | Dom0 | |DomU| |DomU| | | | | | | +------+ +----+ +----+ +----------------------+ | Xen Hypervisor | +----------------------+ +------------------------------+ | Hardware | +------------------------------+Nad samotným hardwarem běží tzv. hypervisor, který se stará o přidělování prostředků. Nad hypervisorem běží virtualizované systémy (nazývané domény), jedna z domén bývá privilegovaná (Domain-0, má přímý přístup k fyzickému HW), ostatní představují virtualizované stroje (Domain-U). Správa guest OS probíhá z Dom-0 prostřednictvím démona xend a nástroje xm. Ty komunikují s hypervisorem pomocí specializovaných volání nazývaných hypercall (asi jako userspace komunikuje s jádrem pomocí syscall)
Xen umožňuje provoz guest OS jak s využitím paravirtualizace (Linux, BSD, OpenSolaris, Windows - nepodporované) tak i plné virtualizace, kdy emuluje HW zařízení pomocí Qemu. Xen nabízí slušný výkon, benchmarky uvádějí při použití paravirtualizace ztrátu výkonu 2-3%. Jako disk je možné použít buď přímo oddíl na disku nebo jen soubor (viz. parametr disk v dokumentaci), spojení s virtualizovaným systémem je možné buď pomocí xm console (pouze text) nebo VNC (i graficky, tj. i runlevel 5).
Nevýhodou Xenu je, že jeho kód nebyl začleněn do jádra Linuxu, verze, kterou vyvinul XenSource pro svůj samostatný produkt je založena na jádře 2.6.18, distributoři, kteří chtějí používat nová jádra jsou nuceni kód sami forward-portovat. Kód hypervisoru je navíc poměrně komplikovaný (obsahuje např. vlastní power management), což stěžuje jeho zařazení,
KVM je virtualizační řešení původně vyvinuté firmou Qumranet (dnes Red Hat). Poskytuje pouze plnou virtualizaci, takže ke svému běhu potřebuje odpovídající HW. Je integrováno přímo do jádra Linuxu - tomuto byl od začátku podřízen vývoj i na úkor výkonu. Výhodou oproti Xenu je jednoduchost řešení a neexistence samostatného hypervisoru, jako hypervisor se používá kernel Linuxu.
KVM je implementováno jako jaderný modul, kvůli odlišnostem v instrukčních sadách AMD a Intelu existují dva moduly - kvm-amd.ko a kvm-intel.ko. Ty pak poskytují zařízení /dev/kvm, se kterým je možné komunikovat pomocí ioctl volání - těmito se virtuální stroje vytvářejí, ovládají, .. Pro emulaci zařízení v guest OS KVM používá Qemu.
+-----+ +-----------+ | App | | App | +-----+ +-----------+ +-----+ +-----------+ | | | GuestOS | | | +-----------+ | | | Qemu | | | +-----------+ | +------------------------+ | Linux+KVM | +------------------------------+ +------------------------------+ | Hardware | +------------------------------+
Pomocí utility xenner je možné používat paravirtualizované guest OS vytvořené pro běh pod Xenem pomocí KVM.
Každá z uvedených virtualizačních technik má svůj vlastní soubor nástrojů pro správu, nabízí jiné API a jiné funkce. Je proto poměrně těžké napsat sadu skriptů, pomocí kterých by se daly ovládat různé virtualizační technologie nebo front-end, který by byl přenositelný mezi jednotlivými virtualizačními backendy. Tyto problémy se snaží řešit projekt libvirt, který poskytuje rozhraní pro různé virtualizační technologie: