Migracja istniejącego fizycznie serwera w środowisko XEN

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/debianDodatkowo 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ń
Częste 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.