:::: MENU ::::

Déporter le système de fichier sur un partage NFS

Les cartes SD représentent un avantage et un inconvénient sur une carte Raspberry. C’est un support de stockage bon marché et très répandu. Il est possible de « recycler » une vieille carte utilisée auparavant dans un appareil photo pour notre Raspberry Pi. Cependant la mémoire des cartes SD n’est pas conçu pour supporter des lectures/écritures en grande quantité comme le réalise un système d’exploitation. Il est possible de déplacer les partitions systèmes sur un support de stockage qui est conçu pour réaliser des lectures/écritures intensives, comme un disque externe USB ou bien un partage réseau NFS. Il n’est pas possible de s’affranchir complètement du support SD, celui-ci étant utilisé pour la première partie du boot de la carte : pas de carte SD, pas de boot. Cependant la partition boot utilisée ne contient que quelques mégaoctets de données, et ne nécessite que de la lecture. Il est possible de recycler des vieilles cartes SD de quelques dizaines de mégaoctets, verrouillées en lecture seule.

Ayant à mon domicile un NAS qui me sert de point central pour le partage de mes données personnelles (photos, musiques, vidéos…), pourquoi ne pas l’utiliser également pour héberger les partitions systèmes de ma Raspberry ? Adieu les problèmes de cartes corrompues après quelques mois d’utilisation, volume de stockage important, facilité de migration et de tests sans avoir à jongler entre les cartes SD et fichiers images.

Le matériel nécessaire :

  • Un serveur de fichier NFS (dans mon cas un NAS Synology DS210+)
  • Une carte SD de 32Mo minimum (en fonction de la taille du « /boot » de votre distribution, 16Mo peuvent suffire)
  • Une carte SD avec une distribution RPi fonctionnelle (XBian, Raspbian…)
  • Une connexion réseau filaire (pas de WiFi)
  • Une adresse IP fixe (via bail DHCP fixe ou configuration système)

Configuration du partage NFS

Depuis l’interface de mon Synology, je crée un nouveau partage, accessible via NFS uniquement par l’IP de mon Raspberry (les droits d’accès NFS se font par adresse IP).

Capture d’écran 2015-02-11 à 01.34.01

Capture d’écran 2015-02-11 à 02.03.35

Préparation du système

On monte le partage NFS fraichement créé sur notre Raspberry (où 192.168.0.1  est l’adresse de votre serveur NFS) :

sudo mount -t nfs -o rw 192.168.0.1:/volume1/rasp0 /mnt

On copie l’ensemble de notre partition principale vers le partage NFS :

sudo cp -axv /. /mnt/.
sudo cp -axv /dev/. /mnt/dev/.

Configuration du système

Édition de la table de partition sur le partage NFS :

sudo nano /mnt/etc/fstab

Il faut alors supprimer ou commenter toute ligne faisant référence à /dev/mmcblk0p2  ainsi que toutes les lignes faisant référence à / , /home  ou encore /lib/modules .

Ici un exemple avec le fstab  de XBian, les quatre premières lignes sont à commenter ou supprimer :

# UNCONFIGURED FSTAB FOR BASE SYSTEM
#/dev/root             /home                   xbian   subvol=home/@,noatime,nobootwait           0       0
#/dev/root             /lib/modules            xbian   subvol=modules/@,noatime,nobootwait        0       0
#/dev/root             /                       xbian   noatime,nobootwait                         0       0
#/dev/mmcblk0p1        /boot                   xbian   rw,nobootwait                              0       1
none            /run/user                       tmpfs                   noauto                  0       0
none            /run/shm                        tmpfs                   noauto                  0       0
none            /run/lock                       tmpfs                   noauto                  0       0

Édition de la configuration réseau :

sudo nano /mnt/etc/network/interfaces

On commente toute ligne qui concerne l’interface éthernet et une configuration DHCP (pour éviter de rompre le lien NFS lors du boot) :

# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
auto eth0

#iface eth0 inet dhcp
iface lo inet loopback

allow-hotplug wlan0
iface wlan0 inet dhcp

#iface default inet dhcp

Édition du fichier de configuration de boot (après une copie de sauvegarde) :

sudo cp /boot/cmdline.txt /boot/cmdline.txt.bak
sudo nano /boot/cmdline.txt

