[HOWTO] Raspberry Pi - PXE Boot von Qnap NAS

  • Raspberry Pi - PXE Boot von Qnap NAS


    Vorbereitungen SD-Karte und Raspberry Pi


    Übertragt wie gewöhnlich das aktuelle Rasbian lite Image(oder ein anderes) auf eine SD-Karte.

    Tipp: Noch eine leere Datei "ssh" in der ersten Partition anlegen! -> aktiviert den Zugriff über ssh (Putty/Winscp)

    Bootet nun euren Pi und führt eine Grundkonfiguration mit raspi-config durch.


    Danach wechselt ihr auf das next-Release:


    Code
    1. sudo apt-get update; sudo apt-get install rpi-update
    2. sudo BRANCH=next rpi-update


    - ermitteln der Seriennummer und macadresse eures Pi:


    sudo cat /proc/cpuinfo|grep Serial

    Code
    1. pi@raspberrypi:~ $ sudo cat /proc/cpuinfo|grep Serial
    2. Serial : 00000000ccfc0bd9


    sudo cat /sys/class/net/eth0/address

    Code
    1. pi@raspberrypi:~ $ sudo cat /sys/class/net/eth0/address
    2. b8:27:eb:fc:0b:d9


    Beide Werte notieren!

    Sie werden zum einen in der dhcpd.conf und zum anderen in der Verzeichnisstruktur gebraucht!


    Für Raspberry Typ 3 :


    Anschließend fügt ihr mit dem nachfolgenden Befehl am Ende der Datei "/boot/config.txt" noch eine Zeile hinzu (program_usb_boot_mode=1) :


    echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt


    und startet danach den Pi neu!


    Nach erfolgtem Neustart könnt ihr die Zeile wieder aus der Datei entfernen. Führt nun zur Sicherheit folgenden Befehl aus:


    vcgencmd otp_dump | grep 17:


    Code
    1. pi@raspberrypi:~ $ vcgencmd otp_dump | grep 17:
    2. 17:3020000a


    Die Ausgabe sollte „17:3020000a“ entsprechen. Somit hat alles geklappt. Euer RasPi-Typ 3 ist nun auf dem next-Release und grundsätzlich Netzwerk Boot-fähig.


    Für alle andern Raspberry (außer Typ 3) :

    Diese benötigen für den PXE Boot eine mit FAT32 formatierte SD Karte auf der als einzige Datei die (aktuelle) bootcode.bin ist!


    Vorbereitung auf dem Qnap NAS


    Für mein Setup hatte ich mir folgende Bedingungen gesetzt:

    - keine zusätzlichen Pakete bzw. Apps / alles soll nur mit in der Firmware bereits vorhandenen Programme laufen

    - alle benötigten Konfigurationen und Dateien in einem Freigabeordner (auch NFS)

    - Möglichkeit der Aktualisierung der Raspi Software incl.Firmware (boot)



    1. Im Webinterface / ControlPanel

    Anlegen eines Freigabeordners (pxeroot) im Webinterface (Systemsteuerung/Rechte/Freigabeordner)

    Berechtigung für Freigabeordner bearbeiten / NFS-Hostzugriff /Zugriffrecht - Keine Beschränkung

    Wichtig! - Den DHCP Server und den TFTP Server NICHT im Webinterface aktiv setzen!!


    2. Verzeichnisstruktur in /share/pxeroot anlegen und Dateien erstellen bzw. kopieren


    Datei "bootcode.bin" wird von der SD Karte nach "pxeroot" kopiert.


    Verzeichnis "conf" enthält alle Konfigurationsdateinen und das Startscript (pxe.sh)


    pxe.sh

    Wichtig! - wenn ihr eine andere Verzeichnisstruktur wählt, dann die Variable "PXECONF" anpassen!

    Datei auf "ausführbar" setzen!


    dhcpd.conf (muss natürlich auf eure Umgebung angepasst werden)


    opentftpd.ini

    Wichtig! - wenn ihr eine andere Verzeichnisstruktur wählt, dann die Variable [HOME] anpassen!


    Jetzt kann DHCP und TFTP mit dem Script "pxe.sh" gestartet werden.


    /share/pxeroot/conf/pxe.sh start


    Der vollständige Path muss nur beim erstmaligen Start angegeben werden.

    Später reicht der Aufruf pxe.sh restart da ein Symlink "/bin/pxe.sh" angelegt wird.


    ob der DHCP Dienst läuft - ps -e|grep dhcpd

    ob der TFTPDienst läuft - ps -e|grep tftp



    Test TFTPDienst

    unter Linux auf dem NAS -  tftp -g -r bootcode.bin 127.0.0.1

    Code
    1. [~] # tftp -g -r bootcode.bin 127.0.0.1
    2. [~] # ls bootcode.bin
    3. bootcode.bin


    auf einem Windows Client - tftp 10.128.5.184 get bootcode.bin

    Code
    1. C:\Users\Administrator>tftp 10.128.5.184 get bootcode.bin
    2. Übertragung erfolgreich: 52116 Bytes in 1 Sekunde(n), 52116 Bytes/s


    Auch im TFTP Logfile unter "pxeroot/conf" sieht man ob ein Get File erfolgreich war!


    Zum jetzigen Zeitpunkt kann man schon mal seinen Pi über PXE starten.

    Wenn DHCP und TFTP fehlerfrei laufen, dann kann man die Seriennummer vom Pi in der "opentftpd.log" finden. Damit hat man dann gleich den richtigen Name für den Symlink aus Seriennummer!


    aus meinem Logfile die wichtige Zeile mit der Seriennummer(hier ^^^^) :

    Code
    1. Client 10.128.5.190:49153 /share/pxeroot/0e81e887/start.elf, No Such File/No Access
    2. . ^^^^^^^^


    Wenn beide Dienst fehlerfrei laufen dann realisiert man den Autostart der Dienste durch folgenden Eintrag am Ende der "/etc/config/qpkg.conf"


    PI Software kopieren und anpassen


    Das Verzeichnis "pxeroot/raspi" enthält für jeden Raspi bzw. Pi-Betriebssystem ein eigenes Unterverzeichnis. Dies ist gleichzeitig das NFS Root Verzeichnis

    Welches Verzeichnis zum Booten benutzt, dies wird über den jeweiligen Symlink (Seriennummer vom Raspi) in "pxeroot" bestimmt. Der Symlink "Seriennummer" in "pxeroot" verweist immer auf das Verzeichnis "boot" in dem Raspi Software Root Verzeichnis. ( siehe Verzeichnisstruktur oben im Beitrag)


    Das Linux Root Verzeichnis von der zweiten Partition auf der SD Karte wir in dieses Verzeichnis kopiert.

    Das Kernel Verzeichnis von der ersten Partition (Fat32) auf der SD Karte wird dann in das Unterverzeichnis "boot" kopiert!

    Achtung! - wer DietPi benutzt, der muss noch alle Dateien unter "boot/dietpi" auf "ausführbar" setzen!


    Jetzt sollte eure Verzeichnisstruktur so ähnlich aussehen:





    Anpassen der Datei "boot/cmdline.txt" :

    in dieser Datei root=/dev/mmcblk0p2 rootfstype=ext4 ersetzen durch

    nfsroot=10.128.5.184:/pxeroot/raspi/PiJuergen,tcp,v3 vers=3 rw ip=dhcp 

    (natürlich euren Verzeichnispath benutzen)


    Anpassen des Filesystem Table (etc/fstab)

    Da im Standard die Konfiguration der Datei fstab auf die SD-Karte für die root bzw. boot-Partition verweist, muss das natürlich auch noch geändert werden:

    Wichtig ist vor allem, dass ihr die Verweise auf die SD-Karte auskommentiert.


    Hier Beispiel Inhalt einer fstab (Auszug):

    Code
    1. proc /proc proc defaults 0 0
    2. #/dev/mmcblk0p1 /boot vfat defaults 0 2
    3. #/dev/mmcblk0p2 / ext4 defaults,noatime 0 1


    So, nun sollte euer Raspi über PXE starten und auch sein Filesystem finden!

    Vergesst nicht die SD Karte mit der "bootcode.bin" bei allen Raspi außer Version 3!



    Quelle u.a. : http://www.do-it-neat.com/open…berry-pi-pxe-boot-teil-1/


    Diskussion und Fragen hier:

    PXE für Raspberry

    16 Mal editiert, zuletzt von kasimodo ()

  • dr_mike

    Hat den Titel des Themas von „Raspberry Pi - PXE Boot von Qnap NAS“ zu „[HOWTO] Raspberry Pi - PXE Boot von Qnap NAS“ geändert.
  • Tolle Anleitung! Kriege das jedoch nicht hin... der Raspi bootet vom NAS, der vorgang endet mit einem Kernel panic " not syncing: No working init found."

    Ein Auszug aus der opentftpd.log:



    vieleicht kann mir da einer weiterhelfen??

    Achso, Nach update auf die BRUNCH Version startet mein Pi3b+ in den Farbbildschirm und bleibt hängen.. Mit der Normal upgedateten/upgegradeten Version läuft alles bestens..

  • Hallo,


    so wie es aussieht wird das rootfs auf der NFS Freigabe nicht gefunden. Verzeichnisstruktur überprüfen. Auf der Konsole mit dem Aufruf "exportfs" die NFS Freigabe (auch Zugriffrechte) überprüfen und mit der notwendigen Änderung in der "boot/cmdline.txt" vergleichen.

    DHCP und TFTP funzen ja bei dir schon mal.


    mfg kasimodo


    ps: Die Anpassung der "fstab" hast du auch gemacht?

  • Danke für die prompte Antwort,

    ja fstab Anpassungen vorgenommen,

    exportfs:

    Code
    1. /share/CACHEDEV1_DATA/pxeroot
    2. <world>

    Meine cmdline.txt:

    Code
    1. dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=192.168.115.180:/share/pxeroot/raspi/PiTest,tcp,v3 rootfstype=nfs vers=3 rw ip=dhcp elevator=deadline fsck.repair=yes rootwait

    aber auch:

    Code
    1. dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=192.168.115.180:/pxeroot/raspi/PiTest,tcp,v3 rootfstype=nfs vers=3 rw ip=dhcp elevator=deadline fsck.repair=yes rootwait

    enden mit dem selben panic kernel

    Die Rechte:


    Wenn ich den Raspbi mit der SD karte boote und

    mount -t nfs 192.168.115.180:/pxeroot /mnt/root verbinde, kann ich auf alle Ordner pxeroot zugreifen, also müssten die Rechte doch i.o. sein - oder?

    Noch meine dhcpd.conf:

    zum Abschluss auf dem NAS (TS251+)


    Code
    1. drwxrwx--- 4 pi everyone 4096 2018-08-31 14:55 0775e0b3/
    2. -rwxrwx--- 1 pi everyone 52116 2018-08-30 13:24 bootcode.bin*
    3. drwxrwx--- 2 pi everyone 4096 2018-08-31 14:18 conf/
    4. drwxrwx--- 2 pi everyone 4096 2018-08-27 16:29 e2a2fe58/
    5. drwxrwx--- 5 pi everyone 4096 2018-08-28 01:55 raspi/
    6. drwxrwx--- 2 pi administrators 4096 2018-08-30 21:07 @Recently-Snapshot/
    7. -rwxrwx--- 1 pi everyone 2835780 2018-06-19 14:06 start.elf*

    2 Mal editiert, zuletzt von hmm01 ()

  • nfsroot=192.168.115.180:/pxeroot/raspi/PiTest ist richtig!


    die "start.elf" kommt nicht in "pxeroot"


    Ist "0775e0b3" ein Symlink auf pxeroot/raspi/PiTest/boot ? - das sollte aber sein!



    Bitte zeig mal die Ausgabe von "ls -lsa" für "pxeroot/raspi/PiTest" und "pxeroot/raspi/PiTest/boot"

  • danke,

    mit dem Symlink komme ich nicht klar .. wie lege ich den an? start.elf war nur ein versuch und ist wieder entfernt..

    Habe cmdline.txt auf nfsroot=192.168.115.180:/pxeroot/raspi/PiTest angepasst

    Einmal editiert, zuletzt von hmm01 ()

  • auf der Konsole:

    ln - s  /share/pxeroot/raspi/PiTest/boot /share/pxeroot/0775e0b3


    vorher den ordner /share/pxeroot/0775e0b3 löschen

  • [~] # ln - s /share/pxeroot/raspi/PiTest/boot /share/pxeroot/0775e0b3


    bei ln - s Leerzeichen bei -s gelöscht, danach Symlink wurde angelegt - boot endet weiterhin in end panic kernel...


    die opentftpd.log:

    Einmal editiert, zuletzt von hmm01 ()

  • Vorbereitungen SD-Karte und Raspberry Pi

    Das hast du auch alles gemacht? Ansonst bin ich im Moment etwas ratlos. Mit welchem Image arbeitest du? Ich habe dies alles bei mehreren Leuten (verschiedene Raspi) eingerichtet und es hat immer funktioniert.

  • Danke, irgend etwas scheint bei mir anders zu sein.. mit einem anderen raspbi 3 funktioniert das auch nicht... andere Seriennummer /MAC ausgelesen, alles weitere angepasst - Kernel panic. Das aktuelle Stretch light und auch das aktuelle Stretch Image habe ich versucht - wie bereits beschrieben update auf die Brunch Version geht nicht, dann startet mein Pi nicht mehr!

  • So beschreibst du deine Fehlermeldung:

    der vorgang endet mit einem Kernel panic " not syncing: No working init found."


    Also wird ja der Kernel schon mal über PXE geladen. Was nicht gefunden wird ist RootFs (bzw. die Rechte stimmen nicht) um den init vorgang fortzusetzen.


    Übertragt mal das aktuelle Rasbian lite Image auf eine SD-Karte.

    Richte dieses, wie in der Howto beschrieben ein und übertrage dann alles auf dein NAS in die richtigen Verzeichnisse unter pxeroot.

    Wie / womit hast du das Filesystem von der SD Karte bisher auf dein Nas übertragen?

    Ich schließe den Reader mit der SD-Karte dazu an das NAS an, mounte die SD-Karte und kopiere direkt unter Linux. Ein "copy" unter Windoof vom PC aus kann nicht funktionieren.

  • ja.. die Rechte.. bislang habe ich verschiedene Möglichkeiten getestet:

    NAS mit Raspi gemountet und mit cp kopiert.

    Kartenleser auf NAS und in die Ordner kopiert.


    aber auch den SD-Karteninhalt mit DiskInternals Linux Reader über Windows kopiert.. das Ergebnis war bislang jedesmal gleich.


    werde das aber nochmal jungfräulich mit Kartenleser am NAS angehen. Rechte mit der Benutzer GUI einrichten oder mittels Konsole?

    Melde Erfolg!


    Erst als ich das kopieren über Kartenleser am NAS und editieren über die Komandozeile gemacht habe, bootet mein raspi vom NAS...

  • Tolle Anleitung aber ich komme nicht weiter.


    FTP und DHCP laufen aber ich blicke bei der Ordnerstruktur nicht ganz durch.


    Erste Frage: Wer legt den Symlink an, Dein script oder muss ich das machen?

  • Danke, Symlink erstellt und jetzt scheitert es daran:


    Wär super wenn sich das jemand mal anschauen könnte.


    1. Wie kann ich sehen ob er das "richtige" root filesystem nimmt denn ich vermute irgendwas haut mit den Pfaden nicht hin!? Gibt es irgendwo log's? Wenn ich den Mountpoint aus der cmdline.txt auf einem anderen Raspi mounte klappt der Zugriff.


    2. Der Mountpoint in der cmdline zeigt direkt in das Stammverzeichnis mit den Ordnern etc, var, boot, ...richtig?


    3. Und bitte wo steht, interessehalber, dass er die Seriennummer als Ordner nehmen soll? Ich kann in keiner Konfig dazu was finden.


    5 Mal editiert, zuletzt von neophilipp ()

  • Ich bin aktuell leider auf der Arbeit - kann mich aber heute Abend gerne darum kümmern und Dir die entsprechenden Infos geben.



    Gruß,


    Lauri


    So, nun zur Beantwortung Deiner Fragen. Ich kenne die Struktur natürlich nicht die Du bei Dir angelegt hast, aber grundsätzlich gibt es ein Log: opentftpd.log


    Code
    1. [10-Feb-19 22:26:36] Client 192.168.1.2:49152 /share/pxeroot/bootcode.bin, 102 Blocks Served
    2. [10-Feb-19 22:26:36] Client 192.168.1.2:49152 /share/pxeroot/bootsig.bin, No Such File/No Access
    3. [10-Feb-19 22:26:36] Client 192.168.1.2:49153 /share/pxeroot/904c08aa/start.elf, Error 0 at Client, Early terminate
    4. [10-Feb-19 22:26:36] Client 192.168.1.2:49154 /share/pxeroot/904c08aa/autoboot.txt, No Such File/No Access
    5. [10-Feb-19 22:26:36] Client 192.168.1.2:49155 /share/pxeroot/904c08aa/config.txt, 6 Blocks Served
    6. [10-Feb-19 22:26:36] Client 192.168.1.2:49156 /share/pxeroot/904c08aa/recovery.elf, No Such File/No Access

    Hier kannst Du gut erkennen, dass der Raspberry zunächst versucht die Dateien aus dem /root des TFTP zu laden und dann automatisch ins Verzeichnis seiner Seriennummer wechselt. Damit kommen wir auch direkt zu Deiner 3ten Frage: Bei einem pxeboot sucht ein Raspberry automatisch zunächst im /root des TFTP und danach, wenn er die Dateien dort nicht findet, in einem Unterverzeichnis das der Seriennummer des Raspberry entspricht. Wichtig hierbei ist, dass dieses Verzeichnis 8 Stellen haben muss, sprich, solltest Du eine 7stellige Seriennummer haben, muss das Verzeichnis mit einer 0 beginnen.


    Zu Frage 2:

    Nein, in der cmdline.txt musst Du das Verzeichnis auf Deiner NAS angeben in dem tatsächlich auch die Files für den betreffenden Raspberry stehen. Kasimodo hat dafür ja auch schon ein gutes Beispiel gegeben:

    Code
    1. nfsroot=10.128.5.184:/pxeroot/raspi/PiJuergen,tcp,v3 vers=3 rw ip=dhcp

    Letzter und wichtigster Hinweis: Das Verzeichnis (in Kasimodos Fall /share/pxeroot) muss natürlich auf für NFS freigegeben werden (denn NFS wird letztendlich für das Mounten genutzt):



    Lieben Gruß,


    Lauri

    Einmal editiert, zuletzt von Laurenzis ()

  • Läuft!!


    Danke Dir, ich weiß zwar nicht genau woran es jetzt gelegen hat aber ich hab nochmal komplett neu angefangen und die Ordnerstruktur (PiJuergen :-) ) so übernommen wie im Beispiel.


    Ich tippe es lag an der Ordnerstuktur die bei mir falsch war oder evtl. Sonderzeichen in einem der Ordnernamen oder schlicht weil beim kopieren Teile der Daten über die QNAP Oberfläche und nicht übers Terminal kopiert habe. Wer weiß, aber auch egal, läuft!


    Dir VIELEN DANK für Deine Mühe!


    Ich biege das jetzt Schritt für Schritt auf meine Struktur. Wenn ich evtl. rausbekomme woran es lag dann melde ich mich nochmal.

    Einmal editiert, zuletzt von neophilipp ()

  • Hallo, ich mal wieder...

    Nachdem ich mit dem booten über pxe keine Probleme mehr hatte(auch mit mehreren Raspis) bootet nun keiner mehr - nach update der Pi's und nach Updates der TS251 korrekt durch. Fehlermeldungen bekomme ich beim Bootvorgang:

    Code
    1. failed to start network timesyncronisation

    und

    Code
    1. failed to start avahi-daemon


    setze ich die sd Karte in den Raspi bootet dieser einwandfrei ohne Fehler - mit mehreren unterschiedlichen Images getestet!


    Auszug aus der openftpd.log:

    Hilfe ??