Bewertung: 5 / 5

Stern aktivStern aktivStern aktivStern aktivStern aktiv
 

 

Im folgenden Artikel wird beschrieben wie man Raspberries per PXE über das lokale Netz booten und betreiben kann. Sowohl die Bootpartition als auch die Rootpartition liegen dann nicht mehr auf einer SD karte sondern im Netz auf einem nfs Server. Beschrieben wird wie man dazu entweder eine Raspberry als DHCP Server, der als DHCP proxy agiert, nutzen kann oder auch wie man eine Synology auf der DSM7 aktiv ist, den dort enthaltenen dnsmasq DHCP Server konfigurieren muss, damit er als DHCP Proxy agiert. Ein DHCP Proxy ist immer dann notwendig wenn man einen Router betreibt, der IP Addressen im lokalen Netz verteilt aber kein PXE unterstützt. Das trifft z.B. beim mir mit meiner Fritzbox 7590 zu. Allerdings kann man auch die DHCP Funktion der Fritzbox deaktivieren und eine Raspberry oder die Synology die Funktion übernehmen lassen. Ich möchte aber dass ich in meiner Fritzbox alle Geräte über das Webfrontend sehen kann. Speziell auch an welchen Repeatern sich die Geräte verbunden haben (Fritzbox Mesh Funktion).

 

 

Einsatz einer Raspberry als DHCP-Proxy Server und tftp Server

Ab der Raspberry 3 kann die Raspberry auch ohne SD Karte starten und laufen. Ihr Bootcode sucht sie im lokalen Netz von einem PXE Server und lädt dann davon das Rootfilesystem. Das ist sehr praktisch wenn man z.B. eine größere Menge von Raspberries alle mit demselben Image starten lassen will wie z.B. Raspberry Schulungen. Weiterhin kann man aber auch jeder Raspberry im lokalen Netz unterschiedliche Images geben. Der Vorteil ist dass es keine SD Karte mehr gibt die sich abnutzt und man zentral Backups der Images erstellen kann. Nachteil ist dass saemtliche Aenderungen der Daten der Rootpartition ueber das Netz gehen muessen und dadurch die Performance etwas leidet.

Den DHCP Server sowie den tftp Server den man dazu benötigt kann man auch gut auf eine Raspberry legen. Ich habe so einen Testsetup bei mir lokal mal interessehalber aufgesetzt und primaer dazu diese Anleitung von Raspberry Pi Geek benutzt.

In der Anleitung wird als Unterordner in /nfs und /tftp die IP Adresse genommen. Ich habe dazu aber die CPU ID genommen, die man mit grep -i Serial /proc/cpuinfo erhält. Dann davon die letzten 8 Stellen nehmen. Alternativ kann man natuerlich auch die IP Adressen nehmen. Nur muss man dann darauf achten dass die Clients von der FB immer dieselbe IP Adresse bekommen. Wenn man eine groessere Anzahl von PXE Clients in einem kleinen Netz hat (/24 = 254 IPs) ist das aber ungeschickt da dann alle IPs immer reserviert sind und von anderen Clients nicht mehr benutzt werden koennen.

Wichtig ist die Option tftp-unique-root in /etc/dnsmasq.conf. Dadurch werden beim PXE Boot in /tftpboot/<serialid> die Bootinformationen incl /etc/cmdline.txt genutzt wo konfiguriert ist wo der PXE Client sein Rootverzeichnis bezieht. Aus nicht verstaendlichen Gruenden muss auch ein Teil des Bootverzeichnisses auch in /tftpboot stehen.

Das /tftpboot Verzeichnis sieht dann wie folgt aus (87f728f5 ist die CPU ID meiner Raspberry)

├── 87f728f5
├── bootcode.bin

 

Per nfs ist das root Verzeichnis der Raspberry exposed. Letztendlich kann das jedes Verzeichnis sein denn dessen Pfad wird in der /tftpboot/87f728f5/etc/cmdline.txt definiert. Aus Konsistenzgründen sollte es aber /nfs/87f728f5 sein.

Etwas problematisch ist es mit der Bootpartition die ja in einem tftp Verzeichnis auf der Raspi liegt. Damit ein Update der Bootpartition der PXE Client Raspberries auf dem tftp Server stattfindet sollte man als Bootverzeichnis in der /etc/fstab der PXE Clients das tftp Bootverzeichnis definieren und das tftp Verzeichnis per nfs exportieren. Damit erfolgt dann ein Update des tftp Bootverzeichnisses transparent beim Update den Clients.

