Izolace prostředků v Linuxu má tři odlišné podoby: paravirtualizaci, plnou hardwarovou virtualizaci a virtualizaci na úrovni operačního systému (kontejnery). Každá staví na jiném principu a hodí se na jiné použití.
Paravirtualizace (PV)
Paravirtualizace nepoužívá kernelový modul, ale hypervizor Xen; hosty spravuje privilegovaná doména 0 (dom0), která běží nad ním. Hostovaný operační systém musí vědět, že je paravirtualizovaný (jádro 3.0+), a hypervizor mu poskytuje ABI, přes které ho volá.
Vlastnosti:
- prakticky žádná ztráta výkonu – přímý přístup ke zdrojům;
- rychlejší start – jádro lze nabootovat přímo, bez bootloaderu;
- hosté používají vlastní jádro;
- izolaci nad podkladovým OS mohou navíc zajistit procesy zabezpečené přes AppArmor nebo SELinux.
Hardwarově asistovaná virtualizace (HVM)
Typickým příkladem je KVM nebo Xen v režimu HVM. Hosté jsou přes hypervizor zcela izolovaní; instrukce, které nejdou přímo virtualizovat, procesor díky hardwarové podpoře (Intel VT-x, AMD-V) odchytí a předá hypervizoru. Binární translaci potřebovala virtualizace x86 před příchodem této podpory.
Vlastnosti:
- host má vlastní bootloader;
- host má vlastní jádro;
- operační systém hosta se nemusí nijak upravovat;
- všechny zdroje se řeší nepřímo, přes emulaci;
- dnes lze v podporovaném OS (jádro 2.6.32+) použít PVHVM – kombinaci obou přístupů;
- vyžaduje CPU příznaky pro virtualizaci (Intel
vmx, AMDsvm).
Virtualizace na úrovni operačního systému (kontejnery)
Kontejnery si lze představit jako knihu na poličce: kniha má víc kapitol, každá vypráví jiný „příběh“, ale všechny patří ke stejnému výtisku. Někdy se kontejnerům říká „jail na steroidech“.
- přidávají další vrstvu zabezpečení tím, že izolují zdroje na úrovni OS;
- dají se kombinovat s AppArmor nebo SELinux pro ještě silnější zabezpečení;
- řeší problémy se sdílenými knihovnami ve více verzích a pomáhají udržet systém čistý;
- jdou snadno zničit a znovu vytvořit;
- sdílejí jádro s hostitelským systémem.
Rozdíly mezi virtuálními stroji a kontejnery
Virtuální stroje:
- obecně „těžší“ na nastavení a start;
- start OS trvá až minuty (podle toho, jde-li o PV nebo HVM);
- izolace na úrovni hardwaru díky hypervizoru (HVM, PV, PVHVM);
- virtuální stroj reprezentuje proces Qemu, se zapojeným úložištěm na pozadí.
Kontejnery:
- lehké – řádově jednotky až stovky MiB;
- mohou být zaměřené na jedinou aplikaci;
- izolace na úrovni OS přes strom procesů.
Přehled kontejnerových technologií
- chroot – jen částečná izolace souborového systému, vnořená virtualizace.
- OpenVZ – izolace souborového systému, diskové kvóty, omezení I/O, paměti i CPU, síťová izolace, částečná vnořená virtualizace, živá migrace, izolace rootu.
- lxc/lxd – izolace souborového systému, částečné diskové kvóty (lvm/btrfs), částečné omezení I/O (btrfs), omezení paměti i CPU, síťová izolace, částečná vnořená virtualizace, izolace rootu.
- docker – izolace souborového systému, omezení I/O (od verze 1.10), omezení paměti i CPU, síťová izolace, částečná vnořená virtualizace, izolace rootu (od verze 1.10).
- systemd-nspawn – izolace souborového systému, diskové kvóty, částečné omezení I/O (systemd + cgroups), omezení paměti i CPU (systemd + cgroups), síťová izolace, vnořená virtualizace, izolace rootu.
Co kontejnery používají k izolaci zdrojů
Jmenné prostory (namespaces):
- PID – identifikátory procesů, kontejner má vlastní strom s PID 1;
- UTS – jméno hostitele a domény;
- MNT – přístup k souborovému systému a jeho struktura;
- IPC – komunikace procesů přes sdílenou paměť;
- NET – síťový přístup a struktura;
- USER – identifikátory uživatelů a skupin; root v kontejneru nemusí být rootem na hostiteli.
Vedle jmenných prostorů drží kontejnery pod kontrolou i cgroups, které chrání zdroje (využití CPU, paměti, I/O).
Kdy zvolit kontejnery a kdy virtuální stroje
Kontejnery se hodí na:
- testování nové aplikace (ze zdrojových kódů nebo z internetu);
- rychlé nasazení – kontejner jako „iso“ šablona pro aplikaci nebo celý cyklus.
Virtuální stroje se hodí tam, kde je potřeba:
- širší izolace – přístup ke zdrojům je filtrovaný nebo emulovaný (HVM), nebo jde přes API a ovladače (PV);
- oddělené „sandboxy“ pro zákazníky.
Vychází z přednášky „(Kernel) Isolation – PV, HVM, OS-level virtualization in Linux“ (LinuxDays 2017), slidy, video.