Network Boot

Nicht nur für Thin-Clients und andere diskless Clients ist der Boot über das Netzwerk - also ganz ohne SD-Karte - eine überlegenswerte Alternative. Der Raspberry Pi ab Version 3 bietet dafür die notwendige Hardwareunterstützung.

Vorbereitung des Client

Sie ermitteln zunächst die Seriennummer Ihres Pi:

pi@raspberrypi:~ $ cat /proc/cpuinfo|grep Serial
Serial          : 000000002b77834d

Raspberry Pi 3

Nun wird das One-Time-Programmable (OTM) Memory des Broadcom BCM2835 SoC programmiert. Dazu wird der Datei /boot/config.txt eine Zeile hinzugefügt:

pi@raspberrypi3:~ $ vcgencmd otp_dump | grep 17
17:1020000a
pi@raspberrypi3:~ $ echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt
program_usb_boot_mode=1
pi@raspberrypi3:~ $ cat /boot/config.txt | tail -1
program_usb_boot_mode=1
pi@raspberrypi3:~ $ sudo shutdown -r 0

Nach dem Reboot hat der Speicher einen anderen Wert

pi@raspberrypi3:~ $ vcgencmd otp_dump | grep 17
17:3020000a

Raspberry Pi 4

Die aktuellste Beta-Version des Bootloaders finden Sie im Verzeichnis /lib/firmware/raspberrypi/bootloader/beta

Update Juni 2020: Die aktuelle stabile Firmware ist ab sofort ebenfalls in der Lage, sowohl über Netzwerk als auch über USB-Speicher zu booten. Sie erhalten die Firmware nach einem Update.

pi@raspberrypi4:~ $ sudo apt-get update
pi@raspberrypi4:~ $ sudo apt-get full-upgrade

Das Paket rpi-eeprom, welches die Bootloader-Dateien enthält (falls nicht installiert, bitte nachinstallieren), wird auf diese Weise ebenfalls aktualisiert.

Geben Sie das Kommando rpi-eeprom-update ohne Optionen an, wird Ihnen angezeigt, ob ein aktuellerer Bootloader als der aktuell installierte verfügbar ist.

pi@raspberrypi4:~ $ sudo rpi-eeprom-update
BCM2711 detected
Dedicated VL805 EEPROM detected
*** UPDATE AVAILABLE ***
BOOTLOADER: update available
CURRENT: Mo 15. Jun 13:36:19 UTC 2020 (1592228179)
 LATEST: Do 3. Sep 12:11:43 UTC 2020 (1599135103)
 FW DIR: /lib/firmware/raspberrypi/bootloader/stable
VL805: update available
CURRENT: 000137ad
 LATEST: 000138a1

Mit der Option -a wird die neuere Version installiert

pi@raspberrypi4:~ $ sudo rpi-eeprom-update -a
BCM2711 detected
Dedicated VL805 EEPROM detected
*** INSTALLING EEPROM UPDATES ***
BOOTLOADER: update available
CURRENT: Mo 15. Jun 13:36:19 UTC 2020 (1592228179)
 LATEST: Do 3. Sep 12:11:43 UTC 2020 (1599135103)
 FW DIR: /lib/firmware/raspberrypi/bootloader/stable
VL805: update available
CURRENT: 000137ad
 LATEST: 000138a1
BOOTFS /boot
EEPROM updates pending. Please reboot to apply the update.

Übrigens: In der Datei /etc/default/rpi-eeprom-update können Sie also den Release Status von critical auf stable ändern.

FIRMWARE_RELEASE_STATUS="stable"
pi@raspberrypi4:~ $ cp /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2020-09-03.bin pieeprom.bin
pi@raspberrypi4:~ $ rpi-eeprom-config pieeprom.bin > bootconf.txt

