Makinë virtuale

parapamje|*virt-manager* që ekzekuton sistemin operativ Haiku në një dritare
Në informatikë, një **makinë virtuale** ( **VM** ) është virtualizimi ose emulimi i një sistemi kompjuterik. Makinat virtuale bazohen në arkitekturat kompjuterike dhe ofrojnë funksionalitetin e një kompjuteri fizik. Implementimet e tyre mund të përfshijnë pajisje të specializuara, softuer ose një kombinim të të dyjave. Makinat virtuale ndryshojnë dhe janë të organizuara sipas funksionit të tyre, siç paraqitet më poshtë:

* *Makinat virtuale të sistemit* (të quajtura edhe VM me virtualizim të plotë, ose SysVM ) ofrojnë një zëvendësim për një makinë reale. Ato sigurojnë funksionalitetin e nevojshëm për të ekzekutuar sisteme operative të tëra. Një hipervizor përdor ekzekutimin nativ për të ndarë dhe menaxhuar harduerin, duke lejuar mjedise të shumëfishta që janë të izoluara nga njëra-tjetra, por që ekzistojnë në të njëjtën makinë fizike. Hipervizorët modernë përdorin virtualizim të asistuar nga hardueri, ku veçoritë specifike të virtualizimit në CPU-të pritëse ofrojnë ndihmë për hipervizorët.
* *Makinat virtuale të procesit* janë të dizajnuara për të ekzekutuar programe kompjuterike në një mjedis të pavarur nga platforma.

Disa emulatorë të makinave virtuale, si QEMU dhe emulatorët e konsolave të videolojërave, janë krijuar për të emuluar (ose “imituar virtualisht”) arkitektura të ndryshme sistemi, duke lejuar ekzekutimin e aplikacioneve dhe sistemeve operative të shkruara për një CPU ose arkitekturë tjetër. Virtualizimi në nivelin e sistemit operativ lejon që burimet e një kompjuteri të ndahen përmes bërthamës. Termat nuk janë gjithmonë të zëvendësueshëm.

## Përkufizime 
### Makinat virtuale të sistemit 
Një "makinë virtuale" u përkufizua fillimisht nga Popek dhe Goldberg si "një kopje efikase dhe e izoluar e një makine kompjuterike reale." Përdorimi aktual përfshin makina virtuale që nuk kanë korrespondencë të drejtpërdrejtë me ndonjë harduer real. Hardueri fizik, “real” që ekzekuton VM-në zakonisht quhet 'host' (pritës), ndërsa makina virtuale e emuluar në atë makinë zakonisht quhet 'guest' (ftesë). Një host mund të emulojë disa guest-e, secili prej të cilëve mund të emulojë sisteme operative dhe platforma harduerike të ndryshme.

Dëshira për të ekzekutuar disa sisteme operative ishte motivi fillestar për krijimin e makinave virtuale, në mënyrë që të lejohej ndarja e kohës midis disa sistemeve operative që kryenin vetëm një detyrë. Në disa aspekte, një makinë virtuale sistemi mund të konsiderohet një përgjithësim i konceptit të memories virtuale që historikisht i parapriu asaj. CP/CMS i IBM-it, sistemet e para që lejonin virtualizimin e plotë, implementuan ndarjen e kohës duke i ofruar çdo përdoruesi një sistem operativ për një përdorues, Conversational Monitor System (CMS). Ndryshe nga memoria virtuale, një makinë virtuale sistemi i jepte përdoruesit të drejtën të shkruante udhëzime privilegjuese në kodin e tyre. Ky qasje kishte disa avantazhe, si për shembull shtimi i pajisjeve input/output që nuk lejonte sistemi standard. 

Përdorimi i makinave virtuale për të mbështetur sisteme operative të veçanta të mysafirëve është i njohur në lidhje me sistemet e integruara. Një përdorim tipik do të ishte ekzekutimi i një sistemi operativ me kohë reale njëkohësisht me një sistem operativ të kompleksuar të preferuar, si Linux ose Windows. Një përdorim tjetër do të ishte për softuer të ri dhe të paprovuar, ende në fazën e zhvillimit, në mënyrë që të funksionojë brenda një ‘sandbox’-i. Makinat virtuale kanë edhe avantazhe të tjera për zhvillimin e sistemeve operative dhe mund të përfshijnë qasje më të mirë për debug-im dhe rinisje më të shpejtë. 

Shumë makina virtuale që ekzekutojnë sistemet e tyre operative të mysafirëve shpesh përdoren për konsolidimin e serverëve. 

### Përpunoni makinat virtuale 
Një makinë virtuale për proces, e quajtur ndonjëherë edhe makinë virtuale për aplikacione, ose Mjedis i Ekzekutimit të Menaxhuar (Managed Runtime Environment – MRE), funksionon si një aplikacion normal brenda një sistemi operativ host dhe mbështet një proces të vetëm. Ajo krijohet kur ky proces fillon dhe fshihet kur procesi mbyllet. Qëllimi i saj është të sigurojë një mjedis programimi të pavarur nga platforma, i cili e fsheh detajet e harduerit ose sistemit operativ në themel dhe lejon që një program të ekzekutohet në të njëjtën mënyrë në çdo platformë. &#x5B; '** &#x5D;

Një makinë virtuale për proces ofron një abstraksion në nivel të lartë – atë të një gjuhe programimi në nivel të lartë (krahasuar me abstraksionin në nivel të ulët të ISA-së të makinës virtuale të sistemit). Makina virtuale për proces implementohet duke përdorur një interpretues ; Performanca e krahasueshme me gjuhët programuese të kompiluara mund të arrihet përmes përdorimit të kompilimit ‘Just-In-Time’ (JIT).&#x5B; **' &#x5D;

Ky lloj makine virtuale është bërë i njohur me gjuhën e programimit Java, e cila implementohet përmes makinën virtuale Java . Shembuj të tjerë përfshijnë makinën virtuale Parrot dhe .NET Framework, i cili funksionon në një makinë virtuale të quajtur *Common Language Runtime*. Të gjitha këto mund të shërbejnë si një shtresë abstraksioni për çdo gjuhë kompjuteri. 

Një rast i veçantë i VM-ve të proceseve janë sistemet që abstraktojnë mbi mekanizmat e komunikimit të një klasteri kompjuterik (potencialisht heterogjen). Një VM e tillë nuk përbëhet nga një proces i vetëm, por nga një proces për makinë fizike në klaster. Ato janë të dizajnuara për të lehtësuar detyrën e programimit të aplikacioneve të njëkohshme duke i lejuar programuesit të përqendrohet në algoritme në vend të mekanizmave të komunikimit të ofruara nga ndërlidhja dhe sistemi operativ. Ato nuk e fshehin faktin se komunikimi zhvillohet dhe si të tilla nuk përpiqen ta paraqesin klasterin si një makinë të vetme. &#x5B; '** &#x5D;

Ndryshe nga makinat e tjera virtuale të proceseve, këto sisteme nuk ofrojnë një gjuhë programimi specifike, por janë të integruara në një gjuhë ekzistuese; zakonisht një sistem i tillë ofron lidhje për disa gjuhë (p.sh., C dhe Fortran ). &#x5B; **' &#x5D; Shembuj janë Makina Virtuale Paralele (PVM) dhe Ndërfaqja e Kalimit të Mesazheve (MPI).

## Histori 
 Si makinat virtuale të sistemit ashtu edhe makinat virtuale të procesit datojnë që nga vitet 1960 dhe mbeten fusha të zhvillimit aktiv.