Inhalte der /etc/fstab eines PXE Clients mit der serverid 87f728f5 in /volume1/pxe_nfs/87f728f5/etc/fstab:

proc            /proc           proc    defaults          0       0
<tftpserverIP>:/tftpboot/87f728f5  /boot   nfs defaults,vers=3 0 0

Inhalt der /etc/cmdline.txt eines PXE Clients mit der serverid 87f728f5 auf dem tftp Server in /tftpboot/87f728f5

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=<synologyIP>:/volume1/pxe_nfs/87f728f5,vers=3 rw ip=dhcp elevator=deadline fsck.repair=yes rootwait

 

Einsatz einer Synology als DHCP und tftp Server

Auf einer Synology kann man mit DSM Standardmitteln keinen dhcp-proxy konfigurieren. D.h. man muss dann einen DHCP Server auf der Syno konfigurieren und den DHCP Server auf der FB deaktivieren. Aber man kann dem tftp Server den Servicenamen Raspberry Pi Bootkonfigurieren der von der Raspberry verlangt wird. Man muss dazu im DHCP Server der Syno eine Vendordefinition wie folgt vornehmen:

 

SynoRaspiDHCP

 

Ansonsten konfiguriert man alles genauso wie im ersten Fall mit der Raspberry konfiguriert. Nur eben dass nicht nur die Rootpartitionen per nfs von der Syno exportiert werden sondern auch die tftp Verzeichnisse.

 

tree -L 2 /volume1
├── pxe_nfs
│   ├── 7f308a52
│   ├── 87f728f5
│   └── @eaDir
├── pxe_tftp
│   ├── 7f308a52
│   ├── 87f728f5
│   ├── bootcode.bin

 

Synology DHCP Server als DHCP Proxy konfigurieren und Synology tftp Server benutzen

Man kann auch den Syno DHCP Server als DHCP Proxy konfigurieren. Dann hat der Syno DHCP Server nur die PXE Funktion aber die eigentliche DHCP Funktion bleibt weiterhin dem lokalen DHCP Server wie z.B. einer Fritzbox überlassen. Dazu muss man in /etc/dhcpd/dhcpd.proxy.conf bei DSM6 folgendes  eintragen:

interface=eth0
dhcp-range=set:eth00,192.168.0.0,proxyhttps://warmestrobot.com/blog/2021/6/21/raspberry-pi-network-boot-guide
dhcp-option=vendor:PXEClient,43,Raspberry Pi Boot
dhcp-leasefile=/etc/dhcpd/dhcpd.conf.leases
dhcp-script=/usr/share/dhcpd/dhcpd-script.sh

Bei DSM7 muss man folgendes in /etc/dhcpd/dhcpd.proxy.conf eintragen:

interface=eth0
dhcp-range=set:eth00,192.168.0.255,proxy
# Dont serve clients which are not listed in host list
dhcp-ignore=tag:!known
# Macs of Raspberries to serve
dhcp-host=b8:27:eb:f7:28:f5
dhcp-boot=tag:pxe,bootcode.bin
dhcp-vendorclass=set:pxe,PXEClient
dhcp-option=vendor:PXEClient,43,Raspberry Pi Boot
pxe-service=0,"Raspberry Pi Boot"
dhcp-leasefile=/etc/dhcpd/dhcpd.conf.leases
#log-dhcp

Danach ist ein Restart des DHCP Servers notwendig.

Folgendes Script hilft dabei:

#!/bin/bash
cp /etc/dhcpd/dhcpd.proxy.conf /etc/dhcpd/dhcpd.conf
OLD_PID="$(ps -e ww | grep dnsmasq | grep -v grep | head -n 1 | awk ' { print $1 }' )"
COMMAND="$(ps --no-header -p $OLD_PID -o args)"
kill $OLD_PID
$COMMAND &

Dummerweise wird die DHCP Konfiguration immer bei jeglichen DHCP Änderungen per DSM sowie bei einem Syno Restart wieder überschrieben. Ein Workaround ist auf der Syno ein triggered Task beim Booten ausfuehren lassen der das Script ausführt.

