Wirtualizacja – proces symulowania przez oprogramowanie istnienia zasobów logicznych, które wykorzystują ustalone podczas konfiguracji zasoby fizyczne. Wirtualna maszyna stosuje wirtualizację w celu emulowania pracy maszyny z danym systemem operacyjnym, pozwalając przez to badać zachowanie tej maszyny i jej oprogramowania, bez wpływania na realny system operacyjny.

Wirtualizacja umożliwia efektywniejsze wykorzystanie istniejących zasobów sprzętowych środowiska informatycznego poprzez dowolne (w ramach możliwości sprzętowych czy programowych oraz założeń projektowych) modyfikowanie cech wirtualizowanych zasobów, dostosowując je do wymagań użytkownika.

Jedną z pierwszych szeroko stosowanych technik wirtualizacji była technika wirtualizacji pamięci operacyjnej. Obecnie technika ta jest powszechna nie tylko w superkomputerach, serwerach czy komputerach osobistych, ale także w systemach wbudowanych. Inną techniką wirtualizacji jest wirtualizacja sprzętu komputerowego w celu umożliwienia jednoczesnego uruchamiania wielu systemów operacyjnych.

Wirtualizacja a emulacja W obrębie pojęcia „wirtualizacja” można wyróżnić trzy grupy rozwiązańT. Krasuski, J. Łoś, M. Szostakiewicz: „Wstęp do wirtualizacji” UW 2005.:

Emulacja API – rozwiązanie programowe wykorzystujące sposób działania aplikacji jako rozdzielnych procesów w stosunku do systemu operacyjnego. Aplikacje wykorzystują API w celu dokonania procesu komunikacji z systemem operacyjnym. Emulatory API wprowadzają do głównego systemu operacyjnego otoczenie API pochodzące z innego systemu i niezbędne dla danej, emulowanej aplikacji. Tak działa Wine (ang. Wine is not emulator) będący implementacją WinAPI dla środowiska systemu Unix/X11. Rozwiązanie takie eliminuje konieczność posiadania całego systemu operacyjnego, pod którym działa emulowany program. Wymaga ono tylko emulacji jego interfejsu API. Jeżeli jednak emulowany program uruchamiany za pomocą Wine pominie standardowe biblioteki zawarte w WinAPI, to prawdopodobnie zakończy się to błędemPeter Ganten – „Installations – und Bedienungsanleitung für WINE” 2001..

Emulacja pełna – stanowi sposób na uruchamianie aplikacji pochodzących z niekompatybilnego komputera, w stosunku do wykorzystywanego (np. PC/Mac). Emulowane są podstawowe podzespoły komputera (CPU, RAM, HDD, CD itp.) wraz z systemem operacyjnym (virtual OS), zapewniając dużą przenośność przy pewnym spadku wydajności. Praktycznie każda operacja na uruchomionym wirtualnym systemie operacyjnym jest emulowana. Emulatory pełne są zatem wirtualnymi odpowiednikami całego komputera. Typowy emulator wykonuje w pętli wszystko to, co robiłby rzeczywisty procesor maszyny emulowanej, co prowadzi do spadku wydajności pracy komputera.

Wirtualizacja – pozwala jednocześnie uruchomić wiele systemów operacyjnych na tej samej platformie sprzętowej i systemowej przy maksymalnej możliwej wydajności.

Wirtualizacja jest połączeniem podstawowych zalet emulacji pełnej oraz emulacji APILifu Wang, Kyung Ryong Dyu: „Feasibility of Exploiting Virtual Machines for Grid Computing” Dep. of Computer Science, Arizona State University Tempe, 2004.. Opiera się ona na uruchamianiu w maszynie wirtualnej systemu operacyjnego, rezygnując z uniwersalności emulowania wielu architektur komputerów (np. 68K). Ograniczenie się wyłącznie do wykorzystywanej platformy sprzętowej umożliwia wykonywanie pewnej liczby procesów systemu operacyjnego gościa (systemu emulowanego) bezpośrednio na zasobach sprzętowych komputera. Dopiero w sytuacji, gdy operacje takie nie dadzą się bezpośrednio wykonać, wirtualizator emuluje je. Oznacza to, że wirtualizator uruchamia system operacyjny tak, aby mógł on koegzystować z systemem głównym i osiągać maksymalną zgodność i wydajność.