Éléments à modifier/ajouter :

root=/dev/nfs rootfstype=nfs nfsroot=192.168.0.1:/volume1/rasp0,udp,vers=3 smsc95xx.turbo_mode=N ip=dhcp
  • 192.168.0.1  correspond à l’adresse IP de votre serveur NFS
  • dhcp  si vous avez configuré un bail DHCP fixe pour votre Raspberry, sinon configuration IP manuelle ([IP_raspberry]:[IP_serveur_NFS]:[IP_passerelle]:[masque_sous_réseau] )

Si votre configuration est bonne, le prochain reboot de votre carte vous fera basculer sur votre partage NFS.

Pour utiliser votre carte SD de taille réduite, il suffit de formater celle-ci en FAT (16 ou 32 en fonction de sa taille) avec pour nom boot  puis de copier l’ensemble des fichiers contenus dans la partition boot  de votre carte actuelle vers la nouvelle.

Des optimisations supplémentaires sont possibles comme déplacer le swap vers un loop device réseau. Dans mon cas, la distribution XBian ne possédant pas de swap, les manipulations s’arrêtent donc ici, mais voici quelques commandes pour réaliser cette opération :

sudo apt-get remove --purge dphys-swapfile
sudo rm /var/swap
sudo rm /etc/init.d/dphys-swapfile
sudo update-rc.d dphys-swapfile remove

sudo dd if=/dev/zero of=/var/swap bs=1M count=1024
sudo losetup /dev/loop0 /var/swap
sudo mkswap /dev/loop0
sudo swapon /dev/loop0
sudo nano /etc/rc.local
echo "swap settings"
sleep 2
losetup /dev/loop0 /var/swap
mkswap /dev/loop0
swapon /dev/loop0

 

A propos de l'auteur :

Passionné par le monde informatique et ses applications dans la vie quotidienne. Chez moi sont hébergées deux RPi, l'une dédié multimédia, l'autre centre domotique. J'ai également conçu une solution de monitoring de chaufferie collective où notre chère carte fruité est le point central.


