Wirtualizacja

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ń[1]:

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łędem[2].

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 API[3]. 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.

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

Wirtualizacja na poziomie jądra

Porównanie maszyn wirtualnych

Porównanie maszyn wirtualnych
Nazwa maszyny wirtualnej VMware ESX Server VMware Server VMware Workstation Xen OpenVZ Microsoft Hyper-V QEMU KVM VirtualBox VServer
System gospodarza (Dystrybucja, Wersja) ESX Linux, Windows Linux, Windows Linux Linux (Centos, Debian) Windows Server, Windows 8.1 Professional i Enterprise Linux Linux Linux, Windows, OS X, Solaris, OpenSolaris, Linux (PLD)
Rodzaj wirtualizacji Pełna Parawirtualizacja ewentualnie pełna Kontenery Pełna Pełna, w przypadku sieci możliwość użycia parawirtualizacji Kontenery
Hipernadzorca w kernelu Tak Nie Tak Tak Tak
Wirtualizacja sieci Tak Tak Tak, korzysta z linuksowych bridży, VDE lub Open vSwitch Tak Tak Tak Nie
System gościa Linux, Windows (od XP), BSD, Dowolny Linux, Windows lub BSD Linux (kernel gospodarza) Windows (systemy klienckie od XP, serwerowe od Windows 2000), SUSE od wersji 10 SP3, Red Hat od wersji 5.2 Dowolny, z wyjątkiem PC-BSD 1.3, Novell Netware 6.5 oraz BeOS R5. Linux (Kernel gospodarza)

System operacyjny

W budowie systemów operacyjnych (pamięć wirtualna, technologia mikrojądra, wirtualny system plików VFS (ang. Virtual File System), wirtualny system operacyjny):

System sieciowy

W sieciach komputerowych, w systemach serwerów sieciowych (VPN – Virtual Private Network, VPS – Virtual Private Server):

Podział zasobów

W partycjonowaniu, skupianiu, rozszczepianiu i łączeniu zasobów:

  • RAID (Redundant Array of Independent Disks),
  • LVM (Logical Volume Manager),
  • RAIN,

w dzieleniu pracy i dostępu procesora do pamięci (zobacz: ISA – Instruction Set Architecture):

  • przetwarzanie symetryczne (SMP – Symmetric Multiprocessing),
  • przetwarzanie asymetryczne (ASMP – Asymmetric Multiprocessing),
  • przetwarzanie asynchroniczne (AMP – Asynchronous Multiprocessing),
  • przetwarzanie współbieżne nierównomierne (NUMA, Non-Uniform Memory Access),
  • przetwarzanie w pełni równoległe (MPP – Massively Parallel Processors),

i poprzez uaktywnienie wirtualnego trybu pracy procesora (a tryb jest związany m.in. z dostępem procesora do pamięci), pracy chronionej przez system operacyjny i oprogramowanie obsługujące V86Virtual 8086, VDSVirtual DMA Specification, VCPIVirtual Control Program Interface lub DPMIDOS Protected Mode Interface:

  • nakładki dla DOS,
  • odpowiednie mechanizmy w systemie Microsoft Windows,
  • mechanizm zawarty w DOSEMU – maszynie wirtualnej przeznaczonej dla Linuksa.

Procesor

W sprzęcie fizycznym – w mikroprocesorach:

Wirtualizacja serwerów a wirtualizacja desktopów

Różnice pomiędzy wirtualizacją serwera a wirtualizacją desktopu dla każdego użytkownika mogą być niejasne i niezauważalne w momencie, kiedy nie zna się różnic pomiędzy tymi rodzajami wirtualizacji. Mogą zostać zwirtualizowane również technologie, także lista urządzeń, zasobów czy technologii staje się dość długa: dane, desktopy, serwery, sieci, a także systemy operacyjne. Zdefiniuję tutaj technologie wirtualizacji, czyli serwerów oraz desktopów, co wyjaśni różnice między nimi.

