Wirtualizacja za pomocą Xen

Wprowadzenie

W ostatnim czasie bardzo modna stała się wirtualizacja. Polega ona z grubsza na tym, że na fizycznym komputerze uruchomione jest oprogramowanie pozwalające działać wielu wirtualnym komputerom, zwanym zwykle wirtualnymi maszynami. Modele działania są zwykle dwa (klasyfikacja za Robertem P. Golbergiem).

  • Typ 1 (natywny) oprogramowanie do wirtualizacji pełni jednocześnie rolę bazowego systemu operacyjnego.
  • Typ 2 (hostowany) — instalujemy jakikolwiek system np. Windows lub Linux, a na nim oprogramowanie do wirtualizacji.
Rozsądek podpowiada, że model natywny wirtualizacji powinien być efektywniejszy (i pewnie tak jest), jednak nie dysponuję żadnymi wiarygodnymi porównaniami w tej materii. Inny podział to sposób działania wirtualizatora. Tutaj też mamy 2 metody.
  • Pełna wirtualizacja. Oprogramowanie do wirtualizacji w pełni symuluje fizyczny komputer i tylko z tym oprogramowaniem kontaktuje się wirtualizowany system operacyjny (zwany często systemem-gościem, wirtualizator zwany jest wtedy systemem-hostem). Zaletą jest dowolność systemu-gościa, ale wadą zwykle mniejsza wydajność.
  • Para-wirtualizacja. Wirtualizowany system kontakt ze sprzętem nie przez wirtualizator, ale przez odpowiednie API dostarczane przez wirtualizator. W tym modelu system-gość jest świadom wirtualizacji, co więcej, musi ją wspierać. Zaletą tego modelu jest zwykle większa wydajność, ale wadą są ograniczenia dotyczące wirtualizowanego systemu, który musi po prostu przystosowany do konkretnego wirtualizatora.

Głównymi graczami na rynku wirtualizacji są VMware, Parallels oraz Microsoft. W artykule przyjrzymy się rozwiązaniu o nazwie Xen, które wspiera para-wirtualizację systemów Linux.

Architektura Xen

Xen składa się z dwóch głównym elementów:

  • Virtual Machine Monitora, zwanego też wirtualizatorem lub hypervisorem, pełniącego rolę warstwy pośredniej pomiędzy maszynami wirtualnymi a sprzętem.
  • narzędzi do zarządzania.

Przy starcie systemu, wirtualizator musi być uruchomiony przed włączeniem jakiekolwiek maszyny wirtualnej, które to maszyny nazywamy domenami (domains). Z jedna z domen jest wyróżniona (domain0) i to na niej jest uruchomiony xend, za pomocą którego możemy zarządzami wszystkimi maszynami. Domain0 zwany jest także uprzywilejowanym domain.

Instalacja Xen

Instalacja polega na instalacji pakietów: xen, xen-tools, kernel-xen i ewentualnie xen-doc-*. Niezbędna jest także odpowiednia modyfikacja pliku /boot/grub/menu.lst, ponieważ system trzeba niejako uruchomić w trybie Xen, jednak po instalacji systemu odpowiedni wpis jest zwykle dodany. Dodatkowo warto wyłączyć domyślnego firewalla, ponieważ złożona konfiguracja sieci w przypadku wirtualizacji może być dla niego kłopotliwa (a my będziemy mieć zablokowany dostęp do sieci):

# chkconfig SuSEfirewall2_init off
# chkconfig SuSEfirewall2_setup off

W przypadku, gdyby firewall nie chciał się wyłączyć (miałem taką sytuację), wtedy możemy ręcznie ustawić domyślne polityki na ACCEPT (u mnie rozwiązało to problem):

# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD ACCEPT

Zarządzanie maszynami wirtualnymi

Najprościej zarządzać maszynami przez moduł YaSTj-a Virtual Machine Management (Xen). Po jego uruchomieniu pojawia nam się lista z aktualnie dostępnymi maszynami oraz szeregiem akcji do wykonania (np. dodanie nowej maszyny czy wyłączenie wybranej). Ponieważ moduł YaST jest bardzo intuicyjny, dalej krótko umówimy zarządzanie za pomocą poleceń linii komend.

