Wie konfiguriere ich den Raspberry Pi zum Booten mit einem NFS-Root?

25

Wie kann ich dafür sorgen, dass mein Raspberry Pi anstelle der SD-Karte einen NFS-Server für das Root-Dateisystem verwendet?

Ich möchte meinen Raspberry Pi so einrichten können, dass sein Root-Dateisystem auf einem Remote-Computer über NFS zu Leistungs-, Sicherungs- und Entwicklungszwecken ausgeführt wird. Wie kann ich das machen?

Flexo
quelle
Vielen Dank, dass Sie den Tipp #iface eth0 inet dhcp von (/ mnt / rpi-root / etc / network / interfaces) auskommentieren. Ohne diese Änderung konnte ich fast eine Woche lang meinen ersten funktionierenden NFS-Start nicht durchführen. Hatte diesen Leckerbissen nirgendwo anders gelesen. Vielen Dank

Antworten:

24

Die kurze Version

  1. Sie müssen ein Stammverzeichnis vorbereiten und vom NFS-Computer exportieren
  2. Sie müssen das frühe Booten konfigurieren, um dies zu nutzen

Sie benötigen noch eine SD-Karte für das frühe Booten, aber danach benötigt nichts außer / boot die SD-Karte.

Einzelheiten

Ich habe das nur auf einem Linux-Rechner gemacht. Theoretisch ist es jedoch auf jedem Computer möglich, der NFS-Dateisysteme exportieren kann.

  1. Der einfachste Weg, ein Root-Dateisystem vorzubereiten, besteht darin, das von den vorhandenen Images bereitgestellte zu kopieren. Ich habe das offizielle Debian 6-Image als Ausgangspunkt verwendet:

    1. Laden Sie das Bild herunter und extrahieren Sie die ZIP-Datei. Du solltest jetzt irgendwo debian6-19-04-2012.img haben
    2. Hängen Sie die Root-Partition von diesem Image mit einem Loopback-Gerät ein. Sie benötigen den Offset im Image für den Start der Root-Partition. In diesem Fall ist es die zweite Partition im Image:

      fdisk -l debian6-19-04-2012.img
      
      Festplatte debian6-19-04-2012.img: 1949 MB, 1949999616 Bytes
      4 Köpfe, 32 Sektoren / Spur, 29754 Zylinder, insgesamt 3808593 Sektoren
      Einheiten = Sektoren von 1 * 512 = 512 Bytes
      Sektorgröße (logisch / physikalisch): 512 Bytes / 512 Bytes
      E / A-Größe (Minimum / Optimum): 512 Bytes / 512 Bytes
      Festplattenkennung: 0x000ee283
      
      
      ID-System für Geräte-Start-Endblöcke
      debian6-19-04-2012.img1 2048 155647 76800 c W95 FAT32 (LBA)
      debian6-19-04-2012.img2 157696 3414015 1628160 83 Linux
      debian6-19-04-2012.img3 3416064 3807231 195584 82 Linux-Swap / Solaris
      root @ rapunzel: / tmp / debian6-19-04-2012 # 
      

      Die zweite Partition beginnt am Block (oder Sektor) 157696, der Offset ist also (512 * 157696) = 80740352:

      root @ rapunzel: / tmp / debian6-19-04-2012 # mkdir / mnt / pi-root-loop
      root @ rapunzel: / tmp / debian6-19-04-2012 # mount -o loop, offset = 80740352 /tmp/debian6-19-04-2012/debian6-19-04-2012.img / mnt / pi-root- Schleife
      root @ rapunzel: / tmp / debian6-19-04-2012 # ls / mnt / pi-root-loop
      bin Desktop usw. lib mnt proc sbin selinux sys usr
      boot dev home media opt root sd srv tmp var
      root @ rapunzel: / tmp / debian6-19-04-2012 #
      
    3. Wenn das Image gemountet ist, möchten Sie es wahrscheinlich an eine dauerhaftere Stelle kopieren, um die Verwendung des Loopback-Geräts für immer zu vermeiden. Ich habe ein LVM2-Volume erstellt und es unter / mnt / rpi-root gemountet.

      cp -rav / mnt / pi-root-loop / * / mnt / rpi-root /
      
    4. Wir müssen jetzt das Dateisystem exportieren, also müssen wir eine Zeile hinzufügen wie:

      / mnt / rpi-root 192.168.1.2 (rw, no_root_squash)
      

      in / etc / exports auf dem NFS-Server, wobei 192.168.1.2 die Adresse des Raspberry Pi ist. Nachdem Sie diesen Lauf hinzugefügt haben, exportfs -rvlesen Sie die Liste der Exporte erneut. ( Weitere Optionen, einschließlich Platzhalter / Subnetze anstelle einzelner Hosts, finden Sie unter Exporte (5). )

    Sie können diesen Schritt auch überspringen und ein Root-Dateisystem von Grund auf neu erstellen multistrap.

  2. Jetzt müssen wir eine SD-Karte erstellen, die das frühe Booten und Booten mit dieser NFS-Freigabe übernimmt. Ich habe dazu die erste Partition des offiziellen Images genommen und auf eine SD-Karte kopiert, auf der sich die SD-Karte / dev / sdx befindet:

    dd if = / tmp / debian6-19-04-2012 / debian6-19-04-2012.img von = / dev / sdx bs = 512 count = 155647
    

    und da dies nur die erste Partition kopierte, die die Partitionstabelle mit fdisk bearbeitete, um die beiden Partitionen zu löschen, die wir nicht kopiert haben.

    Danach habe ich die Partition von der SD-Karte gemountet und die Datei cmdline.txt bearbeitet, um zu lesen:

    dwc_otg.lpm_enable = 0 console = ttyAMA0,115200 kgdboc = ttyAMA0,115200 console = tty1 root = / dev / nfs nfsroot = 192.168.1.1: / mnt / rpi-root ip = dhcp rootfstype = nfs
    

    Dabei ist 192.168.1.1 die Adresse des NFS-Servers. Wenn Sie DHCP nicht verwenden möchten, können Sie die IP-Adresse auf alternative Weise festlegen. Weitere Informationen finden Sie in diesem Dokument .

    Sobald dies erledigt ist, können Sie die SD-Karte aushängen und Ihren Rapsberry Pi mit einem NFS-Root booten. Sie können das Dateisystem auch vom Server aus oder von anderen NFS-Clients aus nach Belieben bearbeiten (z. B. QEMU + binfmt_misc , LVM-Snapshots, Sicherungssysteme usw.).

Optionale Dinge

  • Wenn Sie RAMRUN und RAMLOCK in / etc / default / rcS auf yes setzen, werden / var / run und / var / lock als tmpfs (dh Ramdisk) gemountet NFS-Dateisystem.
  • Wenn Sie ip = dhcp verwenden, müssen Sie die Zeile wahrscheinlich auskommentieren:

    #iface eth0 inet dhcp
    

    in / etc / network / interfaces (/ mnt / rpi-root / etc / network / interfaces), um eine Situation zu vermeiden, in der das Wechseln zwischen dem frühen und dem späteren Start-DHCP zu einer Meldung führt, die wie folgt lautet:

    nfs: server 192.168.1.1 antwortet nicht und versucht es immer noch

  • Wenn Sie viele Geräte von demselben Stammverzeichnis booten möchten, müssen Sie darauf achten, dass Sie ein "lokales" / tmp (wahrscheinlich tmpfs) und andere Feinheiten bereitstellen, um Probleme mit mehreren Computern zu vermeiden, die versuchen, auf dieselben Dateien zu schreiben.

Flexo
quelle
Vielen Dank für dieses ausführliche Tutorial. Ich habe perfekt mit dem letzten Bild gearbeitet. Als ich vor zwei Tagen versuchte, genau die gleichen Schritte für das neue Image auszuführen, stieß ich auf den Fehler. Das Überprüfen des Root-Dateisystems schlägt mit dem folgenden Fehler fehl: fsck.ext4: Kein solches Gerät oder keine solche Adresse beim Versuch, / run / rootdev zu öffnen. Möglicherweise nicht vorhanden oder Gerät auszutauschen? fsck starb mit Exit-Status 8 Irgendwelche Vorschläge? Klaus
Ich habe momentan keinen Zugriff auf ein Gerät, das überprüft werden kann. Klingt so, als ob der Kernel ohne Unterstützung von nfs root erstellt werden könnte.
Flexo
1
Scheint, dass ich die Lösung gefunden habe. Ich habe fstab geändert: proc / proc proc-Standardwerte 0 0 / dev / mmcblk0p1 / boot vfat-Standardwerte 0 2 # / dev / mmcblk0p2 / ext4-Standardwerte, noatime 0 1 Die Frage ist, warum es mit dem vorherigen Image funktioniert hat. Die Ausführung ist fehlgeschlagen: S05checkroot.sh. Übrigens: Haben Sie eine Idee, wie die Swap-Partition verwaltet werden soll? Brauchen wir es
Ist es möglich, es zu halbieren und nur NFS das Ganze? dh Exporte hosten /home/user/Documents/raspisRootFolderund Kunden mounten fstabeinfach die ganze Sache an /?
puk
Tolle Antwort, hat mich aus einer fehlerhaften SD-Karte gerettet; habe das ganze auf meinen NAS Server verschoben. Ich habe auch auf Kommentar /dev/mmcblk0p2 / ext4 defaults,noatime 0 1ab /etc/fstab, obwohl ich denke , es würde fehlschlagen , ohne irgendwelche Probleme zu verursachen , wenn Sie es in verlassen.
TomG