Wirtualizacja

Zofia Barańczuk

Marcin Potkański

Roman Wieczorek


  • Wprowadzenie
  • Cele
  • Implementacja
  • Przykłady rozwiązań istniejących na rynku
  • Problemy i wady

  • 1. Wprowadzenie


    Na początku zdefiniujemy podstawowe pojęcia związane z wirtualizacją.

    Wirtualizacja jest to metodologia polegająca na dzieleniu zasobów komputera na wiele środowisk. Działają one poprzez zastosowanie jednej lub wielu technologii, np. sprzętowe lub softwarowe partycjonowanie, tworzenie maszyny wirtualnej, przydzielanie czasu.

    Maszyna wirtualna

    Symulowany komputer, który jest uruchomiony na komputerze-gospodarzu, ale działa tak, jakby był odrębnym komputerem. Może to być np. stary sprzęt, który nie jest juz dostępny, projektowany sprzęt,. który jeszcze nie jest dostępny. Może to być również symulowany ,,zwykły'' komputer, np. w celu uruchamiania wielu systemów operacyjnych. Istotne jest, aby maszyny wirtualne były izolowane od siebie. Niedopuszczalne jest, aby wykonywanie pewnych operacji na jednej maszynie wirtualnej wpływało na inna.

    Partycjonowanie sprzętowe

    Pojedynczy system zostaje fizycznie podzielony na kilka partycji. Ustalają one granice zasobów sprzętowych.

    Partycjonowanie softwarowe

    Kilka instancji systemów operacyjnych jest wykonywanych jednocześnie na jednym komputerze. Podział jest dokonywany przy pomocy samego oprogramowania.

    Przydzielanie czasu

    Kiedy maszyna wirtualna potrzebuje wykonać instrukcje procesora, zostaje jej przydzielona pewna jednostka czasu. Nie odbywa się to jednak bezpośrednio poprzez procesor, lecz przez symulację. Jedna instrukcja do maszyny wirtualnej wywołuje setki lub więcej instrukcji procesora.


    Tworzenie maszyny wirtualnej może odbywać się na rożne sposoby:

    Emulacja sprzętu

    Jeden system odtwarza działanie innego (komputer, ale także inny sprzęt elektroniczny). Zachowanie odtwarzanego systemu jest takie, jak oryginalnego, mogą się jednak różnic szybkością. Różnice te przy bardziej skomplikowanych emulacjach mogą stanowić poważny problem. Emulatory są często pisane np. w C, a każda instrukcja procesora wymaga co najmniej kilku instrukcji w C, które z kolei wymagają wykonania wielu instrukcji procesora gospodarza. Jeśli emulacja jest robiona na tylko podstawie obserwowanych własności systemu, mówimy o ,,wstecznym przetwarzaniu''. Przy emulacji możemy korzystać ze wsparcia sprzętowego, jeśli architektura gościa i gospodarza są takie same. W przypadku, gdy są inne, potrzebne jest odtworzenie architektury gościa na gospodarzu. Oznacza to miedzy innymi konieczność stworzenia wirtualnego procesora, pamięci, portów, karty sieciowej itp. Przykłady czystych emulatorow: Bochs, DOSEMU, Virtual PC for MAC

    Emulacja OS/API

    Emulowany jest system operacyjny przy pomocy narzędzi gospodarza. Nie jest to emulacja całego komputera. Wada jest mniejsza przenosnosc. Trudniej jest osiągnąc pełną kompatybilność. Wynika to z większej złożoności zależności miedzy systemem operacyjnym i aplikacjami niż miedzy systemem operacyjnym a fizycznym komputerem. Zaleta jest znacznie większa szybkość niż emulacji sprzętowej. Instrukcje maszynowe nie muszą być tłumaczone do innej architektury.

    Przykład emulatora OS: Wine.

    Wirtualizacja

    Wirtualizacja polega na uruchamiania kolejnego systemu operacyjnego, który działa pod tę samą platformę, która mamy. Wykorzystywana jest zgodność sprzętu i pozostaje mało instrukcji, które będą emulowane. Jeśli wirtualizacja odbywa się na poziomie systemu operacyjnego, pomiędzy systemem operacyjnym gościa i gospodarza tworzona jest warstwa VMM (Virtual Machine Monitor). System operacyjny wirtualnej maszyny pozostaje dzięki temu niezmieniony. Szybkość działania jest mniejsza, bo instrukcje muszą przechodzić przez dodatkowa warstwę.

    Przykłady: VMware, Virtual PC.

    Przy wirtualizacji na poziomie sprzętu VMM jest tworzony pomiędzy sprzętem a systemem operacyjnym gościa. VM komunikuje się praktycznie z fizycznym sprzętem, wiec szybkość takiej wirtualizacji jest większa. Wadą jest konieczność wprowadzania zmian w systemie operacyjnym, który chcemy uruchomić.

    Przykłady: Xen.


    2. Cele


    1. Łączenie stacji roboczych kilku nie w pełni wykorzystywanych serwerów, na ogół w jedną maszynę (server consolidation). -oszczędność sprzętu, kosztów, administracji.
    2. Konieczność uruchamiania starego oprogramowania na nowym sprzęcie/systemie operacyjnym. W przypadku braku kompatybilności możliwym rozwiązaniem jest wirtualizacja. Aplikacja może działać na nowszym sprzęcie, ale nie wykorzystywać go w pełni i nie być przystosowana do współdziałania w jednym środowisku. Wtedy również można stosować wirtualizację.
    3. Zapewnianie bezpieczeństwa, np. do dynamicznego tworzenia środowiska, w którym będą uruchamiane aplikacje pobierane z Internetu.
    4. Symulacja sprzętu, sieci, niezależnych komputerów, wieloprocesorowości.
    5. Uruchamianie wielu systemów operacyjnych jednocześnie, również różnych wersji, różnych systemów.
    6. Debugowanie i monitorowanie bez straty czasu na restartowanie.
    7. Większa przenośność oprogramowania.
    8. Badania i eksperymenty.
    9. Maszyna wirtualna może służyć do tworzenia arbitralnych scenariuszy testów prowadząc do efektywnej kontroli jakości.
    10. Dodawanie nowych właściwości w istniejących systemach operacyjnych z mniejszym nakładem pracy.
    11. Ułatwione robienie kopii zapasowych, przenoszenia systemu, odzyskiwanie danych.
    12. Efektywny środek zapewniania kompatybilności plików wykonalnych.

    3. Implementacja


    Czyli jak oryginalne instrukcje maszynowe są tłumaczone na wykonywalny kod maszyny wirtualnej.

    1. ddi (decode-and-dispatch interpretation) - Kolejne instrukcje wykonywanego programu są sprowadzane i tłumaczone na kod zrozumiały dla gospodarza za każdym wykonaniem. Wadą takiego rozwiązania jest mala szybkość. Szczególnie niekorzystne przy wykonywaniu wielu takich samych instrukcji.
    2. pi (predecode interpretation) - Instrukcje wykonywanego programu są tłumaczone do formy szybszej do dekodowania. Wtedy kolejne iteracje potrzebują sprowadzać i dekodować tylko te ,,szybka'' formę.

      Wada: Interpretacja może się odbywać przed wywołaniem programu, przy wywołaniu lub podczas wykonywania. Jeśli oryginalne instrukcje zmienia się, ,,szybka'' forma może stracić zgodność z oryginalna reprezentacja. Jeśli system nie uaktualni tej formy przed powtórnym wykonaniem, będzie symulował stare instrukcje.

    3. scc (static-cross-compilation) Statyczna binarna translacja. - Instrukcje maszynowe architektury gościa są statycznie tłumaczone na instrukcje architektury gospodarza. Przetłumaczone instrukcje są zapamiętywane o nie wymagają powtórnej translacji, gdy maja znowu zostać wykonane.

      Koszty translacji są ponoszone przed uruchomieniem programu, wiec efektywność podczas wykonywania jest duża. Pewne instrukcje nie mogą zostać przetłumaczone statycznie (jeśli nie mogą zostać statycznie zalokowane -samomodyfikujacy się kod).

    4. dcc (dynamic cross compilation) Dynamiczna binarna translacja. - Kod gospodarza jest generowany dynamicznie podczas wykonywania programu. Tłumaczone są tylko te instrukcje, które nie zostały przetłumaczone przed wykonaniem programu lub zostały w międzyczasie zmienione. Wymaga to przechowywania wielu informacji w pamięci. Innymi wadami dynamicznej binarnej translacji są: poziom komplikacji i duża zależność od procesora. Czasochłonna jest sama translacja.


    4. Przykłady rozwiązań istniejących na rynku


    Wine

    Wine umożliwia wykonywanie programów DOS-a i MS Windows pod Linuxem. Składa się z głównego programu, który ładuje i wykonuje pliki binarne Windows, oraz zestawu bibliotek. Implementują one wywołania Windows API wykorzystując do tego unixowe odpowiedniki. Niestety nie wszystkie programy można uruchomić, gdyż część bibliotek nie jest narazie zaimplementowanych. Sugerowane jest aby urachamiać programy zainstalowane wcześniej na partycji window, jednak nie jest to konieczne, można w wine uruchomić instalator takiego programu, a przy okazji zobaczyć jak interpretuje nasz system plików.

    Dostarcza wsparcie dla Win32 (9x/NT/XP), Windows3.x i plikow binarnych DOS-a. Każdy wywoływany proces Win32 ma własna przestrzeń adresowa. Dostarcza wsparcie dla karty dźwiękowej, modemu itd.

    licencja: GPL, choć niektóre pliki maja licencje Wine'a.

    Bochs

    Bochs symuluje w pełni komputer Intel x86 -procesor, urządzenia, pamięć, BIOS. Interpretuje każdą instrukcję x86. Symuluje całe środowisko PC. Dzięki temu jest przenośny, ale wolny. Bochs jest przeznaczony do uruchamiania na różnych platformach -x86, PPC, Alpha, Sun, MIPS. Uruchamiany na x86 działa znacznie szybciej -pewne instrukcje mogą być wspomagane sprzętowo. Bochs współpracuje z systemem operacyjnym, na którym jest uruchamiany. Stąd pewne cechy są realizowane tylko na wybranych platformach.

    Bochs używa GNU autoconf do konfiguracji Makefile'i oraz nagłówków. Autoconf umożliwia Bochs'owi kompilację na różnych platformach. Dostarcza wsparcie dla ,,abstrakcji''stacji dyskietek na wszystkich platformach. Pod Unixem i Windows XP/NT/2000 umożliwia dostęp do fizycznej stacji dyskietek. Emuluje CDROM. Bochs umożliwia (od wersji 1.4) bootowanie z bootowalnego cd lub ,,iso image'' Może symulować do 15 procesorów. Umożliwia kopiowanie tekstu między gospodarzem i gościem.

    Licencja: GPL

    VMware Workstation

    VMware Workstation umożliwia wielu systemom operacyjnym działanie na jednym komputerze. Działają one niezależnie. VMware rozdziela zasoby (procesor, pamięć, dyski, urządzenia) wśród działających wirtualnych maszyn. Działają one jak standardowe komputery x86. VMware emuluje cały komputer z konfigurowalnym BIOS-em i dostępem do pamięci, karty graficznej, karty sieciowej. Pozwala korzystać z fizycznego dysku jak rownież umożliwai utworzenie wirtuanlego dysku tworząc plik na dysku gospodarza. Może emulować następujące systemy: Linux, FreeBSD, DOS, Windows 3.1, Windows 95, Windows 98, Windows NT, Windows 2000, Windows XP.

    Głównym zastosowaniem VMware jest symulacja sieci na jednym komputerze, bezpieczne testowanie systemów operacyjnych, uruchamianie nowego systemu operacyjnego ze starym oprogramowaniem na jednym komputerze. Możemy utworzyć wirtualną sieć dodając wirtualne karty, udostępniając fizyczną karte gospodarza lub korzystając z protokołu NAT(network adress translation).

    Licencja: VMWare + licencje systemów, które maja zostać uruchomione.

    Virtual PC

    Tworzy wirtualne maszyny pod systemem Windows. Virtual PC wirtualizuje kompletny fizyczny komputer x86. Dając dostęp do urządzeń koputera gospodarza(czytnik CD, karty sieciowe, inne) lub też korzystanie z urządzeń sztucznych(obraz ISO, ekran wewnątrz okna z ustaloną rozdzielczością). Umożliwia uruchamianie wielu systemów operacyjnych PC na jednej stacji roboczej. Zapewniane jest wsparcie dla Windows XP Professional, Windows XP Tablet Edition,Windows 2000 Professional. jako gospodarza oraz dla Windows XP, Windows 2000 Professional, Windows NT 4.0 Workstation, Windows ME, Windows 98, Windows 95, MS-Dos 6.22 jako gościa. Można pod nim uruchamiać również inne systemy operacyjne jednak działają one znacznie wolniej(Linux nawet do czterech razy!!!).

    Virtual PC zapewnia duże bezpieczeństwo danych, ułatwia testowanie danego scenariusza. Przechowuje dokonywane zmiany w tymczasowych plikach. Na zakończenie działania można dane te wprowadzić lub pominąć.

    Licencja: VirtualPC + licencja emulowanego systemu.

    Transitive

    Transitive przy pomocy dynamicznego translatora tłumaczy kod z instrukcji jednej architektury w drugą. Kod jest optymalizowany i przechowywany w pamięci, wiec optymalizacje danego fragmentu dokonywane są jednokrotnie. Zwiększa to szybkość Transitive'a. Często wykonywany fragmenty kodu są jednak często sprawdzane przez ,,optymalizator'', aby uniknąc wykonywania kodu, który został juz zmieniony

    Przełącznik systemu operacyjnego przełącza wywołania jednego systemu operacyjnego na drugi jeśli jest on rożny u gościa i gospodarza. Również bardzo różniące się miedzy sobą środowiska graficzne mogą być przełączane.

    QEMU

    Emulator procesora. Używa dynamicznej translacji.

    Ma dwa tryby:
    1. emulacja całego systemu. Emulowany jest procesor i urządzenia peryferyjne. Używane do uruchamiania różnych systemów operacyjnych bez konieczności restartowania lub w celu debugowania kodu systemu.
    2. emulacja przestrzeni użytkownika - tylko pod Linuxem. QEMU umożliwia uruchomienie pod jednym procesorem procesów skompilowanych pod innym.
    Istnieją dwie wersje QEMU:
    1. ,,szybkie'' QEMU- używa jednostki zarządzania pamięcią gospodarza (MMU) do symulacji x86 MMU. Jest to szybki sposób, ale nie może być użyta cała przestrzeń adresowa. Nie ma rozdzielenia między pamięcią adresową gościa i gospodarza, co zagraża bezpieczeństwu danych.
    2. QEMU używa MMU tworzonego przy pomocy oprogramowania. Jest to około dwukrotnie wolniejsze, ale dokładniej emuluje MMU, zapewnia separację przestrzeni adresowej gospodarza i gościa.

    Nie wymaga łatek na jądro. Symuluje kompletny komputer.

    QEMU symuluje do 6 kart sieciowych. Używa BIOS-u PC z projektu Bochsa. Dostarcza wsparcie dla stacji dyskietek, portów sieciowych.

    Licencja: GPL

    The Xen

    Monitor maszyny wirtualnej dla x86. Realizuje uruchamianie wielu systemów operacyjnych na jednym komputerze. Zamiast poziomu uprzywilejowania 0, system operacyjny otrzymuje 1 -0 jest zarezerwowane dla Xen. To uniemożliwia gościom włączanie/wyłączanie przerwań. Muszą zgłaszać chęć wykonania takich operacji do Xen-a. Zaprojektowany jest asynchroniczny interfejs wywołań. Dzięki temu zgłoszenia te są stosunkowo rzadkie.

    Xen eksportuje specjalnie zaprojektowaną abstrakcję urządzeń blokowych i interfejsu sieciowego do systemu operacyjnego gościa.

    Licencja: GPL

    User-Mode Linux

    Służy do uruchamiania Linuxa pod Linuxem. Stosowany głównie do debugowania, eksperymentów z nowymi wersjami bez ryzyka uszkodzeń systemu.

    Licencja: GPL

    DOSEMU

    DOSEMU pozwala uruchamiać DOS-a i programy DOS-a pod Linuxem. Jest programem z przestrzeni użytkownika, który używa specjalnych własności jądra Linuksa i procesora 80386/Pentium itp. do uruchamiania systemów MS-DOS, FreeDOS, DR-DOS w ,,DOS-owym okienku''. Umożliwia ono wirtualizację wejścia/wyjścia, śledzenie wywołań BIOS-a i DOS-u i emulacje takich wywołań. Daje możliwość dostarczania usług DOS-a poprzez Linuksa, np. wirtualny dysk, który w rzeczywistości jest katalogiem pod Linuksem.

    Licencja: GPL

    PearPC

    Działa na platformach POSIX-X11, Win32. Umożliwia emulacje PowerPC, na której mogą działać np. Mandrake'a, MAC OS x 10.3 Emuluje CPU GENERIC, USB. Działa tylko na 32-bitowej architekturze. Obecnie jest jeszcze wiele niezaimplementowanych własności które mogą powodować poważne błędy.

    Licencja: GPL


    5. Problemy i wady


    1. Szybkość - Jest główną wada tworzenia maszyn wirtualnych. Narzuty czasowe przy czystej emulacji są nawet 500-krotne.
    2. Trudności przy wirtualizacji niektórych systemów/architektur. Np. x86 jest właściwie nieprzystosowany do wirtualizacji. Nie wszystkie instrukcje procesora muszą być wykonywane w trybie uprzywilejowanym. Wykrywanie instrukcji uprzywilejowanych jest proste (zostaje zgłoszone przerwanie). W przypadku instrukcji nieuprzywilejowanych konieczne jest monitorowanie maszyny wirtualnej. Jeśli instrukcje działają w wirtualnym środowisku niepoprawnie, muszą zostac wykryte i maszyna wirtualna ma ich nie wykonywać.