Wirtualizację serwerów definiuje się jako dzielenie, inaczej partycjonowanie, fizycznego serwera na dużo mniejsze serwery wirtualne. W tym przypadku zasoby sprzętowe danego serwera są niewidoczne albo ukrywane dla danych użytkowników. Zasoby fizycznego serwera za pomocą oprogramowania są podzielone pomiędzy kilka środowisk wirtualnych. Jednym z typowych i powszechnych zastosowań wirtualizacji serwera są tak zwane serwery www (World Wide Web). Jak również popularnym dostarczaniem niedrogich usług hostingowych są wirtualne serwery internetowe. Zamiast wykorzystywać do tego kilka osobnych komputerów wiele wirtualnych serwerów obcuje na jednym serwerze fizycznym w postaci wirtualnych maszyn.

Wirtualny serwer można utworzyć na kilka sposobów, poniżej przedstawię te reprezentatywne:

  • Wirtualna maszyna, czyli samodzielny system, który działa i zachowuje się jakby całkowicie wyodrębniona maszyna.
  • Wirtualizacja, która znajduje się na poziomie danego systemu operacyjnego polegającemu na partycjonowaniu, czyli podziale, jądra danego systemu operacyjnego. Z danego podziału jądra korzystać będzie wiele wirtualnych maszyn, określanych jako prywatne serwery wirtualne.
  • Para-wirtualna maszyna jest to taka technika wirtualizacji, dzięki której wirtualizowany system operacyjny współdziała ze środowiskiem operacyjnym danego komputera w danym zakresie obsługi takich elementów sprzętowych, których obsługa mogłaby kolidować z funkcjonowaniem innych maszyn wirtualnych.

Wirtualizacja danego serwera daje dużo korzyści. Każdej z wirtualnych maszyn pozwala pracować na macierzystym systemie operacyjnym, jak również mogą być one wyłączane oraz uruchamiane niezależnie od siebie. Zwirtualizowane serwery redukują także koszty, czyli ograniczają ilość niezbędnego hardware, jak również dana wirtualizacja w pełni korzysta z zasobów komputera co znacznie obniża koszty operacyjne (czyli zmniejszenie kosztów obsługi za pomocą użycia mniejszej ilości fizycznych serwerów). Wirtualizacja serwerów jest również ważna dla centrów danych ponieważ pozwala na dobre wykorzystanie miejsca na danych nośnikach przenośnych oraz zmniejsza zużycie energii.

Wirtualizacja desktopów (nazywana również wirtualizacją klienta) jest kwalifikowana jako technologia, która ma na celu odizolowanie środowiska (oprogramowania i systemu) fizycznej jednostki PC od komputera osobistego. Dana technologia wirtualizuje komputery osobiste w taki sposób, aby były udostępniane zwykłym użytkownikom za pomocą sieci. Odbiorcy używają wirtualnego desktopu w taki sam sposób jakby korzystali ze stacjonarnego komputera. Zaletą takiej wirtualizacji jest możliwość zdalnego połączenia oraz zalogowania się do własnego desktopu z każdego miejsca. Takim typowym wykorzystaniem wirtualizacji są centra danych, gdzie przechowuje się i hostuje spore ilości spersonalizowanych desktopów. Jedną z popularnych metod wirtualizacji desktopów jest VDI (Virtual Desktop Infrastucture/Interface). Ta wirtualizacja korzysta z hardware’u, jak i software’u. VDI hostuje środowisko wirtualne w wirtualnej maszynie (VM – Virtual Machine), która uruchomiona jest na scentralizowanym lub zdalnym serwerze.

Dominacją zwirtualizowanych desktopów nad wolno stojącymi, tradycyjnymi jest to, że nie potrzebują one swojego hardware’u, software’u czy systemu operacyjnego. Używanie wirtualizacji desktopów zmniejsza również koszt wdrażania aplikacji oraz obniża czas w momencie braku dostępu do zasobu, na przykład sprzętu.

Zobacz też

Przypisy

  1. T. Krasuski, J. Łoś, M. Szostakiewicz: „Wstęp do wirtualizacji” UW 2005.
  2. Peter Ganten – „Installations – und Bedienungsanleitung für WINE” 2001.
  3. Lifu Wang, Kyung Ryong Dyu: „Feasibility of Exploiting Virtual Machines for Grid Computing” Dep. of Computer Science, Arizona State University Tempe, 2004.