Izoláció és integráció - Hyper-V mélyrepülés
A napokban írtam egy kisebb cikket a Hyper-V körül használatos fogalmakról és két nap múlva -újraolvasva a cikket- egy csomó további kérdés merült fel, ami megért egy kis utánjárást. A kis házi nyomozómunka eredményét tartalmazza ez az írás.
Nézzük először a kérdéseket, amik felmerültek. (Na, nem tudományosan és didaktikusan felépített sorrendben, hanem ahogy felmerültek...)
- Mekkora is ez az igen vékonyka hypervisor, és pontosan hogyan is kapcsolódik a többi komponenshez?
- Szépen hangzik ez a partíció meghatározás, de valahogy nem elég leíró. Mit is jelent a partíció?
- Milyen komponensek játszanak még a virtualizációban?
- Mitől lesz a Hyper-V sokkal nagyobb durranás, mint volt (/lesz valaha) a Virtual Server 2005?
Kezdjük a legfontosabbal: a hypervisor nem csodafegyver. Valóban kulcsfontosságú komponense a Hyper-V megoldásnak, de korántsem kizárólagos fontosságú. Legalább további két-három hasonlóan fontos elemből áll össze a teljes rendszer, aminek a működését tényleg nem tudom jobb kifejezéssel jellemezni, mint az izoláció és integráció páros. Kik is a további szereplők?
Az első fontos elem kétségkívül a hypervisor, amelyik az elkülönített erőforrásokat biztosítja a virtuális gépek számára. Amikor magunk elé képzeljük ezt az alkotóelemet, ne valami szokásos, gigantikus méretű Microsoft-os varázslatra gondoljunk. A hypervisor attól remek, hogy kicsi. A pontos méretét homály fedi, annyit sikerült megtudni róla, hogy kevesebb, mint 50 kilobájt!! (Csak összehasonlításként: a notebook-om touchpad drivere 500 kB körül van.) A hypervisor nagyjából az átlagos eszközvezérlő méretű: AMD platformon 519KB, Intelen 536 KB. (Köszönet Lepenye Tamás kollégámnak a pontos adatokért.)
Tehát egy zsilettpenge vékonyságú szoftverről van szó, ami képletesen darabokra szabdalja a hardverünket, annak megfelelően, hogy mekkora partíciókat határoztunk meg. És akkor máris itt vagyunk ismét a partíciónál (és annak létrehozásánál, de erről kicsit később). A partíció egy virtuálisan definiált hardver. Adott méretű memória, adott mennyiségű processzor időszelet és virtuális eszközök összessége. Ugye nem nagyon lepődünk meg azon, hogy maga a definíció egy XML állomány? Ezt olvassa/írja szükség szerint a Virtual Machine Management (VMM) szolgáltatás (aminek a front end-je az az MMC, amiből az egész rendszert felügyeljük). A hypervisor a tényleges fizikai hardvert egyfajta erőforrás készletként látja (resource pool), látja mennyi erőforrás szükséges a gazdakörnyezet futtatásához és a maradékot pedig felkínálja a virtuális gépek számára. A VMM egy-egy virtuális gép indításakor beolvassa a hardver definíciót és létrehozza a partíciót a hypervisor-on keresztül, ami az így lefoglalt erőforrásokat kiveszi a szabad erőforrások közül és a virtuális gépnek adja át. A virtuális gép a neki átadott hardver szeletet közvetlenül látja, semmilyen közvetítő szoftvert nem kell igénybe vennie, hogy azokat elérje. (A virtuális operációs rendszer kernele ténylegesen ring 0-án fut, nem pedig valami emulált és szoftveresen átkódolandó szinten).
Persze ehhez, az kell, hogy a hardverünk támogassa a virtualizációt egy speciális -1. szinttel, a hypervisor móddal (az Intel a Vanderpool processzoroktól kezdve, az AMD a Pacifica processzoroktól kezdve adja ezt a funkciót.) (Erről némi olvasnivaló: Rings, Lord of the Ring0)
Feléled tehát lassan a virtuális hardverünk, de még nem üzemképes: nincs meg a koordináció a hardver elemek között, és a virtuális gépnek nincs kapcsolata a gazdagéppel, tehát még felügyelni sem lehet. Itt jön a képbe az ún. Worker process, ami minden virtuális géphez létrejön a gazda operációs rendszeren. Ez a processz kapcsolja össze a virtuális hardver elemeit, mintha egy virtuális alaplapba rakosgatnánk az alkatrészeket. Ezen felül kapcsolatot épít fel a gazda gép és a virtuális gép között, biztosítva hogy a gazdagépről irányítani tudjuk a virtuális gép működését. Megint csak nem érhet bennünket nagy meglepetésként, hogy az irányítás WMI parancsokon keresztül történik. A megjelenítés maga pedig- csodák-csodája- RDP.
A Worker process tartja a kapcsolatot minden szereplővel: figyeli a hardver konfiguráció (tehát a partíció definíció) változását, így ha menetközben átkonfiguráljuk azt, akkor azokat igyekszik érvényre juttatni a hypervisor-on keresztül (így adhatunk például röptében memóriát, további processzort, diszket, hálózati kártyát a virtuális géphez). A "felvilágosult" (enlightened), -tehát hypervisor-t ismerő- virtuális gépek esetén a VMBus-on keresztül hozzáférést biztosít a szintetikus hardver elemekhez - például egy virtuális switch-hez, amivel VLAN-okkal elkülöníthetjük akár az azonos gépen futó virtuális gépeinket is, miközben a hálózat bizonyos szegmensei felé kommunikálhatnak. A gazda gép és a kliensek közötti kommunikációs alagút a VSP-VSC páros (Virtualization Service Provider - Virtualization Service Client), mintegy klasszikus kliens-szerver megoldás esetén.
Szintén a Worker process nyújtja a virtuális eszközöket a virtuális gép számára (az emulált eszközöket is) és koordinálja a fizikai hardver eszközökhöz való hozzáférést a hypervisor-on keresztül (hiszen lehet, hogy több virtuális gép szeretne kommunikálni egy-egy fizikai hardverrel és ekkor ütemezésre van szükség).

