Netbooting dla niecierpliwych
Posted on Fri 02 December 2005 in Ultra1 z NetBSD • 4 min read
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:
- PROM Ultry odpytuje się serwera RARPD o adres IP,
- 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,
- mając już IP, PROM używa protokołu TFTP i pobiera z serwera plik z programem bootującym, a potem go uruchamia,
- 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 ,
- PROM łączy się z usługą MOUNTD i uzyskuje dostęp do pliku z kernelem po NFS-ie,
- 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
08:00:20:C0:FF:EE hrabal
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
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
# /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
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=""