*Makinat virtuale të sistemit* u rritën nga ndarja e kohës, siç u zbatua dukshëm në Sistemin e Ndarjes së Kohës së Përputhshme (CTSS). Ndarja e kohës u lejonte përdoruesve të shumtë të përdornin një kompjuter njëkohësisht: çdo program dukej se kishte akses të plotë në makinë, por vetëm një program ekzekutohej në atë kohë, me sistemin që kalonte midis programeve në segmente kohore, duke ruajtur dhe rivendosur gjendjen çdo herë. Kjo evoluoi në makina virtuale, veçanërisht nëpërmjet sistemeve kërkimore të IBM: M44/44X, i cili përdorte virtualizim të pjesshëm, dhe CP-40 dhe SIMMON, të cilët përdornin virtualizim të plotë, dhe ishin shembuj të hershëm të hipervizorëve . Arkitektura e parë e makinës virtuale e disponueshme gjerësisht ishte CP-67 /CMS (shih Historinë e CP/CMS për detaje). Një dallim i rëndësishëm ishte midis përdorimit të makinave të shumta virtuale në një sistem pritës për ndarjen e kohës, si në M44/44X dhe CP-40, dhe përdorimit të një makine virtuale në një sistem pritës për prototipim, si në SIMMON. Emulatorët, me emulim harduerik të sistemeve të mëparshme për pajtueshmëri, datojnë që nga IBM System/360 në vitin 1963,   ndërsa emulimi i softuerit (i quajtur atëherë "simulim") i paraprin atij.

*Makinat virtuale të procesit* u ngritën fillimisht si platforma abstrakte për një gjuhë të ndërmjetme të përdorur si përfaqësim i ndërmjetëm i një programi nga një kompilues; shembujt e hershëm datojnë rreth vitit 1964 me sistemin e shkrimit të kompiluesve META II që e përdorte atë si për përshkrimin e sintaksës ashtu edhe për gjenerimin e kodit të synuar. Një shembull i shquar i vitit 1966 ishte makina O-kod, një makinë virtuale që ekzekuton O-kod (kod objekti) të emetuar nga pjesa e përparme e kompiluesit BCPL . Ky abstraksion lejoi që kompiluesi të portohej lehtësisht në një arkitekturë të re duke zbatuar një pjesë të re të pasme që merrte O-kodin ekzistues dhe e kompilonte atë në kod makine për makinën fizike themelore. Gjuha Euler përdorte një dizajn të ngjashëm, me gjuhën e ndërmjetme të quajtur *P* (e lëvizshme).  Kjo u popullarizua rreth vitit 1970 nga Pascal, veçanërisht në sistemin Pascal-P (1973) dhe kompiluesin Pascal-S (1975), në të cilin u quajt p-kod dhe makina që rezultoi si një makinë p-kod . Kjo ka qenë me ndikim, dhe makinat virtuale në këtë kuptim shpesh janë quajtur përgjithësisht makina p-kod. Përveçse ishte një gjuhë e ndërmjetme, kodi p i Pascal-it ekzekutohej gjithashtu drejtpërdrejt nga një interpretues që implementonte makinën virtuale, veçanërisht në UCSD Pascal (1978); kjo ndikoi në interpretuesit e mëvonshëm, veçanërisht makinën virtuale Java (JVM). Një shembull tjetër i hershëm ishte SNOBOL4 (1967), i cili u shkrua në Gjuhën e Implementimit SNOBOL (SIL), një gjuhë asambleje për një makinë virtuale, e cila më pas u drejtua te makinat fizike duke u transpiluar te asambleri i tyre vendas nëpërmjet një makro asambleri .  Megjithatë, makrot kanë rënë nga popullariteti që atëherë, kështu që kjo qasje ka qenë më pak ndikuese. Makinat virtuale të procesit ishin një qasje popullore për implementimin e softuerëve të hershëm të mikrokompjuterëve, duke përfshirë Tiny BASIC dhe lojërat aventureske, nga implementime të vetme si Pyramid 2000 te një motor me qëllim të përgjithshëm si z-machine e Infocom, të cilin Graham Nelson argumenton se është "ndoshta makina virtuale më e lëvizshme e krijuar ndonjëherë". 

Përparime të rëndësishme ndodhën në zbatimin e Smalltalk -80, veçanërisht zbatimin Deutsch/Schiffmann  i cili e shtyu përpara kompilimin just-in-time (JIT) si një qasje zbatimi që përdor makinën virtuale të procesit. Më vonë, makinat virtuale të njohura Smalltalk ishin VisualWorks, Squeak Virtual Machine, dhe Strongtalk. Një gjuhë e lidhur që prodhoi shumë inovacion në makinën virtuale ishte gjuha e programimit Self, e cila ishte pionere e optimizimit adaptiv  dhe mbledhjes së mbeturinave gjeneruese . Këto teknika rezultuan të suksesshme komercialisht në vitin 1999 në makinën virtuale HotSpot Java. Inovacione të tjera përfshijnë një makinë virtuale të bazuar në regjistra, për t'u përputhur më mirë me harduerin themelor, në vend të një makine virtuale të bazuar në pirg, e cila është një përputhje më e afërt me gjuhën e programimit; në vitin 1995, kjo u prezantua nga makina virtuale Dis për gjuhën Limbo .

## Teknikat e virtualizimit 
parapamje|Diagrami logjik i virtualizimit të plotë

### Virtualizim i plotë 
Në virtualizimin e plotë, makina virtuale simulon mjaftueshëm harduer për të lejuar që një sistem operativ "mysafir" i pamodifikuar (një i projektuar për të njëjtin grup udhëzimesh ) të ekzekutohet në izolim. Kjo qasje u prezantua për herë të parë në vitin 1966 me IBM CP-40 dhe CP-67, paraardhësit e familjes VM .

Shembuj jashtë fushës së mainframe-it përfshijnë Parallels Workstation, Parallels Desktop for Mac, VirtualBox, Virtual Iron, Oracle VM, Virtual PC, Virtual Server, Hyper-V, VMware Fusion, VMware Workstation, VMware Server (i ndërprerë, më parë i quajtur GSX Server), VMware ESXi, QEMU, Adeos, Mac-on-Linux, Win4BSD, Win4Lin Pro dhe teknologjinë Egenera vBlade.

#### Virtualizim i asistuar nga hardueri 
Në virtualizimin e asistuar nga hardueri, hardueri ofron mbështetje arkitekturore që lehtëson ndërtimin e një monitori të makinës virtuale dhe lejon që sistemet operative mysafire të ekzekutohen në izolim. Virtualizimi i asistuar nga hardueri u prezantua për herë të parë në IBM System/370 në vitin 1972, për përdorim me VM/370, sistemi i parë operativ i makinës virtuale i ofruar nga IBM si një produkt zyrtar. 

Në vitet 2005 dhe 2006, Intel dhe AMD ofruan pajisje shtesë për të mbështetur virtualizimin. Sun Microsystems (i blerë nga Oracle Corporation ) shtoi karakteristika të ngjashme në procesorët e tyre UltraSPARC T-Series në vitin 2005. Shembuj të platformave të virtualizimit të përshtatura për pajisje të tilla përfshijnë KVM, VMware Workstation, VMware Fusion, Hyper-V, Windows Virtual PC, Xen, Parallels Desktop për Mac, Oracle VM Server për SPARC, VirtualBox dhe Parallels Workstation .

Në vitin 2006, mbështetja e harduerit x86 32 dhe 64-bit të gjeneratës së parë u zbulua se rrallë ofronte avantazhe në performancë krahasuar me virtualizimin e softuerit. 