In der Datei bootconf.txt bestimmt der Inhalt der Variablen BOOT_ORDER die Bootreihenfolge.

  • 0X1 : SD-Card Boot (only)
  • 0X2 : PXE Boot (only)
  • 0x21 : Versuche zuerst SD-Card Boot, danach PXE Boot

Hinweis am Rande: 0x4 bedeutet "USB mass storage boot" und beschreibt den Boot vom Speichermedium an der USB-Schnittstelle.

Mit der veränderten Konfiguration in der Datei bootconf.bin wird das Image neu geschrieben.

pi@raspberrypi4:~ $ rpi-eeprom-config --out pieeprom-netboot.bin --config bootconf.txt pieeprom.bin

Das fertige Image kann auf den Raspberry Pi 4 geflasht werden.

pi@raspberrypi4:~ $ sudo rpi-eeprom-update -d -f ./pieeprom-netboot.bin
pi@raspberrypi4:~ $ sudo shutdown -r 0

Ein abschließender Hinweis noch: Mit dem Parameter TFTP_IP können Sie den TFTP-Server unabhängig von einer Antwort des DHCP-Servers (s.u.) fest konfigurieren.

Vorbereitung des Servers

In der Regel gibt es in einem LAN schon einen DHCP-Server. Im Wesentlichen wird dessen Offer von dnsmasq um die DHCP-Option next-server ergänzt:

pi@server ~ $ sudo apt-get install dnsmasq tcpdump
pi@server ~ $ sudo rm /etc/resolvconf/update.d/dnsmasq
pi@server ~ $ sudo systemctl disable dhcpcd
pi@server ~ $ sudo systemctl enable networking

Das Standard-Debian-Networking, welches in den letzten Zeilen aktiviert wird, überschreibt im Gegensatz zum DHCP-Client-Daemon nicht die DNS-Konfiguration.

Die Datei /etc/dnsmasq.conf sollte folgende Zeilen enthalten:

port=0
dhcp-range=192.168.4.255,proxy
log-dhcp
enable-tftp
tftp-root=/tftpboot
pxe-service=0,"Raspberry Pi Boot"

Der Bootvorgang des diskless Client

Sie entfernen die SD-Karte des Client und filtern mit dem Kommando tcpdump die Pakete des DHCP-Servers beim Start des Client:

pi@server ~ $sudo tcpdump -i enxb827eb4a055f port bootpc
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enxb827eb4a055f, link-type EN10MB (Ethernet), capture size 262144 bytes
16:28:34.524143 IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from b8:27:eb:77:83:4d (oui Unknown), length 320
16:28:34.529006 IP server.fritz.box.bootps > 255.255.255.255.bootpc: BOOTP/DHCP, Reply, length 323

In das Verzeichnis /tftproot kopieren Sie die Bootdateien eines frischen Raspberry Pi OS. Die Datei bootcode.bin legen Sie direkt in diesem Verzeichnis ab, alle anderen Dateien in dem Unterverzeichnis, dessen Namen sich aus der Seriennummer des Client-Pi ableitet, in diesem Fall "2b77834d".

Auf dem Server erkennen Sie, welche Dateien per tftp angefragt werden:

pi@server ~ $ sudo tail -f /var/log/daemon.log

Das NFS-Root-Dateisystem

Die Dateien des Root-Filesystems Ihres Raspberry Pi OS kopieren Sie in eine NFS-Freigabe, z. B. auf einem NAS. In der Datei /etc/fstab entfernen Sie die Einträge für die Filesysteme / und /boot. Anschließend passen Sie die Datei /boot/cmdline.txt im tftpboot-Unterverzeichnis ab dem Eintrag "root=" an:

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=<NFS-SERVER>:/<NFS-FREIGABE>,tcp,v3 vers=3 rw ip=dhcp rootwait elevator=deadline fsck.repair=yes splash

Der nächste Reboot holt sich das NFS-Root-Verzeichnis aus dem Netzwerk.

last change: 2021-01-09
Previous page: F2FS Next page: logrotate