Netbooting dla niecierpliwych

Posted on Fri 02 December 2005 in Ultra1 z NetBSD

W końcu udało mi się po raz drugi w moim życiu zbootować Ultrę po sieci. Poprzednio nie zanotowałem magicznych zaklęć, kóre na to pozwoliły. Tym razem nie zamierzam popełniać tego samego błędu jeszcze raz i zapiszę wszystkie wrażenia oraz konfigurację dla przyszłych pokoleł [systemu].
Pierwsza uwaga, zanim cokolwiek rozpoczniesz miły czytelniku: odradzam wybór kórejś z dystrybucji Linuksa na serwer TFTP czy BOOTP. Mam złe doświadczenia z RedHatem i ze Slackware. Z pewnością są to moje uprzedzenia i brak umiejętności ale tym bardziej polecam np. OpenBSD, bo jest systemem na tyle integralnym, że wszelkie niedociągnięcia ludzkie wynajdywać pod nim jest łatwiej. Poza tym dokumentacja w systemach BSD jest o niebo lepsza niż w Linuksie.

Kapitalnym poradnikiem pomocnym w bootowaniu z sieci NetBSD na Sun Ultra1 był manual w OpenBSD:

# man diskless

Objaśnia krok po kroku jak odbywa się cały proces i, co najważniejsze, zawiera wiele przydatnych przykładów konfiguracji.

Jak to się odbywa?

Jak wyczytałem z ww. manuala, bootowanie składa się z kilku prostych kroków. W skrócie wyglądają one następująco:

  1. PROM Ultry odpytuje się serwera RARPD o adres IP,
  2. jeśli RARPD znajduje w konfiguracji wpisy pasujące do adresu ethernet Ultry, odpowiada na zapytanie PROM-u i odsyła nazwę hosta i powiązany z nim adres IP,
  3. mając już IP, PROM używa protokołu TFTP i pobiera z serwera plik z programem bootującym, a potem go uruchamia,
  4. następnie PROM wysyła broadcast po RPC albo BOOTPARAMS próbując znaleźć adres serwera oraz w przypadku gdy otrzyma odpowiedź, ścieżkę do wyeksportowanego katalogu, w kórym znajduje się plik z kernelem ,
  5. PROM łączy się z usługą MOUNTD i uzyskuje dostęp do pliku z kernelem po NFS-ie,
  6. PROM ładuje znaleziony kernel.

Serwer na kórym ustawiłem wszystkie wymagane usługi ma adres 192.168.1.34 i nazwę bester. Ultrze, kórą bootowałem nadałem adres 192.168.1.29 i nazwę hrabal.

RARPD

Zacząłem od ustawienia daemonów rarpd i tftpd.
Konfiguracja rarpd sprowadza się do wpisania w pliku /etc/ethers linijki:
08:00:20:C0:FF:EE     hrabal
jak widać powyżej adres ethernetowy Ultry to 08:00:20:C0:FF:EE. Jest nieprawdziwy gdyż w NVRAM-ie, podtrzymującym m. innymi adres MAC karty, wyczerpała się bateria. Ale to temat na oddzielne marudzenie.
Do pliku /etc/hosts dopisałem:
192.168.1.29 hrabal

Czyli tym samym połączyłem ze sobą adres MAC, nazwę i adres IP dla Ultry, czyli mam załatwioną konfigurację rarpd. Wystarczy teraz uruchomić usługę z palca:

# /usr/sbin/rarpd -a

lub wpisać (uwaga! dotyczy OpenBSD) do /etc/rc.conf.local linijkę:

rarpd_flags="-a"

i zrestartować serwer.

TFTPD

Następnie skofigurowałem tftpd czyli stworzyłem katalog:

# mkdir /tftpboot
Do katalogu tego ściągnąłem plik bootujący NetBSD dla architektury sparc64. Pobrałem go z serwera lustrzanego w Rosji, ale oczywiście znajduje się on również na serwerze głównym w odpowiednim katalogu:

PROM próbuje autmatycznie pobrać ten plik ale pod zupełnie inną nazwą. Nazwa ta to adres IP przydzielony przez rarpd Ultrze ale przedstawiony szesnastkowo. W moim przypadku jest to 192.168.1.29. Przetłumaczyłem adres na hexy za pomocą bc:

# bc
obase=16
192
C0
168
A8
1
1
29
1D

Pierwsza komenda "obase=16" przełącza bc w tryb zwracania odpowiedzi w systemie szesnastkowym. Następnie w każdej linijce należy podać każdy z czterech członów adresu ip i zatwierdzić. Zwracane wartości należy skleić ze sobą, żeby uzyskać pełną nazwę pliku. Teraz wystarczyło podlinkować plik ofwboot.net pod nową nazwę:

# cd /tftpboot
# ln -s ofwboot.net C0A8011D
i konfiguracja tftpd gotowa.
Uwaga, niekóre architektury wymagają aby nazwa pliku dodatkowo zawierała po kropce nazwę architektury. I tak Utra 1 ma architekturę sun4u więc plik w jej przypadku mógłby się nazywać C0A8011D.SUN4U, ale nie jest to wymagane.
Podobnie jak w przypadku rarpd, usługę tftpd uruchamiamy z palca z podaniem ścieżki do katalogu z plikiem bootującym:
# /usr/libexec/tftpd -s /tftpboot

albo dodajemy linijkę do pliku /etc/inetd.conf:

tftp            dgram   udp     wait    root    /usr/libexec/tftpd      tftpd -s /tftpboot

i restartujemy usługę inted:

# kill -HUP `cat /var/run/inetd.pid`

BOOTPARAMS

W trakcie przygotowywania następnego kroku pojawiły się pierwsze wątpliwości. Zanim zacząłem korzystać z man diskless, przeczytałem FAQ i HOW TO na stronach NetBSD. Z lektury tamtych dokumenów wywnioskowałem, że mogę zamiennie korzystać z usług BOOTPARAMS albo BOOTP lub DHCPD, z tym że w DHCPD powieniem włączyć właśnie BOOTP. Ponieważ wcześniej już konfigurowałem DHCPD właśnie w celu bootowania stacji po sieci, a na OpenBSD w moim serwerze nie było zainstalowanej usługi BOOTP, postanowiłem wykorzystać DHCPD. I był to błąd bo nie zadziałało, choć ustawiłem wszystko dokładnie jak nakazywała dokumentacja. W kołcu po kilkunastu próbach postanowiłem jeszcze raz zrobić wszystko tak jak w man diskless i w tym kroku użyłem BOOTPARAMS.

Konfiguracja jest trywialna, wystarczy stworzyć wyeksportowany katalog:

# mkdir -p /export/hrabal/root
Oczywiście nie musiałem tworzyć nowego katalogu, tylko użyć np. /tftpboot ale znużony ciągłymi nieudanymi próbami, postanowiłem być maksymalnie zgodny z dokumentacją. W katalogu tym umieścić rozpakowany plik kernela.
Plik ten pobrałem z

Następnie do pliku /etc/bootparams dopisać następujące linijki:

hrabal root=bester.softwired.wfc:/export/hrabal/root
hrabal root=192.168.1.34:/export/hrabal/root
hrabal root=bester:/export/hrabal/root

W tym miejscu należy się uwaga. Powyższe linijki oznaczają właściwie to samo ale duplikują się z wyłącznie zmienionymi nazwami serwera gdyż z dokumentacji wynikało, że niekóre implementacje BOOTPARAMS wymagają pełnej nazwy hosta (czyli wraz z domeną), niekóre zaś nie, a ja od siebie dodałem jeszcze linijkę z numerkiem IP. Kóry z tych wpisów zadziałał mało mnie obchodzi, narzut jest niewielki by się znowu z tym bujać.

Uruchomienie usługi jak poprzednio może się odbyć na dwa sposoby, z palca:

# /usr/sbin/rpc.bootparamd

lub poprzez dopisanie do /etc/rc.conf.local (dotyczy OpenBSD) linijki:

bootparamd_flags=""