### Virtualizimi në nivel sistemi operativ 
Në virtualizimin në nivel sistemi operativ, një server fizik virtualizohet në nivelin e sistemit operativ, duke mundësuar që shumë serverë të virtualizuar të izoluar dhe të sigurt të funksionojnë në një server të vetëm fizik. Mjediset e sistemit operativ "mysafir" ndajnë të njëjtën instancë ekzekutimi të sistemit operativ si sistemi pritës. Kështu, i njëjti bërthamë sistemi operativ përdoret gjithashtu për të zbatuar mjediset "mysafir", dhe aplikacionet që funksionojnë në një mjedis të caktuar "mysafir" e shohin atë si një sistem të pavarur. Implementimi pionier ishin burgjet FreeBSD ; shembuj të tjerë përfshijnë Docker, Solaris Containers, OpenVZ, Linux-VServer, LXC, AIX Workload Partitions, Parallels Virtuozzo Containers dhe iCore Virtual Accounts.

## Pamje të çastit 
Një *pamje e çastit* është një gjendje e një makine virtuale, dhe në përgjithësi e pajisjeve të saj të ruajtjes, në një moment të saktë në kohë. Një pamje e çastit mundëson që gjendja e makinës virtuale në kohën e pamjes së çastit të rikthehet më vonë, duke zhbërë në mënyrë efektive çdo ndryshim që ka ndodhur më pas. Kjo aftësi është e dobishme si një teknikë rezervimi, për shembull, para se të kryhet një operacion i rrezikshëm.

Makinat virtuale përdorin shpesh disqe virtuale për ruajtjen e tyre; në një shembull shumë të thjeshtë, një hard disk 10 gigabajt simulohet me një skedar të sheshtë 10 gigabajt. Çdo kërkesë nga VM për një vendndodhje në diskun e saj fizik përkthehet në mënyrë transparente në një operacion në skedarin përkatës. Megjithatë, sapo të jetë e pranishme një shtresë e tillë përkthimi, është e mundur të ndërpriten operacionet dhe t'i dërgohen ato në skedarë të ndryshëm, varësisht nga kritere të ndryshme. Sa herë që merret një pamje e çastit, krijohet një skedar i ri dhe përdoret si një mbivendosje për paraardhësit e tij. Të dhënat e reja shkruhen në mbivendosjen më të lartë; megjithatë, leximi i të dhënave ekzistuese kërkon që hierarkia e mbivendosjes të skanohet, duke rezultuar në aksesimin e versionit më të fundit. Kështu, i gjithë pirgu i pamjeve të çastit është praktikisht një disk i vetëm koherent; në këtë kuptim, krijimi i pamjeve të çastit funksionon në mënyrë të ngjashme me teknikën e kopjimit rezervë shtesë . &#x5B; '** &#x5D;

Komponentë të tjerë të një makine virtuale mund të përfshihen gjithashtu në një pamje të çastit, siç janë përmbajtja e memories së saj me akses të rastësishëm (RAM), cilësimet e BIOS-it ose cilësimet e konfigurimit të saj. Funksioni " Ruaj gjendjen " në emulatorët e konsolave të videolojërave është një shembull i pamjeve të tilla të çastit. &#x5B; **' &#x5D;

Rivendosja e një pamjeje të çastit konsiston në heqjen ose shpërfilljen e të gjitha shtresave të mbivendosjes që shtohen pas asaj pamjeje të çastit dhe drejtimin e të gjitha ndryshimeve të reja në një mbivendosje të re. &#x5B; '''' &#x5D;

## Migrimi 
Pamjet e çastit të përshkruara më sipër mund të zhvendosen në një makinë tjetër pritëse me hipervizorin e vet; kur VM ndalet përkohësisht, krijohet një pamje e çastit, zhvendoset dhe më pas rifillon në hostin e ri, kjo njihet si migrim. Nëse pamjet e çastit më të vjetra mbahen të sinkronizuara rregullisht, ky operacion mund të jetë mjaft i shpejtë dhe t'i lejojë VM-së të ofrojë shërbim të pandërprerë ndërsa hosti i saj fizik i mëparshëm, për shembull, çaktivizohet për mirëmbajtje fizike. &#x5B; ''* &#x5D;

