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.