PV-GRUB, a Xen pod Debianem

29 sierpień 2013

Pewnego razu zdecydowałem, że na swoim biedaserwerze chciałbym sam decydować o używanym kernelu. W teorii nie była to problematyczna zachcianka – z dostępem do serwera, na którym była wirtualizowana moja maszyna, mogłem wszystko skonfigurować pod swoje potrzeby. Murem okazał się PyGrub, który mimo poprawnej konfiguracji nie chciał współpracować z Arch Linuksem, chociaż przy analogicznych ustawieniach działał bezbłędnie z Debianem czy Ubuntu. Po chwili spędzonej z Google znalazłem PV-GRUB, z wielu względów lepszą metodę umożliwiającą zarządzanie kernelem na domU. Jak przekonują autorzy, dzięki temu, że oparty jest na GRUB-ie, PV-GRUB powinien mieć mniej błędów. Ponadto jest skompilowany, co powinno pozytywnie przełożyć się na wydajność, a także zależności (odpada chociażby wymóg Pythona). Jeszcze innym argumentem jest bezpieczeństwo – PV-GRUB uruchamiany jest na wirtualizowanej maszynie, podczas gdy PyGRUB kopiuje potrzebne pliki z domU na dom0, a następnie interpretuje skopiowaną konfigurację GRUB-a.

Nigdy jednak nie można zapomnieć o zasadzie, że w Debianie nic nie może być nieskomplikowane i logiczne. Bingo, nie znajdziecie PV-GRUB w żadnych pakiecie w repozytoriach. Po ponownej wizycie u wujka Google, znalazłem niesamowicie absurdalny powód: domyślnym GRUB-em w Debianie jest GRUB2, a PV-GRUB oparty jest na poprzedniej wersji, która potrzebuje pliku konfiguracyjnego w innym formacie... Po przetrawieniu problemu zająłem się jedynym sensownym rozwiązaniem – samodzielnym zbudowaniem PV-GRUB.

Chociaż w ponad 90% przypadków^[citation\ needed]^ do tego celu używany jest deboostrap, zdecydowałem się użyć alternatywnego narzędzia o nazwie cdebootstrap. Oferuje ono przydatną funkcję, umożliwiającą wybranie przeznaczenia chroota – dostępne profile to standard, minimal i build. Z oczywistych względów najbardziej zainteresował mnie ten ostatni, który poza bazowym systemem (bez kernela) instaluje metapakiet build-essential, dociągający kompilator i resztę tego typu pakietów. Ostateczny chroot (najlepiej o architekturze amd64/x86_64) zajmuje około 300MB, a nie trzeba martwić się zaśmieceniem serwera lub komputera na którym odbędzie się kompilacja.

Po przejściu do środowiska do kompilacji należy doinstalować niezbędne zależności. Na dzień publikacji wpisu są to:

bcc
bin86
bzip2
gettext
git
iasl
libaio-dev
libglib2.0-dev
libncurses5-dev
libpixman-1-dev
libyajl-dev
pkg-config
python-dev
texinfo
uuid-dev
wget

Oczywiście brakuje jeszcze źródeł do skompilowania, ale w tym celu wcześniej zainstalowaliśmy Git.

git clone git://xenbits.xen.org/xen.git
cd xen

Wersja Xen-a dostępna w repozytoriach Debiana Wheezy to 4.1 – maniaków stabilności najbardziej zadowoli gałąź stable-4.1. Ja nie mogłem się powstrzymać i zostałem w domyślnej gałęzi z rozwojowym kodem. Po wybraniu wersji pozostaje wykonać standardowe ./configure && make. Po kilkunastu minutach, jeżeli wszystko przebiegnie pomyślnie, w katalogu dist/install/usr/local/lib/xen/boot/ będzie można znaleźć pliki pv-grub-x86_32.gz i pv-grub-x86_64.gz. (Ten drugi nie zostanie utworzony, jeśli kompilacja została przeprowadzona pod kontrolą 32-bitowego systemu.)

Po skopiowaniu wyżej wymienionych archiwów w dogodne miejsce na dom0 pozostaje odpowiednio zmodyfikować plik konfiguracyjny maszyny oraz przygotować menu.lst dla PV-GRUB. W przypadku pliku konfiguracyjnego domU, dyrektywę kernel należy zastąpić ścieżką do archiwum z PV-GRUB o odpowiedniej architekturze, natomiast w zmiennej extra definiujemy dysk i ścieżkę do pliku menu.lst w domU. U mnie wygląda to następująco:

kernel       = '/usr/local/lib/xen/pv-grub-x86_64.gz'
extra        = '(hd0)/boot/grub/menu.lst'

Oczywiście hd0 to pierwszy zdefiniowany dysk w pliku:

disk  = [
          'file:/home/xen/domains/vps/root.img,xvda,w',
          'file:/home/xen/domains/vps/home.img,xvdb,w',
          'file:/home/xen/domains/vps/swap.img,xvdc,w',
        ]

Brakuje jeszcze pliku menu.lst. Jego składnia wygląda identycznie jak w przypadku konfiguracji GRUB 1:

timeout 5
default 0

title  Arch Linux
root   (hd0)
kernel /boot/vmlinuz-linux-grsec root=/dev/xvda ro
initrd /boot/initramfs-linux-grsec.img

Po ponownym uruchomieniu maszyny z poziomu dom0 i podłączeniu się do konsoli na czas, powinien ukazać się ekran GRUB-a znany ze zwykłych komputerów. To jednak nie koniec – warto byłoby mieć możliwość sprawdzenia logów z uruchamiania systemu czy awaryjnego zalogowania się. W tym celu należy dodać hvc0 do pliku /etc/securetty na maszynie wirtualnej i jeśli zainstalowana dystrybucja korzysta z SysVInit, dodać następującą linię do /etc/inittab:

hvc0:2345:respawn:/sbin/getty 38400 hvc0

Po ponownym uruchomieniu domU można zająć się czymś bardziej produktywnym niż zawracanie sobie głowy irracjonalnymi decyzjami w Debianie. Na przykład migracją na Alpine Linux, gdzie przy paczkowaniu Xena pomaga pracownik Citriksa, a PV-GRUB znajduje się w repozytoriach...