## Kalim në rezervë 
Ngjashëm me mekanizmin e migrimit të përshkruar më sipër, ndërprerja e funksionimit (failover) i lejon VM-së të vazhdojë operacionet nëse hosti dështon. Në përgjithësi ndodh nëse migrimi ka ndaluar së funksionuari. Megjithatë, në këtë rast, VM-ja vazhdon operacionin nga gjendja koherente *e njohur së fundmi*, në vend të gjendjes *aktuale*, bazuar në materialet që serveri i kopjes rezervë i është dhënë së fundmi. &#x5B; ** &#x5D;

## Virtualizimi i ndërthurur 
Virtualizimi i ndërthurur i referohet aftësisë për të ekzekutuar një makinë virtuale brenda një tjetre, duke e pasur këtë koncept të përgjithshëm të zgjerueshëm në një thellësi arbitrare. Me fjalë të tjera, virtualizimi i ndërthurur i referohet ekzekutimit të një ose më shumë hipervizorëve brenda një hipervizori tjetër. Natyra e një makine virtuale mysafire të ndërthurur nuk ka nevojë të jetë homogjene me makinën e saj virtuale pritëse; për shembull, virtualizimi i aplikacionit mund të vendoset brenda një makine virtuale të krijuar duke përdorur virtualizimin harduerik .

Virtualizimi i ndërthurur bëhet më i nevojshëm ndërsa sistemet operative të përhapura fitojnë funksionalitet të integruar të hipervizorit, i cili në një mjedis të virtualizuar mund të përdoret vetëm nëse hipervizori përreth mbështet virtualizimin e ndërthurur; për shembull, Windows 7 është i aftë të ekzekutojë aplikacione Windows XP brenda një makine virtuale të integruar. Për më tepër, zhvendosja e mjediseve të virtualizuara ekzistuese në një re, duke ndjekur qasjen Infrastrukturë si Shërbim (IaaS), është shumë më e ndërlikuar nëse platforma IaaS e destinacionit nuk mbështet virtualizimin e ndërthurur. 

Mënyra se si virtualizimi i ndërthurur mund të zbatohet në një arkitekturë të caktuar kompjuteri varet nga aftësitë e virtualizimit të mbështetura nga hardueri . Nëse një arkitekturë e caktuar nuk ofron mbështetjen harduerike të nevojshme për virtualizimin e ndërthurur, përdoren teknika të ndryshme softuerike për ta mundësuar atë. 

## Siguria 
Makinat virtuale përdoren shpesh për të izoluar aplikacionet nga njëra-tjetra për siguri.

Ky dizajn arkitektonik (i përdorur nga Qubes OS, Whonix, KickSecure dhe Dangerzone) mund të parandalojë përhapjen e malware-it nga një sistem i kompromentuar (p.sh. një klient email-i që hap një dokument të infektuar ) në një sistem tjetër (p.sh. një menaxher fjalëkalimesh ). 

## Shih edhe 
* Imazh i Makinerisë Amazon
* Virtualizimi i desktopit
* Kontejnerët Linux
* Paketa vendore e zhvillimit
* Paravirtualizim
* Hipervizor i ruajtjes së të dhënave
* Makina Universale Turing
* Pajisje virtuale
* Pajisje virtuale për kopje rezervë
* Imazh i diskut virtual
* Virtual DOS machine (VDM)
* Virtual machine escape
* Virtual private server

## Referime 
## Lexime të mëtejshme 
*James E. Smith, Ravi Nair, *Makinat Virtuale: Platforma të Gjithanshme për Sisteme dhe Procese*, Morgan Kaufmann, Maj 2005, , 656 faqe (mbulon makinat virtuale si të procesit ashtu edhe të sistemit)
* Craig, Iain D. *Makinat Virtuale'' . Springer, 2006, , 269 faqe (mbulon vetëm makinat virtuale të proceseve)

## Lidhje të jashtme 
* 
* Sandia National Laboratories Runs 1 Million Linux Kernels as Virtual Machines
* The design of the Inferno virtual machine by Phil Winterbottom and Rob Pike