Monter un dossier distant par NFS

De quoi s'agit-il ?

Supposons qu'un répertoire soit exposé par un serveur NFS distant. Pour que ce répertoire soit exploitable par un ordinateur Linux, il faut que celui-ci soit monté dans le système de fichiers de celui-ci.
Dans notre exemple, l'objectif est que les Pi Zero du cluster utilisent tous le même répertoire comme racine des serveurs Apache installés sur chacun d'eux. Il s'agit du répertoire /var/www/pub qui est localisé sur le contrôleur du cluster, à savoir le Raspberry Pi 3. 

Prérequis

Il faut disposer d'un serveur NFS. Voir l'article intitulé "Partager un dossier par NFS".

Installation du client NFS

En principe, dans les distributions des p1, p2, p3 et p4 téléchargées sur le site https://clusterhat.com/setup-software, les composants nécessaires sont déjà installés. Ce paragraphe ne se justifie ici, que si une autre distribution a été utilisée pour les Pi Zero ou pour un partage NFS en dehors du contexte du ClusterHAT, pour fait un serveur NAS par exemple.
Deux composants sont nécessaires : rpcbind et nfs-common.  Ces composant peut être installés à l'aide de la commande apt-get.
pi@slave02:~ $ sudo apt-get update
. . .
pi@slave02:~ $ sudo apt-get upgrade
. . .
pi@slave02:~ $ sudo  apt-get install rpcbind
. . .
pi@slave02:~ $ sudo  apt-get install nfs-common
. . .
pi@slave02:~ $

Montage du dossier

Dans notre exemple, l'objectif est de partager le dossier /var/www/pub situé physiquement sur le serveur cluster01 dans chaque Pi Zero (slave01, slave02, slave03 et slave04) sur le répertoire /var/www/html utilisé comme répertoire racine des serveurs Apache installés sur ces derniers. Mais cette fonction peut être utilisée dans n'importe quel contexte, il suffit que le répertoire à partager sur le réseau local soit défini comme serveur NFS.
Comme l'installation d'Apache2 installe du contenu, il faut prendre la précaution de vider le répertoire /var/www/html des Pi Zero (commande rm) et de vérifier que le répertoire est bien vide (commande ls). Sinon le montage n'est pas possible.
pi@slave02:~ $ rm -R /var/www/html/*
pi@slave02:~ $ ls /var/www/html
pi@slave02:~ $ sudo mount -t nfs cluster01:/var/www/pub /var/www/html
pi@slave02:~ $

Pérenniser le montage

L'inconvénient de la commande mount c'est que le montage ne dure que pendant le fonctionnement de l'ordinateur. Après un reboot, il faut à nouveau penser à relancer la commande mount pour retrouver la fonctionnalité.
Ce qu'il faudrait c'est automatiser le montage du dossier, comme c'est le cas pour la carte microSD des Raspberry Pi. Cela se passe dans le fichier /etc/fstab. La modification  de ce fichier a déjà été traitée lors d'un article précédent intitulé "Transférer Rasbian sur un disque externe (2ème partie)".
pi@slave02:~ $ sudo nano /etc/fstab
pi@slave02:~ $
Il suffit d'ajouter la ligne suivante au contenu du fichier :
proc                    /proc          proc    defaults              0       0
PARTUUID=a8fe70f4-01    /boot          vfat    defaults              0       2
PARTUUID=a8fe70f4-02    /              ext4    defaults,noatime      0       1
cluster01:/var/www/pub  /var/www/html  nfs     defaults,_netdev,rw   0       0
Dans le fichier /etc/fstab, on reconnait les deux points de montage standards des Raspberry PI, relatifs respectivement à la section boot de la carte microSD monté en FAT32 et au système de fichier racine / de Rasbian montée en ext4.
Il suffit d'ajouter une ligne avec les paramètres de montage.
  • cluster01 est le nom du serveur distant. Il peut être remplacé par l'adresse IP du serveur. 
  •  /var/www/pub est le répertoire partagé en NFS sur le serveur distant. Il est séparé du nom de celui-ci par :.
  • /var/www/html est le nom du répertoire de montage. Le répertoire doit exister et être vide dans le système de fichier dans lequel  il doit être monté. Dans l'exemple, il s'agit du répertoire racine du serveur Apache qui pointe sur un répertoire partagé sur un autre serveur. 
  • nfs est le type de montage. Il correspond au paramètre -t de  la commande mount
  • default regroupe toutes les options par défaut.
  • _netdev indique qu'il faut que le réseau soit opérationnel pour que le montage ait lieu. En effet, il ne faudrait pas planter le serveur au démarrage à cause d'un problème réseau dont, disent les mauvaises langues, l'état normal est la panne. Car il est difficile, pour ne pas dire impossible de réparer un serveur distant qui n'a pas démarré. Dans le cas du ClusterHAT, cette option n'est pas indispensable du fait que les Pi Zero sont connectés physiquement par leur connecteur microUSB.
  • rw indique que l'accès est en lecture et en écriture. 
Il suffit de redémarrer les serveur pour prendre en compte ces paramètres :
pi@slave02:~ $ sudo reboot

Vérifier le montage

Il suffit de lancer la commande mount sans paramètre :
pi@slave02:~ $ mount
/dev/mmcblk0p2 on / type ext4 (rw,noatime,data=ordered)
devtmpfs on /dev type devtmpfs (rw,relatime,size=217632k,nr_inodes=54408,mode=755)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=28,pgrp=1,timeout=0,minproto=5,maxproto=5,direct)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
mqueue on /dev/mqueue type mqueue (rw,relatime)
sunrpc on /run/rpc_pipefs type rpc_pipefs (rw,relatime)
configfs on /sys/kernel/config type configfs (rw,relatime)
/dev/mmcblk0p1 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)
cluster01:/var/www/pub on /var/www/html type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.112,local_lock=none,addr=192.168.1.101,_netdev)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=44388k,mode=700,uid=1000,gid=1000)
pi@slave02:~ $

Commentaires

Posts les plus consultés de ce blog

Gérer la mise en veille

Configurer VSCode pour programmer et déboguer à distance sur Raspberry Pi

Créer un nouvel utilisateur Raspbian