Virtuális gépek Kiss Róbert, informatika IV. év, „Babes-Bolyai” t.e.
1. Bevezetés. A virtuális gépek fogalma egyáltalán nem új a számítástechnikában. Sokan nem is tudnak róla, hogy éppen virtuális gépet használnak, ilyen gép pl. az Internetezés közben használt Java Virtual Machine is. Ezeket a gépeket gyakran használják a számítógépek világában, segítségükkel számos problémát oldanak meg, bár működésükről az átlag felhasználó semmit sem sejt, mivel a programok belsejében vagy operációs rendszer szinten működnek. Ilyen feladatok a hardware eszközök megosztása a programok között, programok hordozhatóvá tétele különböző operációs rendszerek vagy akár gépek között. Maga a szó, „virtuális”, eredetileg az optikában terjedt el, a tárgyak tükörképeit nevezték virtuális képeknek. Később kibővült a jelentési köre, minden olyan dolgot virtuálisnak hívtak, amiben a valóság szimulációja valósult meg, ilyenek pl. a közismert virtuális memória, virtuális lemez, virtuális valóság fogalmak. Ezek alapján kijelenthetjük, hogy egy virtuális gép egy valódi gépnek a lemodellezése, de nem a tökéletes másolata. Ez a modell minden szempontból úgy viselkedik, mint az eredeti, mégsem fizikailag van kivitelezve, hanem logikailag. Tehát egy olyan gépet varázsol nekünk, ami nincs fizikailag jelen. (Biztosan sokan használtak Nintendo, vagy Play Station emulátort a PC-jén, ezek nagyon jó példák a virtuális gépekre). Maga az ötlet nem új, még a számítógépek meg sem jelentek, már gondolkoztak ilyen jellegű gépek építésén. De igazán akkor kapott értelmet az egész, miután megjelentek az első számítógépek. 1965 környékén az IBM szakemberei kísérletet tettek egy nagyobb rendszer felosztására kisebb, önálló rendszerekre, amelyek rendelkeznek a nagy rendszer minden tulajdonságával. Ennek volt is eredménye, két számítógép: IBM System 370 (S/370) és az IBM System 390 (S/390), amelyek az IBM VM/ESA operációs rendszerrel működtek. Később felvetődik a programok hordozhatóságának a kérdése, 1980 és 1985 között megjelennek a POSIX alapú parancsok (Unix). A Java, mint ötlet már a 70-es években megjelenik (Bill Joy), bár valósággá csak a 90-es években válik.
3. A virtuális gépek általános jellemzése. Minden gépnek, legyen az számítógép vagy akár hűtőszekrény, van egy közös jellemzője: kell legyen egy utasításkészletük, ennek az utasításkészletnek a segítségével irányíthatjuk a gépet. A virtuális gépek éppen ezt az alaptulajdonságot használják ki, lényegében egy utasításkészletet szimulálnak. A szimuláció úgy történik, hogy a felhasználó kiad egy utasítást a virtuális gépnek, a gép értelmezi azt majd átalakítja fizikai utasítássá, attól föggően, hogy milyen géptípussal valósítjuk meg a szimulációt. Pl. a Java Virtual Machine mikor egy olyan utasítást kap, hogy írjon ki egy karaktert a képernyőre, akkor az eredmény géptől függetlenül ugyanaz lesz, viszont nyilvánvaló, hogy egy PC és egy Macintosh gépen fizikailag különbözőképpen valósul 1
meg a kiírás. Lényegében a virtuális gép minden virtuális utasításnak egy vagy több fizikai utasítást feleltet meg. Az alábbi ábrán a fenti rész egy valódi gép működését jellemzi, teház az X utasítás hozzárendelhető az Y fizikai szinten történő utasításhoz, míg a virtuális gép esetében az X-et először egy x1-hez rendeljük hozzá, és így tovább, míg eljútunk a Y-hoz.
4. Modellek. Az évek során a virtuális gépek világában négy nagyobb modell alakult ki. Az első az IBM modellje, amely az „egy az egyben lemásolni” elvet követi (one-to-one map). A második családba tartoznak azok a virtuális gépek, amelyek a fizikai gép minden parancsának megfeleltetnek egy virtuális parancsot, ilyen a Java Virtual Machine is vagy a különböző emulátorok. Végül az utolsó két modell a Unix és az OSI modellek, amelyek bizonyos fizikai utasításoknak megfeleltetnek egy virtuálisat, más virtuális utasítások viszont az operációs rendszer kínálta alapfüggvényeket hívják meg.
A. Az IBM modell. Az IBM modell alapján egy virtuális gép nem lesz más, mint az eredeti gép egy pontos mása, csak csökkentett kapcitással, és mindez az eredeti gépen kivitelezve. Ezzel azt akarták elérni, hogy egy nagy teljesítményű gépet felosszanak sok kisebb, gyengébb gépre. Mivel ugyanazon a gépen fut, mint amit szimulálni akar, ezért a virtuális gép utasításkészlete egy az egyben megegyezik a fizikai gép utasításkészletével. Így minden virtuális parancshoz hozzárendelődik egy és csakis egy fizikai utasítás, méghozzá a neki megfelelő fizikai utasítás. Ezáltal megvalósítható egy biztonság is, hiszen a rendszer, ha úgy itéli egy utasításról, hogy bajt okozhat, akkor egyszerűen nem hajtatja végre a fizikai géppel. Jó példa erre, ha valaki meg akarná direktbe változtatni a fizikai processzor regisztereinek a tartalmát. Mivel lehet, hogy más virtuális gép is fut a rendszeren, ezért ez nem megengedhető. Éppen ezért az un. nem-kritikus utasításokat direktbe hajtatja végre, míg a kritikusnak ítélt utasításokat, ha azokat nem sikerül direktbe végrahajtani, megpróbálja szimulálni. Ezáltal a felhasználó minden parancsot elérhet, bár sokszor nincs tudomása arról, hogy ez csak szimulálva van. Felmerül a következő kérdés: honnan tudják a virtuális gépek, hogy mikor használhatják valóban a hardware-t és mikor kell azt emulálni? A válasz egyszerű. 2
Az alapgépet, amelyeken a virtuális gépek fognak futni egy „VM Operating System” operációs rendszer vezérli. Ezt a hardware-t és az operációs rendszert együttesen „VM System”-nek nevezzük. Minden virtuális gépet egy un. kontroll program (Control Program) vezérel, ez osztja ki az erőforrásokat, ez vezérli a fizikai hardware-t, ez hozza létre a virtuális gépet minden felhasználó részére, ami egy szimulációja lesz a nagy számítógépnek (System/370 vagy System/390). Ezzel a módszerrel minden felhasználó egy saját gépet kezel, olyan, mintha mindenki hozzájutna egy önálló számítógéphez, és mindezek felett még a biztonsági követelményeknek is eleget tesz a rendszer. Egy másik hasznos program, amely egy ilyen rendszerben megtalálható a CMS (Conversational Monitor System = társalgási felügyelő rendszer). Ez gondoskodik egy virtuális gépen belül a fájlok kezeléséről, programok futtatásáról, a memória kezeléséről, új programok fejlesztését teszi lehetővé, stb. A CMS tehát nem más, mint egyetlen virtuális gépnek az operációs rendszere, és ez csak egyetlen taszkot tud kezelni egyszerre. Ezen a két alapprogramon kívűl még számos kisebb program segíti a felhasználókat a gépek minél hatékonyabb kihasználásában, pl.: Group Control System, Transparent System Access Facility, Dump Viewing Facility. Már említettük, hogy az IBM modell minden virtuális uatasításnak egy fizikai utasítást feleltet meg, ha ezt nem tudja megvalósítani, akkor kritikus utasításként fogja fel. Ezt megpróbálja szimulálni. Vajon ez nem lassítja le a rendszert? Mivel igen kevés utasítás lehet kritikus utasítás, ezért nem lassul észrevehetően a rendszer. Nézzünk egy példát egy ilyen kritikus utasításra: Tételezzük fel, hogy egy felhasználó megpróbál egy olyan parancsot végrehajtatni a rendszerrel, amely hivatkozik egy másik felhasználó által már lefoglalt erőforrásra. Ezt a CMS észleli, és kritikus utasításnak nyilvánítja. Ezután a CMS felismeri az eszközt, amelyet az utasítás nem tud elérni és az utasítást átadja a Control Programnak egy speciális jelzéssel: „ez egy védett parancs”. A Control Program veszi az utasítást és a jelzést, végrehajt néhány eljárást és ellenőrzést, hogy megállapítsa, hogy az utasítás hatására a gépnek mit kellene tennie. Ezután az eljárások visszajeleznek a Control Program-nak, hogy az utasítás mely részei szimulálhatók, és mely részei fognak gondot okozni. Ha sikerül leszimulálni a parancsot, akkor ez megtörténik, ebben az esetben a felhasználó sosem tudja meg, hogy a parancs csak virtuálisan lett végrehajtva. Ha viszont nem lehetséges a szimuláció, akkor a Control Program visszajelez a felhasználónak, hogy az utasítást nem sikerült végrehajtani.
B. A Java Virtual Machine modell. Egy másik típusa a virtuális gépeknek, amelyeket gyakran használnak a számítástechnikában, nem más mint egy gép szimulációja. Ez az elképzelés eltér az IBM felfogásától, amely az erőforrások megosztására összpontosít és a nagyobb gépet felosztja több, kisebb gépre. Ezzel szemben itt nincs szó felosztásról. Ehelyett egy új gépet hoz létre a rendszeren anélkül, hogy az eredeti gépet megváltoztatná. Így lehetővé válik, hogy egy gépen egy teljesen más gépet emuláljunk. Az ötlet eredetileg onnan ered, hogy próbáltak egy plattformfüggetlen programozási nyelvet létrehozni (Java). 3
A Java programozási nyelv segítségével fejlesztett programok pontosan ezen a Java Virtual Machine virtuális gépen futtathatók. Tehát mikor egy Java programot futtatunk, az nem a fizikai gépen fut, hanem egy virtuális gépen. Éppen ezért egy adott rendszeren megírt Java program ugyanúgy fog lefutni egy másik rendszeren is. Ezért lett a Java az Internet „fő” programozási nyelve. A JVM típusú gépeket absztrakt gépeknek is hívjuk. Másszóval ezek szoftveresen vannak kivitelezve és az operációs rendszer fölött állnak. A programozó megírja a programot, ebből a fordítóprogram bináris kódot generál, amelyet a JVM végrehajt és ennek függvényében egy kimenetet generál. A működését az alábbi ábra mutatja be:
C. Az OSI modell. Az OSI az úgynevezett kiterjesztett virtuális gépekre helyezi a hangsúlyt. Ezek természetes melléktermékei a modern operációs rendszereknek, mivel minden ilyen operációs rendszer használ valamilyen virtuális gépet. Éppen ezért néhány alapdolgot meg kell érteni ahhoz, hogy megértsük, hogy valójában mi is az a kiterjesztett virtuális gép. Közismert, hogy egy modern operációs rendszer utasításkészlettel rendelkezik, amelyek kombinációjából előállíthatóak az adott rendszeren futtatható programok. De az operációs rendszer is alaputasítások sorozatából állítja össze a saját utasításkészletét, mégpedig a rendszer nyújtotta alaputasításokból (BIOS rutinok, stb.) Ezzel a gondolkodásmóddal visszajúthatunk egészen az 1-ek és 0-ák világába. Tehát mikor egy programot lefuttatunk, akkor ez meghívja az operációs rendszer utasításait, azok pedig meghívnak hardware szintű utasításokat. De ezek a rétegek, a gép áramkörei, a gépi kód, az operációs rendszer parancsai és a programok kódja, jól elkülönített rétegek, mindegyik csak az alatta illetve a fölötte levő szinttel tud kommunikálni. Éppen ez a tulajdonság teszi lehetővé, hogy egy kiterjesztett virtuális gépet építsünk, hiszen látható, hogy csupán 1-ek és 0-ák sorozatából milyen bonyolult dolgokat lehet előállítani. A végleges célja tehát a kiterjesztett virtuális gépek fejlesztésének olyan gépek létrehozása, amely nem létezik fizikailag és talán nem is építhető meg. Például minden gép rendelkezik merevlemezzel, ezen tároljuk az adatokat. Valójában a mérete 4
korlátozott, előfordulhat, hogy egy nagyobb méretre lenne szükségünk, mint ami jelenleg előállítható. Egy kiterjesztett virtuális gép képes megoldani azt, hogy több, különálló merevlemezt egyként kezeljen.
D. A UNIX modell. Mivel a Unix többfelhasználós rendszer, ezért minden felhasználó bejelentkezésekor létrehoz egy új konzol shellt (user shell). Mivel ezek a shellek a felhasználónak külön erőforrásokat biztosítanak (minden shellen folyamatok futtathatók, külön memória van kiosztva nekik, stb.), így ezek mindegyike tekinthető virtuális gépnek, és az IBM modelljéhez hasonlítható. Ezek a shellek hozzák létre a folyamatokat és valósítják meg közöttük a kommunikációt. Mindezek ellenére nem lehet egyértelműen IBM modellnek nevezni, mert az IBM modell éppen a felhasználók elszigeteltségére fekteti a hangsúly, míg a Unix esetében lehetséges a shellek közötti kommunikáció. Pontosan ebből az eltérésből adódóan a Unix folyamatok a Java Virtuális gépre is emlékeztetnek, mivel a Unix operációs rendszer réteges felépítéséből adódóan a parancsokat sikerült standardizálni és ezáltal plattfomfüggetlenné tenni. Ezeket a parancsokat shelleknek hívjuk. (IEEE POSIX project - Information Technology Portable Operating System Interface)
Az OSI modell is megtalálható a Unix-ban pontosan a Unix felépítéséből adódóan. A hardware kiterjesztése egy alap tulajdonsága a Unix operációs rendszernek.
Az egyik legérdekesebb szoftver, amit a témával kapcsolatban találtam az a VMware nevű program (www.vmware.com). A program egy virtuális gépet hoz létre a rendszerünkön, ami mindennel rendelkezik, amivel egy fizikai gép rendelkezhet (saját BIOS, használja a fizikai gép CD-ROM –át, merevlemez adható neki, fizikai memória, stb.). Természetesen saját operációs rendszer telepíthető fel rá, hálózat hozható létre a fizikai géppel, vagy több, virtuális gép között. Nagyon hasznos, ha az ember kísérletezgetni akar, hiszen nem rontható el, mivel csak egy program, amit hiba esetén újra lehet telepíteni. 5
Néhány kép, amint a VMware fut:
6