Alternativ kann man auch ohne DHCP Proxy auskommen wenn man dem DHCP Server einen IP Adressbereich gibt der nicht vom Haupt DHCP Server genutzt wird. Also z.B. die IPs 100-200 vom Haupt DHCP Server nutzen laesst und in der Syno die IPs 245-250 und nur die MAC Adressen der Raspberries auf im Syno DHCP zuläßt.

 

Einsatz einer Synology bei älteren Raspberries die kein PXE Boot können

In diesem Falle benötigt man immer noch eine SD Karte. Sie wird aber fast nur gelesen und nutzt sich deshalb so gut wie nicht ab. Sie wird nur benötigt damit die Raspberry booten kann und sich dann das /boot wie auch das Root Verzeichnis per nfs von der Synology mounted. Die /boot/cmdline.txt der SD Karte sieht exakt genauso aus wie die beim PXE Boot: Es muss die Rootpartition per nfs eingebunden werden. Die /etc/fstab von der Synology muss ebenso genauso aussehen wie die beim PXE Boot: /boot wird von der Synology als /volume1/pxe_tftp/<systemid> eingebunden. An eine Sache muss man aber denken: Wenn es mal ein Update der /boot Partition gibt wird dieser Update auf der Synology gemacht damit dort das ganze Image gesichert werden kann. Man muss aber immer danach alles aus dem /boot Ordner noch einmal lokal auf die SD Karte kopieren da sonst beim Booten der Raspberry nicht der aktuelle /boot Code angezogen wird.

 

Hinweis

Irgendwann stellte ich zu meiner Verwunderung fest dass PXE Boot meiner Raspberries nicht mehr funktioniert. Sie luden den Bootcode per tftp aber bekamen keine Rootpartition per nfs. Letztendlich stellte sich heraus dass es daran lag dass ich in der Zwischenzeit NFS 4 Support auf der Syno enabled hatte und nfs3 in den Config Dateien wie /etc/fstab stand. Nachdem ich den Support für NFS4 wieder deaktiviert hatte funktionierte wieder alles wie gewohnt.

Update: Obige Aussage trifft für DSM6 zu. Mittlerweile habe ich auf DSM7 upgraded und PXE Boot der Raspberries funktioniert auch mit NFS 4.1. vermutlich hätte es bei DSM6 auch gereicht im Client nfs 4.1 in der /etc/fstab zu definieren.
 

Nützlich Befehle zum Debuggen

Auf einem System die DHCP-DISCOVER Antworten lesen und auf den PXE System ein DHCP-DICSCOVER Request losschicken.

sudo tcpdump -vvveni eth0 portrange 67-68

sudo nmap --script broadcast-dhcp-discover 255.255.255.255 -p67

 

Referenzen

https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/net_tutorial.md

https://stackoverflow.com/questions/40008276/dnsmasq-different-tftp-root-for-each-macaddress

https://robferguson.org/blog/2022/04/15/how-to-pxe-boot-your-rpi/

https://warmestrobot.com/blog/2021/6/21/raspberry-pi-network-boot-guide

https://mikejmcfarlane.github.io/blog/2020/09/12/PXE-boot-raspberry-pi-4-from-synology-diskstation#setup-manual-ip-for-the-synology

Kommentar schreiben

*** Hinweis ***

