# Charakterystyka wybranej techniki wirtualizacji (to jest oczywiście dość rozległe zagadnienie i sami możecie wybrać o czym dokładnie powiecie, tu spróbowałem zebrać trochę informacji o różnych odmianach wirtualizacji, tak żebyście mieli rozeznanie w temacie) __Wirtualizacja sprzętu__ Istotą wirtualizacji sprzętu jest uruchamianie na jednym fizycznym komputerze (__gospodarzu__, ang. _host_) wielu maszyn wirtualnych (__gości__, ang. _guest_), działających jak oddzielne komputery i umożliwiających instalację różnych systemów operacyjnych. Istnieją dwa rodzaje wirtualizacji sprzętu: - __pełna wirtualizacja__ – wirtualizacja całego sprzętu wchodzącego w skład maszyny wirtualnej, dzięki czemu system operacyjny gościa pracuje tak samo, jak na fizycznej maszynie (z jego poziomu nie widać żadnej różnicy) i nie musi być modyfikowany do uruchamiania na maszynie wirtualnej, - __parawirtualizacja__ – uruchamianie w wydzielonym środowisku gościa specjalnie zmodyfikowanej wersji systemu operacyjnego, tak by nie była konieczna wirtualizacja sprzętu, dzięki czemu system gościa może pracować wydajniej niż w przypadku pełnej wirtualizacji. Oprogramowanie służące do tworzenia maszyn wirtualnych na maszynie gospodarza nazywa się __hipernadzorcą__ (ang. _hypervisor_) lub __menedżerem maszyn wirtualnych__ (ang. _virtual machine monitor_). Wyróżniane są dwa rodzaje hipernadzorców: - __hipernadzorca typu 1__ – uruchamiany bezpośrednio na sprzęcie gospodarza i mający nad nim pełną kontrolę, umożliwiający uruchamianie systemu operacyjnego gościa w trybie parawirtualizacji lub pełnej wirtualizacji – przykłady: Xen, VMware ESX, Microsoft Hyper-V, - __hipernadzorca typu 2__ – uruchamiany jako program pod kontrolą systemu operacyjnego gospodarza, umożliwiający uruchamianie systemu operacyjnego gościa w trybie pełnej wirtualizacji jako jeden z procesów w systemie gospodarza – przykłady: VirtualBox, VMware Workstation, KVM. W celu zwiększenia wydajności zwirtualizowanych systemów zostały opracowane technologie __sprzętowego wspomagania wirtualizacji__ (w przypadku architektury x86: Intel VT-x, AMD-V). Pozwalają one hipernadzorcy obsługiwać sprzętowo część żądań systemu gościa zamiast ich przetwarzania programowego, co zmniejsza obciążenie maszyny gospodarza (i jest istotne przede wszystkim przy pełnej wirtualizacji). __Wirtualizacja na poziomie systemu operacyjnego (konteneryzacja)__ Konteneryzacja polega na uruchamianiu w obrębie jednego systemu operacyjnego różnych aplikacji w wydzielonych, izolowanych przestrzeniach użytkownika (nazywanych kontenerami). Każdy kontener posiada swój system plików (zawierający wszystkie zależności potrzebne do uruchomienia aplikacji), współdzieli natomiast z systemem gospodarza jądro systemu operacyjnego. Dzięki temu możliwe jest zapewnienie różnym programom oddzielnych środowisk roboczych bez konieczności wirtualizacji systemu operacyjnego i związanych z tym spadków wydajności. Przykłady: Docker (Linux, obecnie najpowszechniejszy mechanizm konteneryzacji), wbudowane mechanizmy Linuksa (LXC), Solarisa (zones), FreeBSD (jails). __Wirtualizacja sieci__ Wyróżnia się dwa podstawowe rodzaje wirtualizacji sieci: - __wewnętrzną__ – wirtualizacja interfejsów sieciowych, przełączników i innych urządzeń sieciowych w celu zapewnienia łączności maszyn wirtualnych (lub kontenerów) w zależności od potrzeby między sobą nawzajem, systemem gospodarza lub siecią zewnętrzną, - __zewnętrzną__ – logiczny podział sieci lokalnych na podsieci, niezależnie od fizycznej struktury sieci (VLANy) __Wirtualizacja serwerów__ Wykorzystanie różnych rodzajów wirtualizacji (np. wirtualizacji sprzętu lub konteneryzacji i wirtualizacji sieci) do uruchamiania na jednej fizycznej maszynie wielu niezależnych serwerów, mogących posiadać różnych administratorów. Umożliwia to często optymalniejsze wykorzystanie zasobów fizycznych serwerów i ułatwia utrzymanie sprzętu w porównaniu z używaniem oddzielnych fizycznych maszyn dla każdego z serwerów. __Wirtualizacja pulpitu__ Wykorzystanie różnych rodzajów wirtualizacji w celu oddzielenia używanego przez użytkownika systemu operacyjnego od sprzętu, przy którym użytkownik pracuje. Najczęściej system operacyjny jest uruchomiony na serwerze, a użytkownicy łączą się z nim przez sieć (zwykle za pomocą cienkich klientów) – dzięki temu użytkownik ma dostępne zawsze to samo środowisko pracy niezależnie od stanowiska, ułatwia to też administrację systemami użytkowników. W prostszym wariancie może być wykorzystana wirtualizacja sesji – wtedy wielu użytkowników używa jednego systemu operacyjnego uruchomionego na odpowiednio wydajnym serwerze – przykłady: LTSP (projekt społecznościowy), Sun Ray (Oracle, wycofywany). W bardziej skomplikowanym wariancie używa się wirtualizacji sprzętu – system operacyjny każdego z użytkowników jest uruchomiony w maszynie wirtualnej na serwerze – przykłady: VMware Horizon, Citrix XenDesktop. __Wirtualne sieci prywatne (VPN)__ Wykorzystanie wirtualnych szyfrowanych połączeń punkt-punkt (z własną adresacją IP, rotuingiem, itp.) zestawianych przez publiczne łącza, w celu łączenia odległych sieci lokalnych bezpiecznym kanałem bez konieczności dzierżawienia własnych łącz od operatorów (co jest kosztowne) lub w celu zdalnego dostępu do sieci wewnętrznej z dowolnego miejsca w internecie (np. do sieci firmowej z domu pracownika) – przykładowe protokoły: OpenVPN, IKEv2+IPSec, Cisco IPSec.