Teoretycznie wirtualizator powinien wykonywać bez emulacji wszystkie operacje w trybie nieuprzywilejowanym. W praktyce jednak dana architektura (np. PC x86) musiałaby zostać specjalnie do tego celu zaprojektowana (np. technologie AMD-V, Intel VT-x).

Przykładowo wirtualizator firmy VMware Inc. o nazwie VMware Workstation uruchamia dany system operacyjny w wirtualnym środowisku sprzętowym tworzonym w ten sposób, że system emulowany wykonuje operacje bezpośrednio na możliwie największej ilości zasobów sprzętowych, w szczególności na procesorze.

Typy wirtualizacji Parawirtualizacja – technika wirtualizacji, w której wirtualizowany system operacyjny (Gość – ang. Guest, Partycja – ang. Partition lub Domena – ang. Domain) współpracuje ze środowiskiem operacyjnym komputera w zakresie obsługi tych elementów sprzętowych, których obsługa kolidowałaby z działalnością innych środowisk wirtualizowanych. Parawirtualizacja jest to jedna lub wiele maszyn wirtualnych działających obok systemu host. Parawirtualizacja korzysta z hypervisora typu 1, monitor działa tutaj bezpośrednio na sprzęcie i udostępnia go (lub nie) systemom guest. Jeden z wirtualizowanych systemów pełni rolę zarządzającą, może rozdzielać zasoby pośród pozostałych systemów i pełnić pełną kontrolę nad maszyną wirtualną i jej zasobami. System, który mógłby być uruchomiony jako guest za pomocą parawirtualizacji, musi mieć zmodyfikowane jądro w taki sposób, aby zamiast odwołań do sprzętu, jak również standardowych odwołań do sprzętu, które są niedozwolone podczas parawirtualizacji, trzeba używać odwołań typu hypercall. Odwołanie to po prostu interfejs pomiędzy monitorem a systemami guest. Mechanizm zapewnia tutaj bardzo dobrą wydajność, bardzo zbliżoną do natywnego działania systemu. Bardzo dobra wydajność systemów guest oraz łatwość w modyfikowaniu jądra systemu guest w celu przystosowania go do parawirtualizacji jest jego zaletą. Natomiast wadą jest konieczność modyfikowania systemu guest, ponieważ nie zawsze jest możliwe uzyskanie takiej wydajności. Niestety modyfikacja jądra niesie za sobą również koszty związane z dostosowaniem systemu guest do odpowiedniego hypervisora oraz musimy tę procedurę ponowić dla każdego innego hypervisora. Implementacją parawirtualizacji w postaci VMI (Virtual Machine Interface) jest interfejs komunikacji pomiędzy systemem guest a hypervisorem proponowanym przez VMware. Można również powiedzieć, że VMI jest to próba ujednolicenia interfejsu dla wirtualizacji. Celem było także stworzenie jednego interfejsu komunikacji, który byłby zaimplementowany na wielu hypervisorach i w miarę łatwa byłaby implementacja na systemach guest. Zaletą VMI jest to, że implementacja ta nie jest przynależna do jednego hypervisora tylko jest otwarta. Implementacja systemu guest dałaby raz możliwość uruchomienia go we wszystkich liczących się hypervisorach.

Pełna wirtualizacja – technika wirtualizacji, w której wirtualizowany system operacyjny (gość) ma wrażenie, że działa na prawdziwym, fizycznym sprzęcie (komputerze). W rzeczywistości odwołania wirtualizowanego systemu operacyjnego (gościa) do tych elementów fizycznych komputera, które kolidowałyby z działalnością innych środowisk wirtualizowanych lub systemu operacyjnego gospodarza (ang. host), są przechwytywane przez oprogramowanie wirtualizacyjne, a następnie emulowane. Emulacja taka spowalnia pracę wirtualizowanego środowiska, dlatego pożądane jest sprzętowe wspomaganie wirtualizacji. Pełna wirtualizacja pozwala nam na wirtualizowanie dowolnie wybranego niezmodyfikowanego systemu operacyjnego. Największą zaletą pełnej wirtualizacji jest to, iż nie narzuca ona nam żadnych ograniczeń ani wymagań co do systemu guest. Wydajność w takim rozwiązaniu jest niestety mniejsza niż w przypadku parawirtualizacji. Zarówno za pomocą hypervisora typu 1, jak i typu 2 może być zrealizowana pełna wirtualizacja. Głównym wyzwaniem pełnej wirtualizacji jest realizowanie i przechwytywanie uprzywilejowanych instrukcji jądra guest, tak jak na przykład operacja I/O, przerwań czy operacji na pamięci. Większość instrukcji systemu guest wykonywana jest bezpośrednio na procesorze przez hypervisora, natomiast te instrukcje, które wychodzą poza uprawnienia systemu guest, jak też odwołują się do sprzętu, powinny być przechwycone i emulowane. W przypadku kiedy zostanie użyty hypervisor typu 1 wymagane jest odpowiednie rozszerzenie sprzętowe, które umożliwia wirtualizację. Pełną wirtualizację określa się również pojęciem natywna wirtualizacja oraz wirtualizacja wspierana sprzętowo. Jeśli do pełnej wirtualizacji użyjemy hypervisora typu 2, to będziemy ją realizować przez mechanizmy takie jak binary translation oraz direct execution, często ze wsparciem pamięci podręcznej tych transakcji w postaci cache, można również użyć kompilacji instrukcji just in time.

