Izolace v jádře: PV, HVM a OS-level virtualizace v Linuxu

výklad · linux

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í.

01

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.
02

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, AMD svm).
03

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.
04

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ů.
05

Přehled kontejnerových technologií

Technologie Od roku
chroot 1982
OpenVZ 2005
lxc (lxd) 2008
docker 2013
systemd-nspawn 2010
  • 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.
06

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).

07

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.

← zpět na Objevuj