Összefoglalva tehát, a Virtual Machine Management tartja a kapcsolatot az összes Worker process-el, lekérdezve a virtuális gépek állapotát, terhelését, egyeztetve konfigurációjukat az ismert partíció definícióval. A Worker process egy virtuális alaplapba fogja össze a hypervisor által átadott memóriát és processzoridőt (akár több processzorét is), valamint a virtuális eszközöket (devices). Az integrációs komponenseken keresztül tartja a kapcsolatot a szintetikus eszközökkel (VMBus) és a többi virtuális géppel (VSP-VSC), valamint feldolgozza a gazdagépről érkező felügyeleti utasításokat (WMI) és leképezi az RDP kapcsolatokat (ezért láthatjuk már a boot-olási folyamatot is RDP-n keresztül, eltérően a fizikai gépektől). A hypervisor számon tartja a hardver erőforrásokat, a partíció definíciók szerint súlyozza az erőforrásokat, miközben gondoskodik elkülönítésükről, illetve ellenőrzi a hozzáférési jogosultságokat.
És mitől lesz más és jobb? Elsősorban a hypervisor tudásától és a hardveresen támogatott virtualizációtól. A Virtual PC és Server az x86 architektúra korlátai miatt sok kényszerű kompromisszumot tartalmaz. A virtuális operációs rendszerek egy köztes futási szinten (Ring1) kénytelenek futni, amit aztán a VMM emulál a hardver felé (ez a paravirtualizáció). Az ár viszont meglehetősen magas, a virtuális gépek teljesítménye lényegesen rosszabb, mint azt az adott hardver indokolná. A processzorokba épített Ring-1 szintű hypervisor-ok, kiegészítve a szoftveres (és a Microsoft esetében mikrokernel-es) hypervisor-ral képesek túllépni ezeken a korlátokon és a hardver valós képességeihez jobban közelítő teljesítményt biztosítani virtuális környezetben is. (Erről kicsit bővebben: Hardware assisted virtualization)