Konfiguracja Xen w Gentoo
1.
Wprowadzenie
Xen umożliwia uruchamianie kilku
systemów operacyjnych na jednym fizycznym systemie, zarządza zużyciem zasobów i
przenosi domeny będące wirtualnymi środowiskami, w których uruchomiony jest
system-gość z jednego systemu opartego na Xen do innego. Xen wymaga, by system
bazowy wspierał technologię Xen (w przypadku Linuksa należy wkompilować obsługę
Xen w jądro systemu), system-gość nie potrzebuje żadnych modyfikacji
jeśli posiadany sprzęt wspiera Intel Virtualization Technology (VT-x) lub
AMD Virtualization Technology (SVM). W przeciwnym razie system-gość również musi
wspierać technologię Xen.
Ten artykuł omawia krok po kroku kolejne etapy konfiguracji Xen do pracy w
systemie Gentoo Linux. Nie będzie tu omawiana technologia Xen sama w sobie
(projekt Xen ma bowiem dość obszerną
dokumentację). Najpierw należy zająć się ustawieniami, które mogą być
bardzo interesujące dla poszczególnych instalacji Xen, ale niekoniecznie
związane z samym Xen (np. eksportowanie Portage przez protokół NFS,
uruchamianie Linuksa przy pomocy PXE, itp.).
2.
Przygotowywanie Domeny0
Wprowadzenie
Domena0 jest główną domeną pod Xen, system operacyjny hosta zarządza
wszystkimi innymi domenami. W tym rozdziale omówione zostanie przygotowanie
istniejącej instalacji Gentoo do pełnienia roli systemu-hosta w tej domenie i
zbudowane jądro oparte na Xen. Po tych zmianach Gentoo będzie gotowe do
hostowania innych domen Xen.
Przebudowywanie instalacji Gentoo
Ważną i zwykle konieczną zmianą jest przebudowanie całego Gentoo z innymi
ustawieniami CFLAGS. W przeciwnym wypadku systemy uruchamiane pod
kontrolą Xen mogą mieć bardzo słabą wydajność. W przypadku gdy chodzi jedynie o
przetestowanie platformy Xen można pominąć ten krok. W tym przypadku strata
wydajności będzie odczuwalna, ale Xen będzie działać poprawnie.
Ważne:
GCC w wersji niższej niż 4 z ustawioną flagą -Os może produkować zepsuty
kod.
|
Listing 2.1: Edycja CFLAGS i przebudowa Gentoo |
~# nano -w /etc/make.conf
CFLAGS="-O2 -march=pentium4 -pipe -mno-tls-direct-seg-refs"
~# emerge -e world
|
Jeśli system jest uruchamiany z użyciem wewnętrznego ramdysku (initrd), należy
też przebudować initrd. Najlepiej zrobić to przechodząc wszystkie kroki związane
z przebudową jądra systemu.
Instalacja Xen
Xen zawiera sporo składników, będzie więc potrzebna instalacja kilku pakietów.
Ponieważ Xen jest wciąż ~zamaskowany
należy dodać odpowiednie wpisy do /etc/portage/package.keywords i
dopiero potem zainstalować pakiety.
Listing 2.2: Odmaskowywanie i instalacja Xen |
~# nano -w /etc/portage/package.keywords
app-emulation/xen
app-emulation/xen-tools
sys-kernel/xen-sources
~# emerge xen xen-tools xen-sources
|
Budowanie jądra
Następnie należy zbudować jądro Linuksa wspierające Xen. To jądro, którego
źródła są dostępne w /usr/src/linux-2.6.x.z-xen będzie głównym
jądrem obsługującym domenę0. W sekcji XEN znajdują się sterowniki dla
różnego rodzaju urządzeń wejścia/wyjścia. Każdy sterownik ma dostępne dwa
rodzaje implementacji: backend i frontend. Dla jądra domeny0 niezbędna jest
implementacja sterowników typu backend: są one używane przez inne domeny
(używające sterowników typu frontend) do bezpośredniej komunikacji ze
sprzętem.
Oczywiście nie można zapomnieć o wybraniu Xen-compatible w sekcji
Processor type and features. Jeśli chodzi o sieć to każdy interfejs w
domenie jest bezpośrednio połączony z interfejsem domeny0 (nazywa się
vifX.Y gdzie X oznacza numer domeny, a Y kolejny numer interfejsu w
domenie). Sieć można skonfigurować wg uznania (mostkowanie, NAT, itp.)
Listing 2.3: Włączanie wsparcia dla Xen w jądrach i386 |
Processor type and features --->
Subarchitecture Type (Xen-compatible)
|
Listing 2.4: Włączanie wsparcia Xen w jądrach x86_64 |
Processor type and features --->
Subarchitecture Type (PC-compatible)
[*] Enable Xen compatible kernel
|
Listing 2.5: Domena-0 Konfiguracja jądra |
Bus options (PCI etc.) --->
[*] PCI support
[ ] Xen PCI Frontend Debugging
Networking --->
Networking options --->
<*> 802.1d Ethernet Bridging
XEN --->
[*] Privileged Guest (domain 0)
<*> Backend driver support
<*> Block-device backend driver
<*> Network-device backend driver
<*> PCI-device backend driver
PCI Backend Mode (Virtual PCI) --->
[*] Scrub memory before freeing it to Xen
[*] Disable serial port drivers
Xen version compatibility (3.0.4 and later)
|
Listing 2.6: Domena-U Konfiguracja jądra |
Bus options (PCI etc.) --->
[ ] PCI support
Device Drivers --->
SCSI device support --->
< > SCSI device support
XEN --->
[ ] Privileged Guest (domain 0)
<*> Block-device frontend driver
<*> Network-device frontend driver
[*] Scrub memory before freeing it to Xen
[*] Disable serial port drivers
Xen version compatibility (3.0.4 and later)
|
Ciekawą opcją jest zmuszenie jądra systemu do przechowywania akcesoryjnych
plików obiektowych w innym miejscu. Możliwe jest wtedy użycie tego samego drzewa
jądra do zbudowania różnych konfiguracji:
Listing 2.7: Budowanie jądra |
~# mkdir -p ~/build/dom0 ~/build/domU
~# make O=~/build/dom0 menuconfig
~# make O=~/build/dom0 && make O=~/build/dom0 modules_install
|
Kiedy jądro zostanie zbudowane, jego obraz znajdzie się natychmiast w katalogu
ze źródłami (nie w arch/ ani żadnym innym podkatalogu) pod nazwą
vmlinuz. Należy skopiować ten plik do katalogu /boot
oraz skonfigurować bootloader do współpracy z Xen hypervisor (jednym z
poprzednio zainstalowanych pakietów) zapisanym jako /boot/xen.gz. W
konfiguracji bootloadera należy dodać nowo zbudowane jądro. Dla programu GRUB:
Listing 2.8: Konfiguracja GRUB-a dla Xen |
title Xen 3.0 / Gentoo Linux 2.6.x.y
root (hd0,0)
kernel /boot/xen.gz
module /boot/kernel-2.6.x.y-xen0 root=/dev/hda3
|
Teraz należy ponownie uruchomić komputer. Przy każdym uruchomieniu należy
załadować usługę Xen:
Listing 2.9: Ładowanie usługi Xen |
~# /etc/init.d/xend start
|
Należy sprawdzić czy możliwe jest wszystko to co na normalnym systemie. Jeśli
tak to można ustawić bootloader, by uruchamiał Xen domyślnie oraz dodać usługę
Xen do uruchamiania podczas startu systemu.
Uwaga:
Jeśli chcemy by domeny-goście startowały automatycznie z systemem należy dodać
xendomains do domyślnego poziomu uruchomieniowego oraz utworzyć
dowiązanie symboliczne w /etc/xen/auto/ do plików konfiguracyjnych
domen Xen, które mają zostać uruchomione.
|
3.
Tworzenie nieuprzywilejowanej domeny
Budowanie jądra
Należy przejść do katalogu ze źródłami jądra Xen i zaktualizować konfigurację.
Dobrym pomysłem jest skonfigurowanie wszystkiego tak jak w głównym jądrze i
jedynie dokonanie zmiany implementacji sterowników z backend na
frontend. Następnie należy zbudować jądro i umieścić otrzymany plik
vmlinuz w odpowiednim miejscu (może to być
/mnt/data/xen/kernel):
Listing 3.1: Budowanie jądra systemu-gościa |
~# make O=~/build/domU
~# cp ~/build/domU/vmlinuz /mnt/data/xen/kernel/kernel-2.6.x.y-xen
|
Możliwe jest również zbudowanie pojedynczego jądra zarówno dla domeny
administracyjnej jak i dla domeny nieuprzywilejowanej. Więcej informacji na ten
temat można znaleźć w manualu Xen.
Creating the Domain Disks
By osiągnąć najlepsze wyniki, doskonałym rozwiązaniem jest przeznaczenie całej
partycji (bądź woluminu logiczny) na domenę zamiast systemu plików opartego na
pojedynczym pliku. Jeśli jednak Xen ma być używany głównie jako platforma
testowa, system plików oparty na pojedynczym pliku ma pewne zalety (głównie w
kwestii podtrzymywania).
System plików oparty na pliku można utworzyć używając dd i mke2fs
(lub innego dowolnego narzędzia do tworzenia systemu plików). Na przykład, by
utworzyć plik o rozmiarze 2GB zawierający system plików ext3:
Listing 3.2: Tworzenie systemu plików opartego na pliku |
~# dd if=/dev/zero of=/mnt/data/xen/disks/ext3root.img bs=1M count=2048
~# mke2fs -j /mnt/data/xen/disks/ext3root.img
|
Konfigurowanie domeny
Następnie należy utworzyć plik konfiguracyjny dla domeny. Można je przechowywać
w dowolnym miejscu, przykładowo w /mnt/data/xen/configs. Jako
przykład zostanie utworzony plik konfiguracyjny dla małego środowiska opartego
na Gentoo korzystającego z uprzednio stworzonego obrazu dysku:
Listing 3.3: Tworzenie pliku konfiguracyjnego dla domeny |
~# nano -w /mnt/data/xen/configs/gentoo
kernel = "/mnt/data/xen/kernel/kernel-2.6.x.y-xen"
memory = 512
name = "gentoo"
disk = ['file:/mnt/data/xen/disks/ext3root.img,sda1,w']
root = "/dev/sda1 ro"
|
Jeśli w użyciu jest urządzenia blokowe (woluminu LVM lub zwykłej partycji) jako
dysk należy wpisać 'phy:' zamiast 'file:' oraz opuścić /dev/. Na przykład:
Listing 3.4: Używanie urządzenia blokowego |
disk = [ 'phy:lvm/xen-guest-root,sda1,w' ]
disk = [ 'phy:sdb6,sda1,w' ]
|
Przykładowe pliki konfiguracyjne znajdują się w /etc/xen.
Uruchamianie nowej domeny
Możliwe jest teraz uruchomienie nowej domeny. Jeśli obraz dysku zawiera system
operacyjny, możemy utworzyć domenę używając polecenia xm (Xen manager):
Listing 3.5: Tworzenie i uruchamianie nowej domeny |
~# xm create /mnt/data/xen/configs/gentoo -c
|
Domena zostanie uruchomiona w terminalu, w którym uruchomiono odpowiednie
polecenie. W opisywanym przypadku, obraz dysku jest jednak pusty, więc domena
się nie uruchomi. Słowem, jest bezużyteczna. Żeby to naprawić, należy zamontować
obraz i zainstalować Gentoo.
Aby rozłączyć się od domeny wystarczy nacisnąć kombinację klawiszy
Ctrl+]. Zawsze można jednak połączyć się ponownie z domeną przez
konsolę korzystając z polecenia xm console gentoo. Dostępna jest jednak
tylko jedna konsola na domenę. Należy używać jej tylko wtedy, gdy niemożliwe
jest inne połączenie (na przykład przez protokół SSH).
4.
Sieć w nieuprzywilejowanych domenach
Wprowadzenie
Xen wspiera dwa typy konfiguracji wirtualnych sieci: routowanie oraz
mostkowanie.
Jeśli zostanie wybrane routowanie interfejs domeny nieuprzywilejowanej
będzie podłączony do wirtualnego interfejsu domeny administracyjnej (domeny0), w
której wirtualny interfejs jest połączony z eth0. Interfejs domeny
nieuprzywilejowanej powinien mieć adres IP z tej samej sieci co domena
administracyjna. Jeśli nie zostaną ustawione odpowiednie zasady routingu,
pakiety do tego adresu IP trafią tylko do domeny administracyjnej.
W wypadku, gdy zostanie wybrane mostkowanie, domyślny interfejs w domenie
administracyjnej stanie się mostkiem akceptującym połączenia do domen
wirtualnych, także do adresu IP domeny administracyjnej.
Regularne interfejsy routowane
Przed ustawieniem interfejsu domeny nieuprzywilejowanej, należy się upewnić czy
sterowniki netloop i netbk są załadowane. Wskazówka:
jeśli netloop jest skompilowany jako moduł, należy go załadować z
opcją nloopbacks=0, co sprawi, że Xen nie będzie tworzył zbędnych
interfejsów dla urządzenia loopback. Następnie trzeba wyedytować plik
konfiguracyjny domeny i dodać do niego instrukcję vif.
Listing 4.1: Konfiguracja wirtualnego interfejsu |
~# nano -w /mnt/data/xen/configs/gentoo
vif = [ 'ip=192.168.1.101, vifname=veth1' ]
|
W powyższym przykładzie interfejs jest tworzony dla domeny nieuprzywilejowanej.
Będzie się on nazywać eth0) i Xen upewni się czy adres
192.168.1.101 jest osiągalny z domeny administracyjnej za pomocą interfejsu
veth1.
To jednak nie znaczy, że wirtualnemu interfejsowi eth0 IP
192.168.1.101 zostanie nadane automatycznie, ale raczej, jeśli nie zostanie mu
ono podane, wirtualny interfejs nie połączy się z domeną administracyjną.
Teraz należy wyedytować /etc/xen/xend-config.sxp tak jak poniżej,
aby wybrać sieć routowaną:
Listing 4.2: Edycja xend-config.sxp |
~# nano -w /etc/xen/xend-config.sxp
#(network-script network-bridge)
#(vif-script vif-bridge)
(network-script network-route)
(vif-script vif-route)
|
Interfejsy mostkowane
W odróżnieniu od interfejsów routowanych należy teraz załadować sterownik
netloop z nloopbacks=1 (lub wyższym) jako dodatkowe
urządzenie do stworzenia mostka. Dla innych modułów nadal niezbędny jest moduł
netbk jako funkcji mostka (moduł bridge powinien być
zbudowany).
Teraz należy wyedytować wirtualną domenę i dodać vif:
Listing 4.3: Konfiguracja wirtualnego interfejsu |
~# nano -w /mnt/data/xen/configs/gentoo
vif = [ 'ip=192.168.1.101, vifname=veth0' ]
|
Następnie należy wyedytować plik /etc/xen/xend-config.sxp, by
wyglądał tak jak poniżej, by wybrać mostkowaną konfigurację sieci:
Listing 4.4: Edycja xend-config.sxp |
~# nano -w /etc/xen/xend-config.sxp
(network-script network-bridge)
(vif-script vif-bridge)
# (network-script network-route)
# (vif-script vif-route)
|
Domyślnie mostek zawiera tylko interfejs, który został skonfigurowany jako
domyślny (ten który jest wymieniony jako domyślny przez ip route list).
Aby zmienić to zachowanie, należy wyedytować xend-config.sxp jak
poniżej:
Listing 4.5: Edycja xend-config.sxp w celu zmiany konfiguracji mostu |
~# nano -w /etc/xen/xend-config.sxp
(network-script 'network-bridge netdev=eth0 bridge=xenbr0 vifnum=0')
|
Kiedy konfiguracja jest gotowa, należy jeszcze raz uruchomić skrypt xend
aby zbudować mostek sieciowy:
Listing 4.6: Restartowanie usługi xend |
~# /etc/init.d/xend restart
|
5.
Inne źródła
Dokumentacja Xen
Narzędzia Xen
Materiał udostępniany na podstawie licencji Creative Commons -
Attribution / Share Alike.
|