Reinstalacja serwera z użyciem pamięci USB i sieci

Reinstalacja serwera nie jest szczególnie trudnym zadaniem dla osoby, która wie, co robi. Jednak co zrobić, jeśli serwer, który trzeba przeinstalować to maszyna bez myszy, klawiatury i ekranu, a jedynie z dostępem do sieci (bez konsoli szeregowej) i dostępnymi portami USB? Jest to możliwe, ale trzeba wykorzystać do tego zmodyfikowany dysk instalacyjny.

Jakiś czas temu opisywałem jak można przekształcić terminal Dell FX160 w serwer NAS. We wpisie pokazałem jak zainstalować na nim openmediavault oparty o Debiana. Postanowiłem jednak wymienić openmediavault, a w zasadzie to, co jest pod spodem (Debiana Stretch), na dystrybucję z nowszymi pakietami, kosztem teoretycznej mniejszej stabilności. Jako system bazowy wybór padł na Ubuntu 18.04 LTS. Pojawia się jednak jeden problem – terminal działa w trybie headless, tj. bez myszy, klawiatury i monitora. Jedynymi podłączonymi przewodami są te od zasilania i sieci. Okazuje się, że jest to jak najbardziej możliwe. Instalator Ubuntu, oparty jest o instalatora Debiana, który umożliwia wstępne skonfigurowanie pewnych opcji instalacji, a nawet przeprowadzenie całej instalacji bez nadzoru użytkownika. Jest jednak pewien haczyk – standardowe edycje są wyposażone w nowy instalator, który oparty jest na nowym rozwiązaniu. Dlatego trzeba skorzystać z innego rozwiązania, które bazuje jeszcze na starym instalatorze – chodzi o minimalny nośnik instalacyjny Ubuntu – mini.iso. Można go pobrać z oficjalnej strony Ubuntu – linki znajdziecie tutaj.

Przygotowujemy plik odpowiedzi

Aby umożliwić instalację przez sieć musimy utworzyć plik odpowiedzi zawierający konfigurację pierwszych kilku punktów instalacji, takich jak język, układ klawiatury, konfiguracja sieci oraz umożliwiający zainstalowanie pewnych pakietów. Poniżej zamieszczam przykładowy plik ustawiający język polski oraz polski układ klawiatury, automatycznie konfigurujący sieć z DHCP, a także nazwę hosta.

d-i debconf/priority                   select critical
d-i auto-install/enabled               boolean true
d-i netcfg/choose_interface            select auto
d-i netcfg/get_hostname                string newserver
d-i network-console/password           password moje-super-tajne-haslo
d-i network-console/password-again     password moje-super-tajne-haslo
d-i preseed/early_command string anna-install network-console

Zapisujemy plik jako preseed.cfg w tym samym katalogu, gdzie pobraliśmy plik mini.iso. Trzeba teraz rozpakować plik ISO poleceniem (w poniższym przykładzie – do katalogu o nazwie mini):

7z x -omini mini.iso

Dodanie pliku do obrazu niestety nie jest trywialne. Mianowicie – dodanie pliku do katalogu z rozpakowanym ISO nie wystarczy. Plik musimy dodać do ładowanego do pamięci RAM obrazu dysku wirtualnego (initrd). Tylko wówczas będzie dostępny w trakcie instalacji. Tworzymy katalog roboczy, np. o nazwie initrd_image.

mkdir initrd_image

I rozpakowujemy obraz initrd.gz poleceniem:

(mkdir -p initrd_image && cd initrd_image && gzip -d < pelna-sciezka-do-katalogu-mini/initrd.gz | cpio -id)

Kopiujemy plik preseed.cfg do katalogu głównego

cp preseed.cfg initrd_image

Pakujemy ponownie zawartość katalogu initrd_image do pliku initrd.gz

(cd initrd_image && find . | cpio -o -H newc | gzip) >  pelna-sciezka-do-katalogu-mini/initrd.gz

Modyfikujemy menu rozruchowe (systemy nie obsługujące EFI lub działające w trybie kompatybilności)

Przyszedł czas na zmodyfikowanie plików zawierających menu rozruchowe. Otwieramy plik mini/txt.cfg w ulubionym edytorze i w pierwszej linii zmieniamy z:

default install

na

default netcli
label netcli
	menu label ^Network console install
	menu default
	kernel linux
	append vga=788 initrd=initrd.gz locale=pl_PL file=/preseed.cfg

Ustawiamy jako domyślną opcję bootowania z konsolą sieciową – w tym celu usuwamy linię:

menu default

Zaraz pod

label install

Ustawiamy także timeout z 0 na 50 w pliku mini/isolinux.cfg. Dzięki temu pierwsza pozycja zostanie uruchomiona automatycznie po 5 sekundach. Linia powinna wyglądać tak:

timeout 50

Modyfikujemy wpis GRUBa (tylko w przypadku serwerów wykorzystujących EFI)

Jeśli nasz serwer korzysta z EFI, należy wcześniej doinstalować dwa dodatkowe pakiety: isolinux oraz xorriso. W Ubuntu/Debianie możemy zrobić to poleceniem:

sudo apt install xorriso isolinux

Po instalacji należy poddać edycji również plik boot/grub.cfg znajdujący się w katalogu mini. Zaraz przed linią rozpoczynającą się od:

menuentry "Install" {

Wklejamy:

menuentry "Network console install" {
    set gfxpayload=keep
    linux   /linux locale=pl_PL file=/preseed.cfg --- quiet
    initrd  /initrd.gz
}

Tworzymy ponownie obraz ISO

W przypadku systemów nieobsługujących EFI lub działających w trybie kompatybilności (CSM) wystarczy, że skorzystamy z polecenia:

mkisofs -r -V "Ubuntu network console install" -cache-inodes -J -l -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o mini_net.iso ./mini

Jeśli korzystamy z systemu działającego tylko z EFI to plik ISO musimy zrobić nieco inaczej, w tym celu skorzystamy z wcześniej zainstalowanych pakietów isolinux i xorriso.

xorriso -as mkisofs -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin -c boot.cat -b isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot -isohybrid-gpt-basdat -o mini_mod.iso mini/

Gotowe! Plik jest gotowy do wrzucenia na dysk USB bądź wypalenia na płytę w celu instalacji nie tylko na serwerze.

Logujemy się do zdalnej instalacji

Po uruchomieniu serwera z nośnika pobieranie wymaganych archiwów może potrwać kilka minut, w zależności od szybkości połączenia internetowego, które posiadamy. Jeśli serwer będzie gotowy, zacznie odpowiadać np. na ping. Wówczas wystarczy podłączyć się do niego za pośrednictwem polecenia:

ssh [email protected]

Można też skorzystać z narzędzi takich jak PuTTy, KiTTy czy innego, obsługującego protokół SSH. Jako hasło podajemy to, które wpisaliśmy w pliku preseed.cfg.

Jeśli wszystko poszło dobrze, na ekranie zobaczysz: