Kompleksowa obsługa informatyczna

            Nowoczesne rozwiązania serwerowe

Migracja istniejącego fizycznie serwera w środowisko XEN

Poradniki

W sieci znajduje się mnóstwo poradników tyczących instalacji serwera Xen oraz instalacji kolejnych serwerów w wirtualnym środowisku. Najczęściej jednak decydujemy się na wdrożenie wirtualizacji w działających sieciach, w których mamy odpowiednio skonfigurowane i w pełni sprawne serwery. Pojawia się więc pytanie jak najprościej zmigrować istniejący fizycznie serwer do 'wirtualki'. Ten poradnik pokaże po kolei jakie kroki należy wykonać, aby migracja przebiegła gładko i bez przeszkód.

Jeżeli jednak planujesz zainstalować serwer w maszynie wirtualnej od zera, również możesz skorzystać z tego artykułu. Jedyna zmiana nastąpi w kroku 'Kopiowanie serwera' zamiast którego powinieneś wykonać zwykłą instalację. Jeśli używasz dystrybucji Debian, możesz to zrobić poleceniem:

debootstrap lenny /moj/obraz/dysku/ ftp://ftp.pl.debian.org/debian
Dodatkowo po ukończeniu instalacji, powinieneś ustawić hasło root'a w środowisku chroot.

Przygotowanie dysku

Musimy oczywiście przygotować miejsce na nasz nowy serwer. W tym poradniku pokażemy jak zainstalować nową maszynę wirtualną na osobnym dysku twardym, pojedynczej partycji lub w specjalnie stworzonym do tego celu pliku. Instalacja w każdej z tych sytuacji przebiebiega identycznie. Jeśli jednak planujesz zainstalować serwer w pliku, możesz utworzyć go poleceniem:

dd if=/dev/zero if=/moj/obraz/dysku bs=1GB count=20

Plik będzie miał oczywiście wielkość równą bs (block size) przemnożoną przez count, zatem dobierz te parametry odpowiednio do swojego zapotrzebowania.

Jeśli planujesz używać partycji swap najprościej będzie utworzyć dla niej osobny plik.

Po przygotowaniu miejsca na nowy serwer, musimy założyć na nim system plików:

mkfs.ext3 /moj/obraz/dysku

Jeśli instalujesz wirtualny serwer w pliku, a nie na osobnym dysku lub partycji, program mkfs zapyta dodatkowo czy jesteś pewien, że chcesz utworzyć system plików na zwykłym pliku. Oczywiście należy potwierdzić. W przykładzie tworzymy system plików ext3, choć oczywiście możesz użyć tego, który najbardziej ci odpowiada.

Opcjonalnie tworzymy jeszcze partycje swap:

mkswap /moj/obraz/swap

Kopiowanie serwera

Po przygotowaniu dysku nadszedł czas na migrację danych. W tym celu mountujemy dysk oraz uruchamiamy program rsync, który skopiuje dla nas dane z odpowienimi uprawnieniami, z zachowaniem dowiązań symbolicznych itp.:

mkdir /mnt/serwer_wirtualny
mount /moj/obraz/dysku /mnt/serwer_wirtualny
rsync -avHz --numeric-ids --progress --exclude=/proc/* --exclude=/sys/* \
      serwer_fizyczny:/ /mnt/serwer_wirtualny/
Poszczególne opcje oznaczają:
  • -a - tryb archiwum - włącza najrozmaitsze opcje związane z uprawnieniami, właścicielami plików, dowiązaniami itp; dokładny opis tej opcji znajdziesz w manualu programu rsync
  • -v - verbose - powoduje pokazywanie większej liczby komunikatów
  • -H - zachowuje hardlinki
  • -z - kompresja danych podczas transferu; jeśli któryś z serwerów ma słaby procesor lub szyfrowane dyski opłacalne może być wyłączenie tej opcji
  • --numeric-ids - zachowuje oryginalne numery UID oraz GID - bez tej opcji rsync próbowałby przemapować właścicieli plików na lokalne nazwy użytkowników i grup
  • --progress - pokazuje postęp transfery
  • --exclude=... - pomija wymienione pliki

Następnie podajemy miejsce źródłowe i docelowe transferu. Nazwę serwer_fizyczny należy oczywiście zamienić na odpowiednią nazwę lub adres IP serwera, który planujemy zwirtualizować. Aby polecenie wykonało się poprawnie, program rsync zainstalowany musi być na obydwóch synchronizowanych serwerach. Dodatkowo na serwerze zdalnym potrzebny będzie uruchomiony daemon ssh z możliwością logowania na konto root.

Tworzenie pliku konfiguracyjnego

W trakcie kopiowania danych, możemy zająć się przygotowaniem pliku konfiguracyjnego, który najlepiej umieścić w katalogu /etc/xen/ i nazwać nazwą naszego serwera. Przykładowy plik znajduje się poniżej:

# jaki kernel i initrd powinien byc ladowany
kernel  = '/boot/vmlinuz-2.6.26-2-xen-amd64'
ramdisk = '/boot/initrd.img-2.6.26-2-xen-amd64'

# ustawienia dostepnych zasobow
memory  = '2048'
maxmem = '4096'
vcpus = 2
cpus = 0-3

# ustawienia dyskow
root    = '/dev/xvda1 ro'
disk    = ['phy:/moj/obraz/swap,xvda2,w', 'phy:/moj/obraz/dysku,xvda1,w']

# nazwa serwera
name    = 'serwer_wirtualny'

# adres MAC karty sieciowej 
vif  = [ 'mac=00:16:3e:5f:a5:f7' ]

# zachowanie w roznych sytuacjach
on_poweroff = 'shutdown'
on_reboot   = 'restart'
on_crash    = 'restart'

Należy zwrócić uwagę, że pliki kernela i ramdysku pobierane sa z dom0 (czyli z głównego serwera, na którym uruchamiane są wirtualki). Więcej o konfiguracji kernela znajdziesz w dalszej części poradnika.

Niżej zdefiniowaliśmy zasoby. Parametr memory oznacza ilość pamięci RAM dostępnej dla serwera, natomiast maxmem maksymalną ilość do jakiej pamięć może być zwiększona.

Procesory defniujemy parametrami vcpus oraz cpus. Pierwszy z nich określa ilość rdzeni dostępnych w maszynie wirtualnej, drugi zaś które z rdzeni mogą być używane (a będą te najmniej obciążone). W naszym przykładzie pozwalamy więc xen'owi wybrać dwa spośród pierwszych czterech rdzeni.

Dalej definiujemy używane dyski twarde. W przykładzie użyto słowa kluczowego phy, które oznacza dysk (lub partycję) fizyczny. Jeśli instalujesz w pliku, powinieneś zastąpić je słowem file.

Parametr name oznacza nazwę naszego serwera, która będzie widoczna w róznych narzędziach xen'a (np. w poleceniu xm list)

Adres MAC karty sieciowej należy sobie po prostu wymyślić. Należy przy tym uważać, żeby nie powielić żadnego z adresów istniejących już w naszej sieci.

Edytowanie plików

Po przekopiowaniu całego serwera musimy wykonać zmiany w kilku plikach. Uważać należy, aby przypadkowo nie zmienić plików konfiguracyjnych w dom0, więc najbezpieczniej przed przystąpieniem do dalszych kroków wykonać polecenie:

chroot /mnt/serwer_wirtualny

1. /etc/fstab

Dyski będą widoczne jako urządzenia /dev/xvdaX, gdzie X oznacza kolejny numer dysku zgodnie z plikiem konfiguracyjnym. W zasadzie wymagana jest tu jedynie linijka określająca swap, jednak dla porządku wpiszemy również partycję główną.

/dev/xvda1     /     ext3     errors=remount-ro     0     1
/dev/xvda2     none  swap     sw                    0     0

2. /etc/inittab

Należy przestawić konsole z urządzenia tty0 na hvc0

1:2345:respawn:/sbin/getty 38400 hvc0
2:23:respawn:/sbin/getty 38400 tty1

Jeżeli twoja dystrybucja nie posiada tego pliku, powinieneś poszukać w dokumentacji, jak przestawić konsolę na inne urządzenie. Dla przykładu w Ubuntu należy utworzyć plik /etc/event.d/hvc0 o następującej treści:

start on runlevel 2
start on runlevel 3

stop on runlevel 0
stop on runlevel 1
stop on runlevel 4
stop on runlevel 5
stop on runlevel 6

respawn
exec /sbin/getty -L hvc0 9600 linux

3. /etc/network/interfaces

Należy przestawić adres IP serwera wirtualnego na jakiś inny, nie istniejący w sieci. Gdybyśmy tego nie zrobili, w sieci pojawiłyby się dwa serwery z tym samym adresem (fizyczny i wirtualny), co przysporzyłoby tylko kłopotów. Ustawienia sieci oczywiście mogą być w innym pliku w zależności od używanej dystrybucji


4. /etc/hostname

Nie jest to konieczne, ale warto przestawić hostname serwera np. na nazwa_serwera-xen. Pomoże to uniknąć pomyłek podczas konfiguracji, gdy będziesz jednocześnie połączony na stary serwer fizyczny jak i na nowy wirtualny na osobnych terminalach.


5. /etc/securetty

Ponieważ w pliku /etc/inittab przestawiliśmy konsolę na hvc0, powinniśmy dopisać ją do pliku tego pliku. Bez tego wpisu zalogowanie do systemu z poziomu konsoli (a więc przez xm console serwer_wirtualny) może być niemożliwe. Piszemy 'może', gdyż jest to zależne od używanej dystrybucji.

Konfiguracja kernela

Aby serwer działał w środowisku wirtualnym, musi być uruchomiony z kernela, który obsługuje xen'a. Mamy tu do wyburu dwie możliwości:


1. Kernel i moduły z dom0

System zwirtualizowany używał będzie tego samego jądra, co dom0. Plik konfiguracyjny pozostaje jak opisany powyżej, ale musimy dodatkowo przekopiować moduły do stworzonego własnie systemu pików. Wychodzimy się z chroota i wydajemy polecenie

cp -a /lib/modules/2.6.26-2-xen-amd64 /mnt/serwer_wirtualny/lib/modules/

2. Kernel i moduły z serwera wirtualnego

W środowisku chroot instalujemy dowolne dostępne jądro z obsługą xen'a, a następnie kopiujemy je do dom0 (np. do /boot/xen/vmlinuz_serwer_wirtualny lub /etc/xen/boot/vmlinuz_serwer_wirtualny i zmieniamy odpowiednio linię kernel = w pliku konfiguracyjnym maszyny.

Instalacja libc6

Ostatnim krokiem będzie zainstalowanie (oczywiście znów wewnątrz chroot) biblioteki libc6 z obsługą xen'a. W debianie odpowiedni pakiet nazywa się libc6-xen.

aptitude install libc6-xen

W tym momencie jesteś gotowy do odpalenia wirtualnego serwera. Musisz jedynie odmountować jeszcze dyski:

umount /mnt/serwer_wirtualny
xm create serwer_wirtualny
xm console serwer_wirtualny

Finalizacja ustawień

Po trzykrotnym (;>) przetestowaniu serwera w środowisku wirtualnym, powinieneś zmienić z powrotem nazwę hosta oraz adres IP. Oczywiście wcześniej koniecznie przestaw adres IP serwera fizycznego, aby mieć do niego dostęp w razie koneiczności.

Częste problemy

Najczęściej spotykane problemy:
  • Po uruchomieniu serwera wirtualnego nie widać zachęty logowania
    Upewnij się, czy ustawiłeś konsolę na hvc0
  • Widać zachętę logowania, ale serwer nie przyjmuje twojego hasła
    Upewnij się, czy dopisałeś hvc0 pliku /etc/securetty
  • Interfejs sieciowy nie działa; ifconfig zgłasza błąd "IOCSIFFLAGS: Cannot assign requested address"
    Zmień adres MAC ustawiony w konfiguracji. Spróbuj wykorzystać ten z poradnika.