Come configuro Raspberry Pi per l'avvio con una radice NFS?


25

Come posso fare in modo che il mio Raspberry Pi utilizzi un server NFS per il filesystem di root anziché la scheda SD?

Mi piacerebbe essere in grado di configurare il mio Raspberry Pi per avere il suo file system di root su una macchina remota tramite NFS per scopi di prestazioni / backup / sviluppo. Come posso fare questo?


Grazie mille per il suggerimento per commentare #iface eth0 inet dhcp da (/ mnt / rpi-root / etc / network / interfaces). Senza quella modifica, non sono stato in grado di ottenere il mio primo avvio NFS funzionante per quasi una settimana di tentativi. Non avevo letto quel bocconcino da nessun'altra parte. Grazie mille

Risposte:


24

La versione corta

  1. Devi preparare un root ed esportarlo dal computer NFS
  2. È necessario configurare l'avvio iniziale per usarlo

Avrai ancora bisogno di una scheda SD per l'avvio iniziale, ma dopo ciò non è necessario / tranne l'avvio per la scheda SD.

Dettagli

L'ho fatto solo su una macchina Linux. In teoria, tuttavia, è possibile su qualsiasi macchina in grado di esportare filesystem NFS.

  1. Il modo più semplice per preparare un filesystem di root è copiare quello fornito dalle immagini esistenti. Ho usato l'immagine ufficiale di Debian 6 come punto di partenza:

    1. Scarica l'immagine, estrai il file .zip. Ora dovresti avere debian6-19-04-2012.img da qualche parte
    2. Montare la partizione di root da quell'immagine usando un dispositivo di loopback. Avrai bisogno dell'offset nell'immagine per l'inizio della partizione root, in questo caso è la seconda partizione nell'immagine:

      fdisk -l debian6-19-04-2012.img
      
      Disco debian6-19-04-2012.img: 1949 MB, 1949999616 byte
      4 teste, 32 settori / carreggiata, 29754 cilindri, totale 3808593 settori
      Unità = settori di 1 * 512 = 512 byte
      Dimensione del settore (logico / fisico): 512 byte / 512 byte
      Dimensione I / O (minimo / ottimale): 512 byte / 512 byte
      Identificatore del disco: 0x000ee283
      
      
      Sistema ID blocchi inizio avvio dispositivo
      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 # 
      

      La seconda partizione inizia al blocco (o settore) 157696 quindi l'offset è (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- ciclo continuo
      root @ rapunzel: / tmp / debian6-19-04-2012 # ls / mnt / pi-root-loop
      bin Desktop etc lib mnt proc sbin selinux sys usr
      avvio dev home media opt root sd srv tmp var
      root @ Rapunzel: / tmp / debian6-19-04-2012 #
      
    3. Con l'immagine montata probabilmente vorrai copiarlo in un posto più permanente per evitare di usare il dispositivo di loopback per sempre. Ho creato un volume LVM2 e l'ho montato su / mnt / rpi-root, quindi ho fatto:

      cp -rav / mnt / pi-root-loop / * / mnt / rpi-root /
      
    4. Dobbiamo esportare il filesystem ora, quindi dobbiamo aggiungere una riga come:

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

      in / etc / exports sul server NFS, dove 192.168.1.2 è l'indirizzo di Raspberry Pi. Dopo aver aggiunto quella corsa exportfs -rvper rileggere l'elenco delle esportazioni. (Vedi export (5) per opzioni più avanzate tra cui caratteri jolly / subnet anziché singoli host)

    In alternativa, puoi saltare questo passaggio e creare un filesystem di root da zero usando qualcosa di simile multistrap.

  2. Ora abbiamo bisogno di costruire una scheda SD che esegua l'avvio iniziale e si avvii usando questa condivisione NFS. L'ho fatto prendendo la prima partizione dell'immagine ufficiale e copiandola su una scheda SD, dove la scheda SD è / dev / sdx:

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

    e quindi poiché questo ha copiato solo la prima partizione modificando la tabella delle partizioni con fdisk per eliminare le due partizioni che non abbiamo copiato.

    Dopo di che ho montato la partizione dalla scheda SD e modificato il file cmdline.txt da esso per leggere:

    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
    

    dove 192.168.1.1 è l'indirizzo del server NFS. Se non si desidera utilizzare DHCP, è possibile impostare l'indirizzo IP in modi alternativi, consultare questo documento per ulteriori dettagli.

    Una volta fatto, puoi smontare la scheda SD e avviare Rapsberry Pi con un root NFS. Puoi anche manipolare il filesystem dal lato server o altri client NFS come ritieni opportuno (ad es. QEMU + binfmt_misc , snapshot LVM, sistemi di backup ecc.)

Cose opzionali

  • L'impostazione di RAMRUN e RAMLOCK su yes in / etc / default / rcS fa sì che / var / run e / var / lock rispettivamente siano montati come tmpfs (cioè ramdisk) - questo probabilmente vale la pena, anche se hai solo un dispositivo che si avvia dal File system NFS.
  • Se stai usando ip = dhcp probabilmente dovrai commentare la riga:

    #iface eth0 inet dhcp
    

    in / etc / network / interfaces (/ mnt / rpi-root / etc / network / interfaces) al fine di evitare una situazione in cui lo scambio tra il DHCP di avvio anticipato e il solito successivo provoca un messaggio come:

    nfs: il server 192.168.1.1 non risponde, sta ancora provando

  • Se vuoi avviare molti dispositivi dalla stessa radice, dovrai provvedere a fornire un "local" / tmp (probabilmente tmpfs) e altre sottigliezze per evitare problemi con più macchine che provano a scrivere sugli stessi file.


grazie per questo tutorial dettagliato. Stavo lavorando perfettamente con l'ultima immagine. Ora, quando ho provato a seguire esattamente gli stessi passaggi per la nuova immagine rilasciata due giorni fa, ho riscontrato l'errore. Il controllo del file system di root ha esito negativo con il seguente errore: fsck.ext4: nessun dispositivo o indirizzo di questo tipo durante il tentativo di aprire / eseguire / rootdev Forse un dispositivo inesistente o scambiare? fsck è morto con stato di uscita 8 Qualche suggerimento? Klaus

Non ho accesso a un dispositivo per controllare in questo momento. Sembra che il kernel potrebbe essere compilato senza il supporto root di nfs.
Flexo,

1
Sembra che ho trovato la soluzione. Ho modificato fstab: proc / proc proc default 0 0 / dev / mmcblk0p1 / boot vfat default 0 2 # / dev / mmcblk0p2 / ext4 default, noatime 0 1 La domanda è perché funzionava con l'immagine precedente. L'esecuzione non è riuscita: S05checkroot.sh. A proposito: hai qualche idea su come gestire la partizione di swap. Ne abbiamo bisogno?

È possibile fare il culo a metà e solo NFS il tutto? vale a dire. le esportazioni dell'host /home/user/Documents/raspisRootFoldere il cliente fstabmonta l'intera cosa su /?
puk

Ottima risposta, mi ha salvato da una scheda SD difettosa; spostato tutto sul mio server NAS. Ho anche commentato fuori /dev/mmcblk0p2 / ext4 defaults,noatime 0 1da /etc/fstab, anche se penso che sarebbe fallita senza causare problemi se si lascia in.
TomG
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.