Kommentare sind erwünscht. Aber um lästige Spamposts abweisen zu können gibt es ein paar Dinge die zu beachten sind:
  1. Kommentare mit dem Text http werden sofort zurückgewiesen mit der Meldung Sie sind nicht berechtigt den Tag zu verwenden. zz
  2. Kommentare werden manuell überprüft und es dauert deshalb in der Regel einen Tag bis sie veröffentlicht werden.

    Kommentare   
    #13 framp 2021-12-20 15:31
    Moin,

    tut mir leid. Ich kenne ufwnicht.

    Cu framp
    Zitieren
    #12 Bobcelso 2021-12-20 14:38
    Moin. :-)

    hätte da noch eine frage bezüglich des raspi nfs boot.
    es läuft alles super bis auf die ufw firewall.
    sobald ich diese aktiviere verliere ich die verbindung.

    auch nach dieser regel.

    ufw allow from 192.168.178.0/24

    gibts dafür eine lösung ?

    mfg
    Zitieren
    #11 framp 2021-11-10 16:46
    Moin Bobcelso,

    im Prinzip kan man jedes linux per PXE booten sofern PXE von der HW und SW unterstuetzt werden. Die HW (Raspberry) unterstuetzt es. Die SW offrensichtlich auch denn ich habe diese Beschreibung (HTTPS://www.kali.org/docs/installation/network-pxe/) im Netz zu Kali Linux und PXE gefunden.

    Ich selbst habe keine Erfahrung aber ich sehe keinen Grund warum es nicht gehen sollte.

    Cu framp
    Zitieren
    #10 Bobcelso 2021-11-10 15:00
    Moin :)
    Wäre aus auch möglich anstatt dem raspi OS ein kali linux zu booten ?
    Hast du damit erfahrungen?

    Mit freundlichen Grüßen
    Zitieren
    #9 Bobcelso 2021-11-05 19:51
    zitiere framp:
    Moin Bobcelso,

    auch unter DSM7 habe ich den DHCP Proxy nicht zum Laufen gebracht :sad:

    Ich sehe folgende Optionen fuer Dich:

    1) DHCP auf Deinem Router ausschalten und den DHCP der Synology als normalen DHCP Server nutzen
    2) Eine Raspberry als DHCP Proxy fuer PXE konfigurieren. Dort funktioniert der DHCP Proxy des dnsmasq.

    Cu framp

    Danke dir :)
    2. otion habe ich gewählt

    mfg
    Zitieren
    #8 framp 2021-11-05 18:54
    Moin Bobcelso,

    auch unter DSM7 habe ich den DHCP Proxy nicht zum Laufen gebracht :sad:

    Ich sehe folgende Optionen fuer Dich:

    1) DHCP auf Deinem Router ausschalten und den DHCP der Synology als normalen DHCP Server nutzen
    2) Eine Raspberry als DHCP Proxy fuer PXE konfigurieren. Dort funktioniert der DHCP Proxy des dnsmasq.

    Cu framp
    Zitieren
    #7 framp 2021-11-05 11:54
    Moin Bobcelso,

    der DHCP Proxy Ansatz funktionierte unter DSM6 nicht mehr nach irgendeinem DSM6 Update. Leider habe ich vergessen das oben zu schreiben. Sorry :oops: Das habe ich eben nachgeholt.

    Unter DSM7 funktioniert PXE boot bei mir wenn DHCP und tftp auf der Syno aktiv sind. Das aber nur weil der DHCP Server der Syno schneller den DNS Query der Raspi beantwortet als meine Fritzbox. Mit deren Antwort bootet keine Raspi per PXE. D.h. eigentlich muesste der DHCP der Fritzbox deaktiviert werden da man um zuverlaessig DHCP Antworten zu bekommen nur einen DHCP Server im Netzt haben sollte.

    Ich sehe mir das mal an ob ich den DHCP Proxy unter DSM7 zum Laufen bekomme und update diese Seite dann.

    Cu framp
    Zitieren
    #6 Bobcelso 2021-11-04 23:25
    Das raspi bootet nicht . Es sieht so aus als werden keine boot infos abgerufen.
    Ich habe den dhcp proxy laut anleitung konfiguriert auf dem nas.
    Ich benutze übrigend dsm 7
    Zitieren
    #5 Bobcelso 2021-11-04 22:57
    ja habe ich auch versucht.

    ich habe jetzt den dhcp proxy und tftp server auf dem nas laufen.
    dann werde ich es nochmal versuchen.
    Zitieren
    #4 framp 2021-11-04 22:41
    Hast Du die IP in der /boot/cmdline.txt auf dem tftp angepasst?
    Zitieren
    #3 Bobcelso 2021-11-04 21:40
    ja habe ich auch probiert es funktioniert nur wenn ich die nfs freigabe nicht vom nas sondern vom raspi nehme.

    mfg
    Zitieren
    #2 framp 2021-11-04 13:24
    Moin Bobcelso,

    hast Du meinen Hinweis weiter unten auf der Webseite mit NFS4 vs NFS3 gelesen ;-) ?

    Cu framp
    Zitieren
    #1 Bobcelso 2021-11-04 12:35
    Habe mein filesystem per nfs freigegeben (syno)
    Leider bleibt das bild vom raspi schwarz nachdem das raspberry boot logo verschwunden ist.

    Habe ich das filesystem auf dem raspi liegen wo auch der dhcp und tftp läuft dann startet das system einwandfrei.

    Hat jemand eine idee?
    Zitieren