PXE für Raspberry

  • Hallo zusammen,


    da ich bei mir im Haushalt diverse Raspberrys einsetze (unter anderem an jedem Fernseher einen, als Medienserver mit Kodi) und schon

    leidgeplagt diverse SD-Karten austauschen musste, würde ich meine Raspberrys gerne per PXE von meiner NAS (TS-431+, neueste Firmware)

    booten.
    Mein Problem ist hierbei: Ich finde zwar diverse Anleitungen, wie ich einen Raspberry als PXE-Server einrichte, aber wie ich sowas auf

    meiner NAS zum laufen bringe, leider nicht. Da die NAS sowohl einen TFTP-Server als auch einen DHCP-Server mitbringt (und von Haus

    aus ja PXE eigentlich unterstützt) sollte das doch (zumindest meiner Laienmeinung nach) möglich sein.

    Daher meine Frage an euch, wo kann ich mich (speziell im Zusammenhang mit QTS) schlau machen, was ich letztlich machen muss, um

    einen Raspberry von meiner NAS aus booten zu können?

    Ich habe natürlich auch hier im Forum nach "PXE" gesucht, finde aber leider nur einen Thread mit einer sehr spezifischen Anwendung, die

    auf mich in dieser Weise leider nicht zutrifft. (Meine Raspberrys sind mittlerweile alle auf der 3er Version, PXE-Boot wird von diesen also

    grundsätzlich unterstützt - ein testweise über einen Raspberry eingerichteter PXE-Server funktioniert auch und ich kann davon booten -

    nur möchte ich das halt sehr gern über die NAS lösen).

    Über Hilfe wäre ich entsprechend wirklich dankbar!



    Lieben Gruß,


    Lauri

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


    Verzeichnis erstellen z.B. "/share/CACHEDEV1_DATA/.qpkg/pxe"

    In dieses Verzeichnis kommen die Konfigurationsdateinen und spätere auch das Startscript!

    Konfiguration anlegen und durch manuellen Start von opentftpd und dhcpd testen ob alles funzt.

    (siehe Aufruf im Script Beispiel)


    Bash
    #!/bin/sh
    #Startscript tftp/dhcpd fuer PXE
    
    opentftpd -i /share/CACHEDEV1_DATA/.qpkg/pxe/opentftpd.ini
    dhcpd -cf /share/CACHEDEV1_DATA/.qpkg/pxe/dhcpd.conf -lf /share/CACHEDEV1_DATA/.qpkg/pxe/dhcpd.leases



    Wenn alle Test erfolgreich dann am Ende in "/etc/config/qpkg.conf" einfügen





    Dann NAS neu starten!


    Mit dieser Methode benötigst du keinerlei zusätzliche Software auf deinem NAS.

    Das Wissen um die Einrichtung von TFTP und DHCP habe ich als gegeben angenommen.


    Das Script ist nur ein Beispiel! Man kann es auch "schöner" machen.

    Einmal editiert, zuletzt von kasimodo ()

  • Hallo kasimodo,


    erst mal vielen lieben Dank für Deine Unterstützung!

    Ich muss an dieser Stelle gestehen, dass ich noch halbwegs Linux-Laie bin, komme eigentlich aus der Windowswelt und bin Systemadministrator und Softwareentwickler. Von daher traue ich mir durchaus zu, mich in Probleme einzuarbeiten und auch

    Lösungen zu finden :) Ich werde mich jetzt also daran machen, den TFTP-Service und DHCP manuell zu konfigurieren und dann

    mit dem Startscript zu starten (wie ich DHCP und den TFTP teste weiss ich, das ist kein Thema, wo ich das Shellscript letztlich einbinden

    muss, ist mir auch klar).

    Ich werde dann, sollte ich Probleme und/oder Lösungen haben, weiter hier berichten ;)



    Lieben Gruß,


    Lauri

    Hallo,


    ich muss leider gestehen, dass ich nicht weiterkomme.

    Der DHCP und der TFTP Service laufen (auch nach einem Neustart der NAS) - das kann ich mittels einem DHCP-Testprogramm

    (das liefert mir die IP der NAS sowie die angebotene IP) sowie mit einem einfachen TFTP auf die NAS testen (ein GetFile funktioniert

    einwandfrei). Wenn ich jetzt aber z.B. schaue, was auf der Schnittstelle passiert, wenn ich den Client Raspberry einschalte, bekome ich

    diese Ausgabe:



    Das sagt mir erst mal, dass der DHCP-Server die Anfrage des Raspberry bekommt und auch eine IP anbietet (192.168.0.105) - der Raspberry damit aber komischerweise nichts weiter macht bzw. auf die angebotene IP nicht reagiert (zumindest sieht das für mich

    aktuell so aus.

    Hier meine (aktuellen) Configfiles:


    DHCPD.conf


    opentftpd.ini:

    pxe.sh:

    Bash
    #!/bin/sh
    #Startscript tftp/dhcpd fuer PXE
    opentftpd -i /share/CACHEDEV2_DATA/PXE/opentftpd.ini
    dhcpd -cf /share/CACHEDEV2_DATA/PXE/dhcpd.conf -lf /share/CACHEDEV2_DATA/PXE/dhcpd.leases

    Eintrag in der qpkg.conf:

    Was soll/muss ich weiter machen?
    Die notwendigen Bootfiles liegen im Pfad /share/CACHDEV2_DATA/nfs/tftpboot und lassen sich wie gesagt alle auch per TFTP "laden".

    Wobei das derzeitige Problem meiner Meinung nach erst mal daran liegt, dass der Raspbverry die IP (warum auch immer) im

    Moment nicht annimmt. Der gleiche Raspberry läuft übrigens sofort sobald ich den als PXE-Server konfigurierten Raspberry einschalte,

    ich kann an dieser Stelle also den Raspberry als Problem ausschliessen.


    Danke und Gruß,


    Lauri



    So,


    ich hab das Problem endlich lösen können ;)

    Die ganze Sache lag daran, dass der Raspberry augenscheinlich ein paar spezielle Kommandos in der dhcpd.conf braucht:


    Code
    option vendor-class-identifier "PXEClient";
    option vendor-encapsulated-options "Raspberry Pi Boot";
    option tftp-server-name "192.168.0.100";
    option bootfile-name "bootcode.bin";


    Nachdem ich das eingetragen hatte, bekam der Raspberry seine IP und konnte booten - alles ist schön und so, wie ich mir

    das gewünscht hatte.


    Nochmal danke für die Hilfe,


    Lauri

  • Hallo Lauri,


    leider konnte ich erst heute deinen Beitrag und von deine Bemühungen lesen.

    Ich hatte schon meine dhcpd.conf in der Zwischenablage um sie hier einzustellen und habe dann erst deine letzten Zeilen gelesen.


    Top und Anerkennung - du hast den entscheidenden Punkt selbst gefunden und hier gut dokumentiert!


    Dafür DANKE!


    Grüße Kasimodo


    Ps: kannst du deine dhcpd.conf noch mal vollständig posten

    2 Mal editiert, zuletzt von kasimodo ()

  • Hallo,


    da ich die Woche über immer unterwegs bin, kann ich Dir leider erst jetzt antworten.

    Gerne stelle ich meine Config-Dateien zur Verfügung, ich kann mir gut vorstellen, dass auch andere das selbe Problem haben

    und dann dankbar darüber sind, wenn Sie einen Ansatzpunkt finden.


    Hier nun die relevanten Files:


    dhcpd.conf

    Ich habe hier ein wenig "getrickst" da ich mehrere Raspberrys booten möchte und daher jedem Raspberry über die

    MAC-Adresse direkt einen eigenen Pool (und eine eigene IP) zuweise.


    opentftpd.ini:

    Und für mich sehr relevant, die cmdline.txt:

    Code
    dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=192.168.0.100:/nfs/%s,vers=3 rw ip=dhcp rootwait elevator=deadline

    Ich habe hier an die NFS-Root ein "%s" angehängt, damit der jeweilige Raspberry ein eigenes Verzeichnis auf dem TFTP-Server

    anspricht - in diesem Fall jeweils die IP (der Pfad wird also für den ersten Raspberry zu 192.168.0.100:/nfs/192.168.0.104/ ).

    Leider habe ich keine Möglichkeit gefunden, dem Raspberry ein eigenes Verzeichnis als TFTP-Root zuzuweisen, der Eintrag

    für das "Filename" igoriert, wenn ich hier ein Verzeichnis voranstelle. Dementsprechend, booten alle Raspberrys (leider) das

    selbe Kernel und die selbe Firmware und verweisen dann erst für das Filesystem in eigene Verzeichnisse. Solltes Du hier noch

    eine Idee haben, wie ich jedem Gerät ein eigenes Root-Verzeichnis zuweisen (und somit zum testen auch eine andere Firmware

    und ein anderes Kernel) wäre ich echt dankbar. Das ganze Funktioniert auf diese Weise zwar einwandfrei (jeder Raspberry

    bekommt immer die selbe IP und dementsprechend auch immer das selbe Verzeichnis) aber das TFTP-Root bleibt gleich.


    Danke für Dein Lob und lieben Gruß,


    Lauri

  • Laurenzis


    Zum Thema - jeder Raspi sein eigenes System über PXE Boot


    ermitteln zunächst die Seriennummer aller deiner Raspi

    Code
    pi@raspberrypi:~ $ cat /proc/cpuinfo|grep Serial
    Serial          : 000000002b77834d



    Die Datei bootcode.bin legst du direkt in TFTP Root, alle anderen Dateien aus dem Boot Verzeichnis des jeweiligen Raspi kommen in das Unterverzeichnis, dessen Namen sich aus der Seriennummer des Client-Pi ableitet,

    in diesem Fall in das Unterverzeichnis "2b77834d".


    nun kann man für jeden Raspi noch die cmdline.txt anpassen und somit unterschiedliche Systeme booten


    Code
    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

    bb & Grüße

    Kasimodo

    2 Mal editiert, zuletzt von kasimodo ()

  • Hallo Kasimodo,


    vielen Dank für den Tip, dass die Bootcode.bin trotzdem im Root-Verzeichnis bleiben muss. Die Geschichte mit "Verzeichnis mit Seriennummer anlegen" hatte ich anderweitig auch schon gefunden - nur schlug das natürlich immer fehl, weil ich alles - inkl. der

    Bootcode.bin - immer ins Verzeichnis verschoben hatte. Auf diese Weise jetzt funktioniert es einwandfrei! Ich kann jetzt mit jedem

    Pi nach herzenslust "rumspielen" - das macht mir das Leben doch deutlich leichter und das rumhantieren mit den elenden SD-

    Karten entfällt endlich ;)


    Vielleicht noch ein Hinweis:

    Der Pi 3B+ verhält sich an der Stelle übrigens etwas merkwürdig. Es steht überall, dass man das Verzeichnis ohne führende

    Nullen der Seriennummer anlegen soll - der 3B+ braucht aber, seltsamerweise, EINE führende 0.
    Sprich, bei Deiner Seriennummer (000000002b77834d) muss das Verzeichnis dann 02b77834d heissen - sonst findet der 3B+

    die Files nicht.


    Nochmal lieben Dank für Deine freundliche Hilfe,


    Lauri

  • Eine andere Möglichkeit die Seriennummer und damit den richtigen Verzeichnisname zu finden:


    ist Tftp Start mit logging (eine zeile)


    opentftpd -i /share/CACHEDEV1_DATA/.qpkg/pxe/opentftpd.ini -l  /share/CACHEDEV1_DATA/.qpkg/pxe/opentftpd.log


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

    Code
    Client 10.128.5.190:49153 /opt/tftpraspi/0e81e887/start.elf, No Such File/No Access
                                             ^^^^^^^^
  • Hallo Kasimodo,


    genau da hatte ich dieses seltsame Verhalten auch gefunden - im Logfile stand dann, dass er das File im Verzeichnis mit führender 0 gesucht hat ;)



    Gruß,


    Lauri.

  • Hallo miteinander,

    Eure Anleitung find ich gut.Wie bekomme ich meine sd-karte aufs nas. Hab sie einfach beim NAS angesteck und mittels Qfile kopiert. Geht nicht, ich bekomme immer Fehlermeldung das die Datei nicht lesbar ist (Zugriffsrecht verletztung). Für Hilfestellung bin ich dankbar.

  • Am einfachsten - einen Kartenleser am USB Anschluss vom NAS


    mfg Kasimodo

  • Danke. Hab ich aber schon probiert.

    Die boot Partition geht, aber die 2 Partition geht nicht. Mit welchem user Soll ich das kopieren?

  • <grins> geht nicht - gibt es nicht! geht schwer - ist möglich!

    ich hab es ja auch gemacht!


    Die zweite Partition der SD Karte mounten und dann kopieren! Alles auf der Console machen (Putty)

  • Hallo mit einander,

    der Tip mit Putty war der richtige habe nun meine SD Karte kopieren können.

    Leider kann ich das pxe.sh Script nicht starten, bekomme immer wieder dieses Bild (mein Linux ist nicht das Beste):


    Code
    [~] # /share/pxe/conf/pxe.sh start
    -sh: /share/pxe/conf/pxe.sh: /bin/sh^M: bad interpreter: No such file or directory


    an welchen Schraube muß ich drehen damit es geht?


    Habe die Dateien im conf Ordner mit Notepad+ geschrieben und mittels Filezilla aufs QNAP kopiert, und das Script ausführbar gesetzt.