Raspberry Pi 3 über das Netzwerk starten

Mit dem Raspberry Pi 3 ist es nun möglich- das System kann von USB, und damit auch vom Netzwerk starten. Hierzu ist der Einsatz derzeit noch als experimentell gekennzeichneter Boot Files notwendig. Die Himbeere kann damit ohne SD Karte betrieben werden.

Das Prinzip dabei ist vergleichbar mit dem wie es z.B. andere diskless Workstations verwenden: Ein Client, der kein eingebautes Bootmedium hat, sendet einen PXE-Request und erhält von einem DHCP- Server seine IP Umgebung und einem TFTP- Server seine Startdateien (/boot). Alle weiteren Dateien erhält der Client durch einen NFS- Server.  

Die folgende Step-by-Step Anleitung beschreibt wie man die Funktionalität im Zusammenspiel mit einem unter Ubuntu laufenden Server mit ISC DHCP nutzt.

Vorbereitung des Clients

Zur Konfiguration des Raspberry muss an das Ende der Datei /boot/config.txt die Zeile program_usb_boot_mode=1 eingefügt werden:

# echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt

Im aktuellen Auslieferungszustand der Geräte ist das für den USB Boot notwendige Register mit dem Wert 1020000a belegt:

# vcgencmd otp_dump | grep 17:
17:1020000a

Diese Ausgabe zeigt, dass NOCH NICHT die richtigen Boot Files unter /boot vorhanden sind. Um dies nachzuholen muss der Raspberry zunächst einmal aktualisiert werden:

# BRANCH=next rpi-update

rpi-update dient hierbei zur Aktualisierung der Firmware des Raspberry. Es ist zu erwarten, dass die Funktionalität für den Netzwerkstart  demnächst auch in den stable Zweig einfließen wird.

Ein erneutes
# vcgencmd otp_dump | grep 17:
17:3020000a

zeigt nun den korrekten Wert 3020000a an. Die Firmware des Raspberry ist somit vorbereitet.

Nun die oben in /boot/config.txt eingefügte Zeile "program_usb_boot_mode=1" wieder entfernen und den Raspberry Pi Client neu starten.

Die Serverseite

Ab sofort sollten am Server TFTP- Boot- Requests zu sehen sein sobald der Raspberry Client mit angestecktem Kabel und entfernter SD-Card gestartet wird.

# tcpdump -npi eth0 ether host b8:27:eb:41:12:34

Anpassen der dhcpd.conf

Die Anpassung der Konfiguration des ISC DHCP Servers erfolgt unter Ubuntu in der Datei /etc/dhcp/dhcpd.conf. Für eine bessere Übersicht wird im folgenden Beispiel eine Gruppe erstellt, die die Raspberry Systeme, die vom Netzwerk booten sollen, gruppieren.

Bedingung für einen erfolgreichen Start vom Netzwerk ist das Senden der DHCP-Option 43 mit dem Text "Raspberry Pi Boot   ". Hierzu wird im ISC DHCP Server im globalen Konfigurationsabschnitt eine neue Option definiert:

option RPIBOOT code 43 = text;

Der Name, hier RPIBOOT, ist dabei frei wählbar.

Im Anschluß daran folgt die Client Konfiguration des ISC DHCP Servers, die, wie oben bereits erwähnt, aus Übersichtlichkeitsgründen, in einer Gruppe zusammengefasst ist:

group {
        option domain-name "rs.de";
        ddns-domainname "rs.de";
        option domain-name-servers DNSIP;
        option broadcast-address 192.168.1.255;
        option routers GWIP;
        option ntp-servers NTPIP;
        option RPIBOOT "Raspberry Pi Boot   ";
        ddns-updates on;
        host pi1 {
                hardware ethernet b8:27:eb:41:66:72;
                ddns-hostname pi1;
        }
}

Die Werte DNSIP, GWIP und NTPIP, sowie die Netzwerkparameter müssen selbstverständlich den lokalen Gegebenheiten entsprechend angepasst werden.

Wichtig ist hierbei, dass die selbst angelegte Option  43 den Wert "Raspberry Pi Boot   ", also Raspberry Pi Boot mit drei Leerzeichen am Ende, enthält.


Einrichtung des NFS Servers

Auf dem Server muß ein Verzeichnis angelegt werden, das als Root für die durch den NFS-Server ausgelieferten Daten dient

# mkdir /nfsroot/pi1
Im nächsten Schritt werden die Dateien vom Rapsberry Pi 3 Client in dieses Verzeichnis kopieren:
# ssh root@pi1 "tar cvpfz - /" | tar xvpfz - -C /nfsroot/pi1

Der obige Befehl dient dazu vom Server aus die Daten direkt und komprimiert über das Netzwerk zu kopieren. Je nach Konstellation kann auch ein anderer Kopierbefehl notwendig sein.

Der nächste Punkt ist die Installation und Konfiguration des NFS-Servers auf dem Server.
# sudo apt-get install nfs-kernel-server
# echo "/data2/nfsroot/pi1 *(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports
# sudo systemctl enable rpcbind
# sudo systemctl restart rpcbind
# sudo systemctl enable nfs-kernel-server
# sudo systemctl restart nfs-kernel-server

TFTP-Server

Die Installation des TFTP-Servers erfolgt durch ein
# sudo apt-get tftpd-hpa

Dieses Kommando installiert, konfiguriert und startet den TFTP-Server. Als Root Verzeichnis wird, ohne weiter Modifikation der Konfiguration, das Verzeichnis /var/lib/tftpboot verwendet.

In dieses Verzeichnis müssen nun die für den Start des Raspberry Pi Clients notwendigen Dateien, vereinfacht das gesamte /boot Verzeichnis, kopiert werden. Als Quelle kann hier das lokale NFS Verzeichns verwendet werden.

# cp -r /nfsroot/pi1/boot/* /var/lib/tftpboot

Das Anpassen der Datei /var/lib/tftpboot/cmdline.txt ist der nächste Schritt bevor der Raspberry Pi 3 über das Netzwerk starten kann. Der Inhalt muss wie folgt angepasst werden:
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=SERVERIP:/nfsroot/pi1 rw ip=dhcp rootwait elevator=deadline

Selbstverständlich ist der Wert SERVERIP entsprechend den lokalen Gegebenheiten abzuändern.

Eine letzte Änderung, die nun noch durchgeführt werden muß, ist das Anpassen der fstab des Clients. Diese findet sich, sofern die oben genannten Pfade unverändert übernommen wurden, unter /nfsroot/pi1/etc. Hier sind alle Zeilen, die auf /dev/mmcblk0p1 verweisen, ersatzlos auszukommentieren.

Und das war es dann auch (schon)- der Raspberry Pi 3 startet vom Netzwerk.

Ein Wunsch

Ein weiterer großartiger Schritt wäre, wenn der Raspberry Pi nun noch in der Lage wäre seine Betriebsspannung über POE zu beziehen.

Sicher kann man das mit dem einen oder anderen Adapterkabel, das 5V über ein Steckernetzteil in das Netzwerk einspeisst, und diese 5V auf der Pi Seite wieder abzweigt, realisieren- was ich aber meine ist die herkömmliche POE Spannung von 48 Volt, wie sie von vielen Netzwerkswitches geliefert wird.