Nested virtualization

(bajban vagyok a cím magyarításával, talán az “egymásba ágyazott virtuális gépek” lehetne egy közelítő megoldás:)

Készülve az őszi Virtualizációs technológiák kurzusra kezdtem olvasgatni pár időközben megjelent cikket. Tavaly decemberben volt az ACM Operating Systems Review folyóiratban egy VMware különszám, amiben mindenféle érdekes technikai részletet leírtak.

Az “The evolution of an x86 virtual machine monitor” [SIGOPS Oper. Syst. Rev. 44, 4 (December 2010), 3-18., DOI: 10.1145/1899928.1899930] cikk egy nagyon jó kis áttekintés, hogy hogyan fejlődött a VMware hypervisora (bináris átírás kezdetben, vSMP támogatás, 64 bit támogatás, hardveres virtualizáció támogatása…). A végén van egy érdekes rész arról, hogy hogyan lehet egy virtuális gépen belül további virtuális gépeket futtatni. Azt az ágat még el lehet képzelni, amikor egy hardveres támogatással (AMD-V vagy Intel VT-x) dolgozó VMM (VMM0) futtat egy virtuális gépet (VM1), és azon belül futtatunk egy VMM-et (VMM1), ami bináris átírással futtat egy belső virtuális gépet (VM2). Hisz ilyenkor a VMM0 fut root mode-ban, a VMM1 meg non-root mode-ben és ring0-n, a VM2 kernelje és felhasználó módú programjai pedig non-root mode-ban és ring3-n- A VMM1 egyébként is ilyen üzemmódban futna, tehát működhet a dolog. Viszont a cikk említi azt az esetet, amikor a VM1 felé is mutatjuk a CPU virtualizációs kiegészítéseit, és elvileg az is ki tudná azt használni, tehát onnan is lehetne root/non-root mód között váltani. Hogy is van ez?:-)

Kicsit utána olvasva elég dinamikusan fejlődik ez a terület az egyes virtualizációs megoldásokban, az elmúlt pár évben elég sokat változott a helyzet.

  • Nesting Virtual Machines in Virtualization Test Frameworks: Olivier Berghmans diplomadolgozata, Ő főleg desktop megoldásokat vizsgál, de ott szépen végigpróbált mindenféle kombinációt, erről vannak jó áttekintő táblázatok. Mellesleg elég jó a bevezető része is a virtualizációról. 2010-es,  azóta volt már pár változás.
  • KVM esetén 2008-ban jelentették be a nested AMD SVM (az AMD-V régi kódneve) támogatást, az be is került, azóta van NPT nesting támogatás is, az Intel VT-x támogatás talán még mindig fejlesztés alatt.
  • Xen esetén 2010-ben kezdtek el jönni patchek a nested virtualization támogatásra, itt is először az AMD SVM-hez. Itt nem találtam frissebbet, hogy mi a helyzet.
  • A VMware esetén ez a közösségi oldal foglal össze pár dolgot (Running Nested VMs). Az ESXi 5 újdonsága, hogy tudja a vendég is használni a hardveres virtualizációt, tehát pl. lehet vendég ESXi vagy Hyper-V hypervisorral 64 bites beágyazott vendég VM-et futtatni (How to Enable Support for Nested 64bit & Hyper-V VMs in vSphere 5).

A tényleges megvalósításról keveset írnak (KVM és Xen esetén ott van nyilván a patch forrása, de azért abból megérteni:), Xen esetén van valami áttekintő doksi, de az meg esélyes lehetne a “hogyan ne írjunk dokumentációt” versenyben dobogós helyezésre;)

Ami viszont hasznos és érthető, az a következő cikk:

Muli Ben-Yehuda et al. 2010. The turtles project: design and implementation of nested virtualization. In Proceedings of the 9th USENIX conference on Operating systems design and implementation (OSDI’10). USENIX Association, Berkeley, CA, USA, 1-6.

Itt egy KVM-es megvalósítást írnak le részletesen, amiben a vendégek felé Intel VMX-t (a VT-x korábbi kódneve) emulálnak. Mivel a hardverben csak két kapcsolódó privilégiumszint van (root és non-root mód), ezért a megoldás lényege, hogy a legalsó VMM (a VMM0 nevű a bejegyzés elején lévő példában, L0 hypervisor a cikkben) fut root módban, és ő kezel le minden trap-et, és majd eldönti, hogy kinek kell továbbítania azokat. A következő ábra szemlélteti a módszert (forrás: a fenti cikk):

Nested virtualization in the Turtles project

Ha az L1 hypervisor VMentry-t hív, mert szeretné valamelyik vendég VM-ét futtatni, akkor az trapet vált majd ki, és az L0 kezeli le, és úgy tesz, mintha tényleg megtörténne a VMentry. A megvalósításhoz természetesen egy csomó minden kell, pl. árnyék példányokat létrehozni a VMCS struktúrákból, a 3 szintű memórialeképezést bele kell tuszkolni a rendelkezésre álló egy vagy két szintnyi hardver támogatásba, stb. De így most már legalább tényleg nem tűnik megvalósíthatatlannak:), a többi megoldás is valószínűleg hasonlóan működhet.

Advertisements
Kategória: Tech
Címke:
Közvetlen link a könyvjelzőhöz.

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s