21 Comments

  • Répondre christian |

    Bonjour,
    J’ai un Nas Synology qu’ainsi d’un Rpi3 j’ai suivi votre tuto mais j’ai deux doutes :

    • lors de la creation du répertoire Rasp0 vous créez une règle NFS 192.168.0.15 (est-ce l’ip du Rpi ou du nas ?)
    • sous le Rpi vous donnez une ip 192.168.0.1 ! ca correspond à quoi ?

    Pour ma part :

    • ma box et en gestion DHCP 192.168.1.1
    • mon nas 192.168.1.100
    • mon Rpi 192.168.1.249

    Que dois-je faire pour que ca fonctionne car votre tuto est super mais vous avez pas donné les bases IP des Machines ! ( merci par avance de votre réponse )
    Cordialement
    Un newbie sous Rpi et linux ( faut bien un debut …… )

    • Répondre Manu |

      Bonjour,
      J’ai donné des indications sur l’adressage IP de mon réseau au fil de ce tutoriel.
      Concernant la règle à configurer sur le NAS, c’est bien évidemment l’IP du Rpi (qui sera le client NFS) qu’il faut indiquer.
      Pour résumer mon adressage IP :

      • NAS Synology/Serveur NFS : 192.168.0.1
      • Raspberry : 192.168.0.15
      • Livebox (Routeur/passerelle) : 192.168.0.254

      Sous Raspberry lors de la modification du cmdline.txt le paramètre nfsroot=192.168.0.1:/volume1/rasp0 correspond donc à l’adresse IP du NAS.
      Puis en fonction du paramétrage IP de votre Raspberry :

      • Vous avez configuré un bail DHCP fixe pour votre Raspberry et dans ce cas vous pouvez laisser tel quel le ip=dhcp
      • Vous avez configuré une adresse IP fixe directement sur votre Raspberry dans ce cas il faut utiliser la configuration suivante ip=[IP_raspberry]:[IP_serveur_NFS]:[IP_passerelle]:[masque_sous_réseau] soit dans votre cas ip=192.168.1.249:192.168.1.100:192.168.1.1:255.255.255.0
  • Répondre Arnaud |

    Bonjour,

    Je lis avec grand plaisir votre tuto !!
    Cependant, je rencontre un problème lors de la copie sur mon NAS (synology DS214se)
    Quand j’execute la commnde :
    sudo cp -axv /. /mnt/.

    Il m’indique « cp: impossible de préserver l’appartenance …….. argument invalide »

    Est-ce grave docteur ? 🙂

    • Répondre Manu |

      Il est possible que cela crée des problèmes ultérieurs si les fichiers n’ont pas conservés leur appartenance. Le paramètre « squash » (pas de mappage) est correctement configuré sur le NAS ?

  • Répondre Arnaud |

    Oui, la configuration côté NAS est correct :
    root@Cloud:/etc# cat exports

    /volume1/clone_disque 192.168.0.0/16(ro,async,no_wdelay,insecure,root_squash,insecure_locks,sec=sys,anonuid=1025,anongid=100)
    /volume1/RaspBerry_MediaCenter 192.168.0.252(rw,async,no_wdelay,insecure,no_root_squash,insecure_locks,sec=sys,anonuid=1025,anongid=100)
    /volume1/RaspBerry_Surveillance 192.168.0.254(rw,async,no_wdelay,crossmnt,insecure,no_root_squash,insecure_locks,sec=sys,anonuid=1025,anongid=100)

    Et en effet, ca ne fonctionne pas avec ce message d’erreur, le système ne boot pas… Auriez vous une solution ?
    De plus je ne pense pas à un problème de droit car l’erreur est « argument invalide »

    Merci d’avance pour votre aide 🙂

    • Répondre Manu |

      En essayant directement depuis le compte « root » (avec un petit « sudo su ») en supprimant le sudo avant la commande ?

      • Répondre hbpatrick81 |

        Bonjour,

        1. J’ai le même message, y a t’il une solution pour la copie ?

        2. J’ai une autre question concernant le fichier cmdline.txt, on doit indiquer : root=/dev/nfs mais dans /dev je n’ai pas nfs. Est-ce normal ?

        3. Je suppose que s’il était présent (/dev/nsf), on devrait le rajouter dans le fstab comme (/dev/mmcblk0p2) ?

        Merci

  • Répondre Andy |

    Salut et merci pour ton tuto et d’ailleurs tous les autres (j’en ai suivi un bon paquet !)
    Pour celui là, j’ai eu une erreur au démarrage du montage en NFS sur le Rpi.
    En gros, le monitoring du Rpi des montages NFS avec rpc.statd était pas lancé. Ila fallu le lancer manuellement avec :
    /etc/init.d/rpcbind start

    j’ai aussi demarré :

    /etc/init.d/nfslock start

    Est-ce que tu as pu rencontrer ce genre de probleme ? Et surtout est-ce que tu as du modifier le fichier d’initialisation pour les lancer au démarrage, sachant que le montage NFS arrive en tout premier lieu…
    Bref.
    Je sais pas sous quelle distrib tu as fait ça, moi je l’ai lancé sous le dernier Rasbian Jessie (téléchargé il y a qq minutes)

    Voilà 🙂
    Merci encore pour toutes tes cruciales infos.
    ++

    • Répondre Manu |

      Salut, merci pour les compliments sur le site.
      J’ai fait ces manipulations sur la distribution XBian il y a pas mal de temps déjà. Je n’avais pas eu à lancer manuellement un quelconque service pour réaliser mon montage NFS.
      Merci pour ces précisions pour ceux qui tenteront l’aventure avec la dernière Raspbian Jessie.

  • Répondre Andy |

    De rien 😉
    En effet, je me suis rendu compte un tout petit moment après que la manip datait de l’année dernière… Je crois que quelqu’un l’a envoyé sur le Journal du Hacker récemment 😉

    J’essayerai de mettre ici un complément si je trouve que ca demarre pas au lancement 😉
    ++

  • Répondre Fabrice |

    Bonsoir,

    Merci pour ce tuto qui a fonctionné pour moi à un détail près

    J’ai du effectuer la modification suivante (ajout du rw) pour que tout soit OK :

    root=/dev/nfs rootfstype=nfs rw nfsroot=192.168.0.1:/volume1/rasp0,udp,vers=3 smsc95xx.turbo_mode=N ip=dhcp

    En effet, sans ceci, j’avais des « Read only » sur le file system.

  • Répondre Yannick |

    Bonjour,
    je suis sur un bananapi 2 (OS Debian GNU/Linux 8 \n \l)
    Mon problème est que dans le rep. /boot/ j’ai 3 fichiers:config-3.4.111-bananian, System.map-3.4.111-bananian, vmlinuz-3.4.111-bananian. mais pas de fichier cmdline.txt.
    et je là je bloque!
    Une âme charitable ?

    • Répondre Manu |

      Bonjour,
      Aucun moyen de t’aider de notre côté vu que nous travaillons exclusivement avec des Raspberry Pi et le système Raspbian officiel.
      Il existe peut-être des divergences de composants entre les deux cartes qui modifient le comportement du système lors du boot ce qui explique éventuellement l’absence de fichier « cmdline.txt ».

      • Répondre Yannick |

        Merci de ta réponse Manu,
        j’ai trouvé un fichier cmdline dans /proc mais impossible de le sauvegarder « Input/Output error ».
        je gratte et répondrai ici si je trouve.
        Bonne nuit!

          • Yannick |

            il contient ça:

            #
            # Automatically generated file; DO NOT EDIT.
            # Linux/arm 3.4.111 Kernel Configuration
            #
            CONFIG_ARM=y
            CONFIG_SYS_SUPPORTS_APM_EMULATION=y
            CONFIG_GENERIC_GPIO=y
            # CONFIG_ARCH_USES_GETTIMEOFFSET is not set
            CONFIG_GENERIC_CLOCKEVENTS=y
            CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
            CONFIG_KTIME_SCALAR=y
            CONFIG_HAVE_PROC_CPU=y
            CONFIG_STACKTRACE_SUPPORT=y
            CONFIG_LOCKDEP_SUPPORT=y
            CONFIG_TRACE_IRQFLAGS_SUPPORT=y
            CONFIG_HARDIRQS_SW_RESEND=y
            CONFIG_GENERIC_IRQ_PROBE=y
            CONFIG_GENERIC_LOCKBREAK=y
            CONFIG_RWSEM_GENERIC_SPINLOCK=y
            CONFIG_ARCH_HAS_CPUFREQ=y
            CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
            CONFIG_GENERIC_HWEIGHT=y
            CONFIG_GENERIC_CALIBRATE_DELAY=y
            CONFIG_ZONE_DMA=y
            CONFIG_NEED_DMA_MAP_STATE=y
            CONFIG_VECTORS_BASE=0xffff0000
            CONFIG_ARM_PATCH_PHYS_VIRT=y
            CONFIG_NEED_MACH_IO_H=y
            CONFIG_NEED_MACH_MEMORY_H=y
            CONFIG_GENERIC_BUG=y
            CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
            CONFIG_HAVE_IRQ_WORK=y
            CONFIG_IRQ_WORK=y

            #
            # General setup
            #
            CONFIG_EXPERIMENTAL=y
            ...

            rien de bien interressant!
            a chaque fois que j'enregistre \proc\cmdline, il est aussitot réécrit.

  • Répondre Lloyd |

    Super ce tuto, merci beaucoup.
    Pour ma part, j’ai essayé de faire ça sur mon RPi3 avec OSMC installé.
    Quelques remarques:
    – le fichier « sudo nano /mnt/etc/fstab » ne contient pas grand chose pour moi, je n’ai rien eu à commenter:
    D’ailleurs en voulant copier le contenu, je remarque que maintenant il est vide! ???

    – La commande  »
    sudo nano /mnt/etc/network/interfaces
    1
    sudo nano /mnt/etc/network/interfaces » me donne une fichier vide, donc rien a commenter également

    Par contre, j’ai voulu rebooter le Pi avec le contenu de la carte, sans faire la copie du /boot pour voir avant.
    Et en créant un fichier dans le /home/osmc, je remarque qu’il n’est pas créé sur le serveur NFS.
    Comment je peux débugger ce qui ne va pas et savoir où je suis vraiment (sur la carte, sur le NAS?)
    Merci de votre aide.
    Et super boulot

  • Répondre Lloyd |

    Je rajouterai qu’il serait bien de proposer un sudo apt-get update et un upgrade avant de faire la manip. Ca ne mange pas de pain ^^

Laissez un commentaire