Najpierw przyjrzymy sie krótko plików konfiguracyjnym. W katalogu /etc/xen/examples są przykładowe pliki konfiguracyjne. Z tych istotniejszych:

  • xmexample1 — plik dla pojedynczej domain,
  • xmexample2 — plik dla konfiguracji wielu domain.

Jeśli skorzystamy z modułu YaST to utworzy on automatycznie odpowiednie pliki i zapisze je w /etc/xen/vm/. Korzystając z powyższych plików przykładowych możemy także utworzyć konfigurację samodzielnie.

Podstawowym narzędziem do zarządzania maszynami wirtualnymi jest xm. Składnia:

xm polecenie [opcje] [argumenty] [zmienne]

Najpierw kilka poleceń jak uzyskać pomoc:

# xm help
# xm help --long
# xm help komenda

Najpierw sprawdzimy listę maszyn:

# xm list

W wyniku dostajemy m.in. domain id, które jest potrzebne do szeregu operacji na maszynie (np. do zapisania stanu czy zatrzymania maszyny) oraz stan (możemy ustalić, że maszyna jest np. w stanie pauzy). Szybko przegląd stanów: r — uruchomiona, b — zablokowana, p — spauzowana, s — w trakcie wyłączania, c — zepsuta (crashed).

Jeśli chcemy uruchomić maszynę:

# xm create -c -f /etc/xen/vm/fileserver
Możemy wykonywać zwykłe czynności konserwacyjne:
# xm pause domain_id
# xm unpause domain_id
# xm shutdown domain_id
# xm destroy domain_id
# xm save domain_id filename
# xm restore filename
Bardzo przydatne jest także podłączenie konsoli do wybranej maszyny:
# xm console domain_id
oraz ustawienie pamięci RAM dla wybranej maszyny:
# xm mem_set domain_id rozmiar_pamieci

przy czym rozmiar pamięci podajemy w MB.

Warto też dodać, że zamiast domain_id można w powyższych poleceniach dać także nazwę domain.

Automatyczne uruchamianie maszyn

Pierwsza uwaga jest taka, że żadna maszyna nie może działać, jeśli domain0 nie działa. Natomiast w katalogu /etc/xen/auto możamy podlinkować pliki konfiguracyjna maszyn, które mają się uruchamiać automatycznie. I to wystarczy. Więcej opcji mamy w pliku /etc/sysconfig/xendomains.

Konfiguracja sieci w środowisku Xen

Ponieważ artykuł ma być tylko wprowadzeniem w świat Xen, nie będziemy się tutaj wdawać niuanse i różnorodność możliwych konfiguracji — omówimy konfigurację opartą o tzw. bridging (bridging najprościej mówiąc to mechanizm, który łączy wiele interfejsów sieciowych w jeden interfejs). Najpierw zauważmy, że w momencie uruchomienia wirtualizji Xen, w systemie pojawia się szereg różnych interfejsów sieciowych, które można pogrupować następując:

  • peth. Urządzenie fizyczne podłączone do domain0.
  • vif. Intefejs wirtualny, który umożliwi podłączenie kart sieciowych w domen. Schemat jest dokładnie taki: vifX:Y, gdzie X to numer domain, a Y numer karty sieciowej w domain, np. vif0.0 to pierwsza karta sieciowa w domain0.
  • eth0, veth. Interfejsy w domain; są podłączone do interfejsów vif. Zasada jest taka, że pierwszy interfejs w domain to eth0, a kolejne to veth1, veth2, itd. Domyślnie tworzonych jest w sumie 7 interfejsów.
  • xenbr0. Most łączący intefejsy peth i vif.

Zależności pomiędzy poszczególnymi interfejsami są na poniższym obrazku
(za wiki.xensource.com/xenwiki/XenNetworking):

Xen Bridging

Uwaga: na powyższym obrazku drugi interfejs w domain1 nazywa się eth1, w SLES byłoby to veth1.

Do zarządania mostem mamy polecenie brctl. Najprostszym użyciem jest wyświetlenie aktualnej konfiguracji mostu:

# brctl show

Krótko podsumowując: przy domyślnej instalacji najprostsza konfiguracja dostępu do sieci w danej domain polega na:

  • wyłączeniu firewalla w domain0,
  • skonfigurowaniu eth0 w domainU.

Literatura