Jak skonfigurować Raspberry Pi do uruchamiania z rootem NFS?

25

Jak zmusić Raspberry Pi do korzystania z serwera NFS dla głównego systemu plików zamiast z karty SD?

Chciałbym mieć możliwość skonfigurowania mojego Raspberry Pi, aby miał swój główny system plików na zdalnym komputerze za pośrednictwem NFS do celów wydajnościowych / tworzenia kopii zapasowych / programowania. W jaki sposób mogę to zrobić?

Flexo
źródło
Dziękuję bardzo za wskazówkę dotyczącą komentarza #iface eth0 inet dhcp z (/ mnt / rpi-root / etc / network / interfaces). Bez tej zmiany nie byłem w stanie uzyskać pierwszego działającego rozruchu NFS przez prawie tydzień próbowania. Nigdzie indziej nie czytałem tego smakołyka. Dziękuję bardzo

Odpowiedzi:

24

Krótka wersja

  1. Musisz przygotować katalog główny i wyeksportować go z komputera NFS
  2. Musisz skonfigurować wczesny etap uruchamiania, aby z niego korzystać

Nadal będziesz potrzebować karty SD do rozruchu na wczesnym etapie, ale potem nic oprócz / boot nie będzie potrzebowało karty SD.

Detale

Zrobiłem to tylko na komputerze z systemem Linux. Teoretycznie jest to możliwe na każdym komputerze, który może eksportować systemy plików NFS.

  1. Najłatwiejszym sposobem przygotowania głównego systemu plików jest skopiowanie systemu dostarczonego przez istniejące obrazy. Jako punkt wyjścia wykorzystałem oficjalny obraz Debiana 6 :

    1. Pobierz obraz, rozpakuj plik .zip. Powinieneś teraz gdzieś mieć debian6-19-04-2012.img
    2. Zamontuj partycję root z tego obrazu za pomocą urządzenia loopback. Będziesz potrzebować przesunięcia obrazu, aby rozpocząć partycję root, w tym przypadku jest to druga partycja na obrazie:

      fdisk -l debian6-19-04-2012.img
      
      Dysk debian6-19-04-2012.img: 1949 MB, 1949999616 bajtów
      4 głowice, 32 sektory / tor, 29754 cylindry, łącznie 3808593 sektory
      Jednostki = sektory 1 * 512 = 512 bajtów
      Rozmiar sektora (logiczny / fizyczny): 512 bajtów / 512 bajtów
      Rozmiar we / wy (minimalny / optymalny): 512 bajtów / 512 bajtów
      Identyfikator dysku: 0x000ee283
      
      
      System Identyfikator rozruchu urządzenia Początek i koniec bloków
      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 Zamiana Linuksa / Solaris
      root @ rapunzel: / tmp / debian6-19-04-2012 # 
      

      Druga partycja rozpoczyna się w bloku (lub sektorze) 157696, więc przesunięcie wynosi (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- pętla
      root @ rapunzel: / tmp / debian6-19-04-2012 # ls / mnt / pi-root-loop
      bin Desktop etc 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. Po zamontowaniu obrazu prawdopodobnie chcesz go skopiować w bardziej trwały sposób, aby uniknąć używania urządzenia loopback na zawsze. Zrobiłem wolumin LVM2 i zamontowałem go w katalogu / mnt / rpi-root, więc zrobiłem:

      cp -rav / mnt / pi-root-loop / * / mnt / rpi-root /
      
    4. Musimy teraz wyeksportować system plików, więc musimy dodać wiersz taki jak:

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

      do / etc / export na serwerze NFS, gdzie 192.168.1.2 to adres Raspberry Pi. Po dodaniu tego uruchomienia exportfs -rvponownie przeczytaj listę eksportów. (Zobacz eksport (5), aby uzyskać bardziej zaawansowane opcje, w tym symbole wieloznaczne / podsieci zamiast poszczególnych hostów)

    Możesz alternatywnie pominąć ten krok i zbudować główny system plików od zera, używając czegoś takiego multistrap.

  2. Teraz musimy zbudować kartę SD, która wykonuje rozruch na wczesnym etapie i uruchamia się przy użyciu tego udziału NFS. Zrobiłem to, biorąc pierwszą partycję oficjalnego obrazu i kopiując ją na kartę SD, gdzie karta SD to / dev / sdx:

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

    a następnie ponieważ skopiowano tylko pierwszą partycję, edytując tablicę partycji za pomocą fdisk, aby usunąć dwie partycje, których nie skopiowaliśmy.

    Następnie zamontowałem partycję z karty SD i edytowałem z niej plik cmdline.txt, aby przeczytać:

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

    gdzie 192.168.1.1 to adres serwera NFS. Jeśli nie chcesz korzystać z DHCP, możesz ustawić alternatywny sposób adresu IP. Aby uzyskać szczegółowe informacje , zapoznaj się z tym dokumentem .

    Po wykonaniu tej czynności możesz odmontować kartę SD i uruchomić Rapsberry Pi z rootem NFS. Możesz także manipulować systemem plików po stronie serwera lub innymi klientami NFS według własnego uznania (np. QEMU + binfmt_misc , migawki LVM, systemy kopii zapasowych itp.)

Opcjonalne rzeczy

  • Ustawienie RAMRUN i RAMLOCK na tak w / etc / default / rcS powoduje, że / var / run i / var / lock są zamontowane odpowiednio jako tmpfs (tj. Ramdysk) - prawdopodobnie jest to opłacalne, nawet jeśli masz tylko jedno urządzenie uruchamiające się z System plików NFS.
  • Jeśli używasz ip = dhcp, prawdopodobnie będziesz musiał skomentować wiersz:

    #iface eth0 inet dhcp
    

    w / etc / network / interfaces (/ mnt / rpi-root / etc / network / interfaces), aby uniknąć sytuacji, w której zamiana między DHCP wczesnego rozruchu a zwykłym późniejszym powoduje komunikat:

    nfs: serwer 192.168.1.1 nie odpowiada, wciąż próbuje

  • Jeśli chcesz uruchomić wiele urządzeń z tego samego katalogu głównego, musisz zadbać o zapewnienie „lokalnego” / tmp (prawdopodobnie tmpfs) i innych subtelności, aby uniknąć problemów z wieloma komputerami próbującymi pisać do tych samych plików.

Flexo
źródło
dzięki za ten szczegółowy samouczek. Pracowałem doskonale z ostatnim obrazem. Teraz, gdy próbowałem wykonać dokładnie te same kroki dla nowego obrazu wydanego dwa dni temu, natknąłem się na błąd. Sprawdzanie głównego systemu plików kończy się niepowodzeniem z powodu następującego błędu: fsck.ext4: Brak takiego urządzenia lub adresu podczas próby otwarcia / uruchomienia / rootdev Prawdopodobnie nie istnieje lub nie zamieniasz urządzenia? fsck zmarł ze statusem wyjścia 8 Jakieś sugestie? Klaus
Nie mam teraz dostępu do urządzenia, które mogę sprawdzić. Wygląda na to, że jądro może zostać zbudowane bez obsługi roota NFS.
Flexo,
1
Wydaje się, że znalazłem rozwiązanie. Zmieniłem fstab: proc / proc proc defaults 0 0 / dev / mmcblk0p1 / boot vfat defaults 0 2 # / dev / mmcblk0p2 / ext4 defaults, noatime 0 1 Pytanie brzmi, dlaczego działał z poprzednim obrazem. Po prostu nie powiodło się wykonanie: S05checkroot.sh. BTW: Czy masz jakiś pomysł na zarządzanie partycją wymiany. Czy potrzebujemy tego?
Czy można to zrobić na wpół , a NFS to wszystko? to znaczy. eksport hostów, /home/user/Documents/raspisRootFoldera klient po fstabprostu montuje całość /?
puk
Świetna odpowiedź, wyciągnął mnie z awarii karty SD; przeniosłem całość na mój serwer NAS. Ja również wypowiedziało się /dev/mmcblk0p2 / ext4 defaults,noatime 0 1od /etc/fstab, chociaż myślę, że nie, nie powodując żadnych problemów, jeśli zostawisz go w.
TomG