Network Boot mehrerer Raspberry PIs und QNAP
Ich hatte ja „neulich“ schon einen Artikel über das Netzwerkbooten eines Raspberry PIs geschrieben. Was diesem und allen anderen im Netz von mir gefundenen allerdings gemeinsam ist, dass diese „nur einen“ PI betrachten. Will man mehrere booten, natürlich auch ggfs. mit unterschiedlichem Kernel (über PXE bereitgestellt), so ging das wie dort gezeigt nicht.
Mit ein wenig Recherche und probieren habe ich aber nun eine generische Lösung gefunden ;-), mit deren Hilfe man mehrere PIs mit unterschiedlicher Software über das Netzwerk booten kann. Wie auch schon in meinem letzten Setup benötigt man dazu lediglich
- NFS-Server mit einer entsprechenden Freigabe
- TFTP auf der QNAP (IP: 10.0.0.2) eingerichtet
- Einen DHCP-Service, der NetBoot bereitstellt
(bei mit kann das die USG; alternativ kann das auch der DNSmasq worauf ich hier aber nicht im Artikel eingehe)
Für die Freigabe über NFS richtet man eine einfache Freigabe ein. Bei mir heißt diese NetBoot. Dann wechselt man in die Berechtigungen für den Freigabeordner und wählt NFS-Hostzugriff aus. Hier müssen die IPs bzw. das Subnetz angegeben werden, die die Freigabe per NFS einbinden dürfen.
In diesem Freigabeordner muss man nun ein paar Ordner anlegen:
- „tftp“ – für den TFTP Server, den wir gleich noch einrichten wollen,
- „myRaspberry“ – hier kommt das Filesystem als Kopie der microSD Karte rein.
Dann wechselt man in die Anwendungen ind aktiviert den vorhandenen TFTP Server mit dem UDP Port 69. Als Stammverzeichnis wählt man den unterhalb der gerade erstellten Freigabe vorhandenen Ordner tftp aus. Die Angabe des Logfiles ist optional. Ich habe sie initial auch dort liegen gehabt und das kann einem ggfs. die Fehlersuche enorm erleichtern.
Auf raspberrypi.org wird beschrieben, wie man den PI3 Netwerkboot-fähig bekommt (der 4er kann das von Hause aus). Daher spare ich mir hier die Wiederholung. Was allerdings wichtig ist: Wir benötigen die Seriennummer des PIs. Damit gibt er sich beim Netzwerk-Boot zu erkennen und wir können gleich zuordnen, welches BOOT und welches ROOT Verzeichnis wir ihm bereitstellen wollen.
Dazu braucht man folgendes Statement in der Shell:
cat /proc/cpuinfo | grep Serial | cut -d ' ' -f 2
Diese Nummer „merken“ wir uns (ich nehme hier mal abcd1234 an), fahren den PI sauber runter und kopieren den kompletten Inhalt der microSD Karte auf die QNAP. Ich lege dazu einen Ordner mit dem PI-Namen unterhalb der Freigabe NetBoot an. Gehen wir mal im einfachen Fall von raspberry aus, was initial der Fall sein wird.
rsync -aHXv {QUELLE} /share/NetBoot/raspberry
Im Verzeichnis tftp legen wir einen Sym-Link mit der o.g. Seriennummer auf das Boot-Verzeichnis an:
ln -s /share/NetBoot/raspberry/boot /share/NetBoot/tftp/abcd1234
In das Verzeichnis tftp kommt die in der microSD unter /boot/ vorhandene Datei bootcode.bin per einfachem cp hinein.
Jetzt müssen wir nur noch ein klein wenig die Datei cmdline.txt ändern:
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=10.0.0.2:/NetBoot/raspberry rw ip=dhcp rootwait elevator=deadline quiet splash plymouth.ignore-serial-consoles consoleblank=15
Hierbei ist wichtig, wie auch im vorherigen Artikel vermerkt, dass das eine einzige Zeile ist.
Was noch fehlt ist die DHCP-Option im DHCP der USG zu aktivieren. Dazu wählt man im entsprechend verwendeten Netzwerk bei den Advanced DHCP Options die Option Netzwerk-Boot aktivieren, gibt den Server 10.0.0.2 und die Datei bootcode.bin an, die wir ja oben bereits in das root-Verzeichnis des TFTP-Server kopiert hatten.
Nun steht einem Boot über das Netzwerk nichts mehr im Weg. Allerdings muss man nun vor dem Reboot der QNAP daran denken, die PIs herunter zu fahren. ;-)
Anmerkung zum PI4:
Wenn man das ganze auf einem PI4 machen will, ist dieser, wie oben angemerkt bereits „fähig“ über das Netzwerk zu booten. Das muss man aber mit Hilfe von raspi-config die Boot-Reihenfolge angeben (hier gibt es eine Option im Default mit Netzwerkboot).