Howto NFS
- Documentation : http://nfs.sourceforge.net/nfs-howto
NFS (Network File System) est un protocole réseau permettant le partage de fichiers entre un serveur et des clients.
Serveur NFS
Installation
On utilise généralement le serveur NFS natif du kernel Linux
# apt install nfs-kernel-server
Il est aussi possible d’utiliser Ganesha, une implémentation orientée « haute disponibilité ».
Configuration
On peut configurer certaines options via le fichier
/etc/default/nfs-kernel-server
:
RPCNFSDCOUNT=8
RPCMOUNTDOPTS="--no-nfs-version 4 --debug all"
Note : Si vous n’avez pas mis
--no-nfs-version 4
, le montage se fera par défaut en version 4. Il faudra penser à spécifier l’option de montagenfsvers=3
.
Les partages se configurent dans le fichier /etc/exports
:
/srv/nfs 192.0.2.4(rw,root_squash,sync,no_subtree_check)
/srv/nfs2 192.0.2.0/27(ro) 192.0.242(rw)
Quelques options possibles :
rw
: active le mode read-write (par défaut c’est en read-only)async
: autorise le serveur à répondre aux clients même si les fichiers ne sont pas encore écrits, cela améliore les performances mais c’est plus dangereux (possibilité de perdre des fichiers dans certains cas)no_subtree_check
: désactive certaines vérifications qu’un fichier accédé via NFS appartient bien à un répertoire exporté. Cette option est conseillée en général (c’est même devenu le comportement par défaut)insecure
: désactive la nécessité d’utiliser des ports inférieurs à 1024 pour les clients NFSno_root_squash
/all_squash
: options pour la gestion du mapping UID/GID
Mapping uid/gid
Par défaut, les requêtes faites depuis un client avec UID/GID à 0
sont mappées en anonymous : c’est le root_squash
.
Si l’on éviter ce comportement, il faut spécifier l’option
no_root_squash
.
On peut aussi mapper toutes les requêtes vers un anonymous
avec l’option all_squash
, et l’on peut préciser UID/GID
avec les options anonuid
et anongid
.
Sans l’option all_squash
les UID/GID sont conservés
entre le serveur et tous les clients NFS, il faut donc s’assurer d’avoir
une cohérence des UID/GID sur l’ensemble des serveurs concernés.
État des exports
On peut lister les exports actifs :
# showmount -e localhost
Client NFS
Installation
# apt install nfs-common
Utilisation
On peut vérifier la connexion vers un serveur NFS ainsi :
# rpcinfo -p 192.0.2.1
Pour activer un partage NFS :
# mount -t nfs -o nfsvers=3 192.0.2.1:/srv/nfs /mnt
/etc/fstab
:
192.0.2.1:/srv/nfs /mnt nfs nfsvers=3 0 0
192.0.2.1:/srv/nfs /mnt nfs auto,rw,_netdev,mountproto=tcp,comment=systemd.automount 0 0
192.0.2.1:/srv/nfs /mnt nfs defaults,_netdev,vers=3,x-systemd.device-timeout=42 0 0
Voici un exemple de montage NFS :
# mount | grep nfs
192.0.2.1:/srv/nfs on /mnt type nfs4 (rw,relatime,vers=4,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.0.2.4,minorversion=0,local_lock=none,addr=192.0.2.1)
Quelques options possibles :
nfsvers=3
: force le protocole NFSv3 à la place de NFSv4soft
: si le serveur NFS ne répond, stoppe les requêtes au bout d’un certain temps (par défaut c’est infini)timeo=n
: temps d’attente (en dixièmes de seconde) avant d’effectuer une nouvelle tentative vers le serveur NFSretry=n
: temps d’attente (en minutes) lors de la commande mount… par défaut c’est environ une semaine !noac
: empêche tout mise en cache des attributs des fichiersrsize=n,wsize=n
: forcer le nombre maximal d’octets pour une requête NFS (en général, cela s’adapte entre le client et le serveur)
Réseau
NFS est un protocole complexe qui utilise de nombreux ports TCP et UDP. En général, on autorise tous les accès réseau entre un client et un serveur.
NFSv3 ou NFSv4 ?
NFSv4 est un protocole très différent de NFSv3. On peut avoir une
certaine compatibilité en utilisant l’option sec=sys
mais
pour des cas simples il est souvent plus simple d’utiliser NFSv3. NFSv4
a un grand intérêt d’un point de vue sécurité en l’utilisant avec
Kerberos (sec=krb5
) : la sécurité ne repose plus sur les
UID/GID pour identifier les utilisateurs à l’origine des requêtes mais
sur des tickets d’authentification Kerberos.
Service rpc-statd
En cas d’une mise à niveau vers Debian 10 du serveur NFS, il est
possible que le service rpc-statd
soit désactivé au
démarrage. Ce service peut être nécessaire pour que des clients se
connectent en NFSv3. Il faudra activer et démarrer ce service si on a
des erreurs de cette forme dans les logs (/var/log/syslog
)
sur le serveur :
Jan 01 12:34:56 server.host.name kernel: [ 1234.123456] lockd: cannot monitor client.host.name
Sur les clients, on aura des erreurs de cette forme :
Jan 01 12:34:56 client.host.name kernel: [ 1234.123456] lockd: server 10.1.2.3 not responding, still trying
Plomberie
Sous Linux, le répertoire /var/lib/nfs/
contient pas mal
d’informations, notamment /var/lib/nfs/etab
contient la
liste des partages et /var/lib/nfs/rmtab
la liste des
clients NFS. Pour de la haute-disponibilité, on pourra partager ce
répertoire entre plusieurs serveurs afin d’assurer une tolérance de
panne entre les clients NFS sans nécessité de remonter les volumes.
FAQ
Serveur NFS sous Debian 6
Sous Debian Squeeze, il est recommandé de désactiver l’option
RPCMOUNTDOPTS
dans le fichier
/etc/default/nfs-kernel-server
sinon cela pose des problèmes avec les groupes
secondaires.
NFS sous Debian 7
Sous Debian Wheezy, pour conserver les UID/GID il faut spécifier un
domaine similaire sur le client et serveur dans
/etc/idmapd.conf
Serveur NFS sous Debian 7, client NFS sous Debian 6
Si le serveur NFS est sous Debian Wheezy et le client sous Debian
Squeeze, il faudra mettre NEED_IDMAPD=yes
dans
/etc/default/nfs-common
sur le client.
Le client NFS ne monte par le répertoire au démarrage
Pour diverses raisons il peut y avoir un délai entre la configuration
réseau et la disponibilité du serveur NFS au démarrage. On peut tester
de mettre quelques dizaines de secondes d’attente dans la configuration
fstab via le paramètre x-systemd.device-timeout
, par
exemple :
192.0.2.1:/home /home nfs defaults,_netdev,vers=3,x-systemd.device-timeout=42 0 0