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

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@raspberrypi:~ $ vcgencmd otp_dump | grep 17
17:1020000a
pi@raspberrypi:~ $ echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt
program_usb_boot_mode=1
pi@raspberrypi:~ $ cat /boot/config.txt | tail -1
program_usb_boot_mode=1
pi@raspberrypi:~ $ sudo shutdown -r 0

Nach dem Reboot hat der Speicher einen anderen Wert

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

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