Comment configurer le Raspberry Pi pour démarrer avec une racine NFS?

25

Comment faire pour que mon Raspberry Pi utilise un serveur NFS pour le système de fichiers racine, au lieu de la carte SD?

Je voudrais pouvoir configurer mon Raspberry Pi pour avoir son système de fichiers racine sur une machine distante via NFS à des fins de performance / sauvegarde / développement. Comment puis-je faire ceci?

Flexo
la source
Merci beaucoup pour le conseil de commenter #iface eth0 inet dhcp de (/ mnt / rpi-root / etc / network / interfaces). Sans ce changement, je n'ai pas pu obtenir mon premier démarrage NFS fonctionnel pendant près d'une semaine d'essais. Je n'avais lu cette friandise nulle part ailleurs. Merci beaucoup

Réponses:

24

La version courte

  1. Vous devez préparer une racine et l'exporter depuis la machine NFS
  2. Vous devez configurer le démarrage à un stade précoce pour l'utiliser

Vous aurez toujours besoin d'une carte SD pour le démarrage précoce, mais après cela, sauf / boot n'aura pas besoin de la carte SD.

Détails

Je ne l'ai fait que sur une machine Linux. En théorie, c'est possible sur n'importe quelle machine qui peut exporter des systèmes de fichiers NFS.

  1. La façon la plus simple de préparer un système de fichiers racine est de copier celui fourni par les images existantes. J'ai utilisé l' image Debian 6 officielle comme point de départ:

    1. Téléchargez l'image, extrayez le fichier .zip. Vous devriez maintenant avoir quelque part debian6-19-04-2012.img
    2. Montez la partition racine à partir de cette image à l'aide d'un périphérique de bouclage. Vous aurez besoin du décalage dans l'image pour le début de la partition racine, dans ce cas, c'est la deuxième partition de l'image:

      fdisk -l debian6-19-04-2012.img
      
      Disque debian6-19-04-2012.img: 1949 Mo, 1949999616 octets
      4 têtes, 32 secteurs / piste, 29754 cylindres, total 3808593 secteurs
      Unités = secteurs de 1 * 512 = 512 octets
      Taille du secteur (logique / physique): 512 octets / 512 octets
      Taille des E / S (minimum / optimal): 512 octets / 512 octets
      Identificateur de disque: 0x000ee283
      
      
      Système d'identification des blocs de début de démarrage de périphérique
      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 deuxième partition commence au bloc (ou secteur) 157696 donc le décalage est (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- boucle
      root @ rapunzel: / tmp / debian6-19-04-2012 # ls / mnt / pi-root-loop
      bin Desktop etc lib mnt proc sbin selinux sys usr
      démarrage dev home media opt root sd srv tmp var
      root @ rapunzel: / tmp / debian6-19-04-2012 #
      
    3. Avec l'image montée, vous voudrez probablement le copier dans un endroit plus permanent pour éviter d'utiliser le périphérique de bouclage pour toujours. J'ai créé un volume LVM2 et l'ai monté sur / mnt / rpi-root, alors j'ai fait:

      cp -rav / mnt / pi-root-loop / * / mnt / rpi-root /
      
    4. Nous devons exporter le système de fichiers maintenant, nous devons donc ajouter une ligne comme:

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

      dans / etc / exports sur le serveur NFS, où 192.168.1.2 est l'adresse du Raspberry Pi. Après avoir ajouté cette course exportfs -rvpour relire la liste des exportations. (Voir exports (5) pour des options plus avancées, notamment des caractères génériques / sous-réseaux plutôt que des hôtes individuels)

    Vous pouvez également ignorer cette étape et créer un système de fichiers racine à partir de zéro en utilisant quelque chose comme multistrap.

  2. Nous devons maintenant créer une carte SD qui effectue le démarrage à un stade précoce et démarre à l'aide de ce partage NFS. J'ai fait cela en prenant la première partition de l'image officielle et en la copiant sur une carte SD, où la carte SD est / dev / sdx:

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

    et puis puisque cela n'a copié que la première partition en éditant la table de partition avec fdisk pour supprimer les deux partitions que nous n'avons pas copiées.

    Après cela, j'ai monté la partition à partir de la carte SD et édité le fichier cmdline.txt à partir de celle-ci pour lire:

    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
    

    où 192.168.1.1 est l'adresse du serveur NFS. Si vous ne souhaitez pas utiliser DHCP, vous pouvez définir d'autres méthodes d'adresse IP, consultez ce document pour plus de détails.

    Une fois cela fait, vous pouvez démonter la carte SD et démarrer votre Rapsberry Pi avec une racine NFS. Vous pouvez également manipuler le système de fichiers côté serveur ou d'autres clients NFS comme bon vous semble (par exemple, QEMU + binfmt_misc , instantanés LVM, systèmes de sauvegarde, etc.)

Choses facultatives

  • Si vous paramétrez RAMRUN et RAMLOCK sur yes dans / etc / default / rcS, respectivement / var / run et / var / lock sont montés en tant que tmpfs (c.-à-d. Ramdisk) - cela vaut probablement la peine, même si vous ne disposez que d'un seul périphérique à partir du Système de fichiers NFS.
  • Si vous utilisez ip = dhcp, vous devrez probablement commenter la ligne:

    #iface eth0 inet dhcp
    

    dans / etc / network / interfaces (/ mnt / rpi-root / etc / network / interfaces) afin d'éviter une situation où le basculement entre le DHCP de démarrage précoce et le plus tard habituel provoque un message comme:

    nfs: le serveur 192.168.1.1 ne répond pas, essaye toujours

  • Si vous voulez démarrer beaucoup de périphériques à partir de la même racine, vous devrez vous assurer de fournir un "local" / tmp (probablement tmpfs) et d'autres subtilités pour éviter les problèmes avec plusieurs machines essayant d'écrire dans les mêmes fichiers.

Flexo
la source
merci pour ce tutoriel détaillé. Je travaillais parfaitement avec la dernière image. Maintenant, lorsque j'ai essayé de suivre exactement les mêmes étapes pour la nouvelle image publiée il y a deux jours, j'ai rencontré l'erreur. La vérification du système de fichiers racine échoue avec l'erreur suivante: fsck.ext4: Aucun périphérique ou adresse de ce type lors de la tentative d'ouverture / d'exécution / rootdev Peut-être inexistant ou permuter le périphérique? fsck est mort avec un statut de sortie 8 Des suggestions? Klaus
Je n'ai pas accès à un appareil pour vérifier en ce moment. Il semble que le noyau puisse être construit sans le support root nfs.
Flexo
1
Semble que j'ai trouvé la solution. J'ai modifié fstab: proc / proc proc defaults 0 0 / dev / mmcblk0p1 / boot vfat defaults 0 2 # / dev / mmcblk0p2 / ext4 defaults, noatime 0 1 La question est de savoir pourquoi cela fonctionnait avec l'image précédente. Il a juste échoué lors de l'exécution: S05checkroot.sh. BTW: Avez-vous une idée de la façon de gérer la partition de swap. En avons-nous besoin?
Est-il possible de le mettre à moitié et de simplement NFS le tout? c'est à dire. héberger les exportations /home/user/Documents/raspisRootFolderet le client fstabmonte tout simplement /?
puk
Excellente réponse, m'a sauvé d'une carte SD défaillante; déplacé le tout sur mon serveur NAS. J'ai aussi fait remarquer à /dev/mmcblk0p2 / ext4 defaults,noatime 0 1partir /etc/fstab, même si je pense que ce serait un échec sans causer des problèmes si vous le laissez dans.
TomG