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.

pi@raspberrypi4:~ $ cp /lib/firmware/raspberrypi/bootloader/beta/pieeprom-2020-01-17.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

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 Raspbian. 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 Raspbian-Root-Filesystems 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.

Previous page: F2FS Next page: logrotate