Wirtualizacja na poziomie systemu operacyjnego – technika wirtualizacji, w której system operacyjny obsługuje kilka odseparowanych od siebie środowisk wirtualnych.

Historia By być możliwie ścisłym, o pierwszym szeroko znanym zastosowaniu wirtualizacji można mówić przy tworzonym we współudziale Uniwersytetu w Manchesterze i firm Ferranti oraz Plessey komputerze ATLAS. W zastosowanej architekturze część instrukcji zewnętrznych wykonywana była przez sprzęt, a część zostawała przechwycona przez program nadzorujący. Dziś pełniłby on jeszcze dużo innych funkcji i zostałby nazwany systemem operacyjnym. Wtedy jednak zajmował się wykonywaniem w odpowiedni sposób przechwyconych wywołań, a ta skromna wirtualizacja była wyłącznie efektem ubocznym dość rewolucyjnych rozwiązań zastosowanych w komputerze.

Faktyczne zastosowanie wirtualizacji pojawiło się dopiero w połowie lat 60. w wyniku prac laboratoriów IBM. Wtedy właśnie centrum badawcze Watsona zakończyło projekt M44/44X, który składał się z fizycznej maszyny M44, oznaczanej też IBM 7044 oraz maszyn wirtualnych 44X. Każda z nich operowała na pamięci M44, korzystając przy tym z wieloprogramowania i pamięci wirtualnej. Wkrótce potem stworzono kolejne maszyny wirtualne: CP40 dla IBM 860/40, CP67 dla 360/67, a także wiele innych. Zwykle maszyny wirtualne były idealnymi kopiami fizycznego sprzętu, obsługiwanymi przez monitor maszyn wirtualnych, kontaktujący się bezpośrednio z systemem komputerowym. W ten sposób mogło być tworzone wiele kopii tego samego systemu operacyjnego, co pozwalało znacząco zwiększyć wykorzystanie procesora na komputerach klasy Mainframe. Wielu użytkowników mogło korzystać z tej samej fizycznej maszyny, dzięki czemu – choć tak wiele czasu zabierała interakcja między komputerem i człowiekiem – procesor był w większym stopniu wykorzystywany.

Od tego czasu wirtualizacja była nadal rozwijana, lecz do momentu, gdy komputery osobiste uzyskały wystarczająco dużą moc obliczeniową, zastosowanie maszyn wirtualnych w gospodarstwach domowych lub niewyspecjalizowanych firmach było ograniczone. Druga połowa poprzedniego dziesięciolecia to jednak czas dość gwałtownego rozwoju technologii wirtualnych – pojawił się język Java korzystający z maszyn wirtualnych, działalność zaczęła również firma VMware, specjalizująca się w oprogramowaniu do wirtualizacji. Również Microsoft dołączył do rywalizacji w tej branży, podobnie jak później Google. W wyniku konkurencji część swych produktów dotyczących wirtualnych serwerów Microsoft i VMware zaczęły udostępniać za darmo. Wraz ze wzrostem mocy obliczeniowej i zmniejszania kosztów pamięci można oczekiwać popularyzacji maszyn wirtualnych i używania ich także w domowych stanowiskach.

Przykłady Przykłady, w których występują elementy wirtualizacji.

Wirtualizacja sprzętu VMware, Bochs – poprzednik QEMU, QEMU, KVM – moduł jądra, umożliwiający QEMU skorzystanie ze sprzętowej wirtualizacji Xen, , Microsoft Virtual PC, Microsoft Hyper-V, VirtualBox.

Wirtualizacja na poziomie jądra OpenVZ, .

Porównanie maszyn wirtualnych