La configuration d’un serveur NFS sur Linux est l’un des moyens les plus rapides de partager des fichiers entre machines sur le même réseau sans installer des piles logicielles lourdes. NFS (Network File System) vous permet de monter un répertoire distant comme s’il s’agissait d’un disque local, ce qui le rend idéal pour les répertoires personnels partagés, les clusters de laboratoire, les caches de compilation et les bibliothèques multimédias. Dans ce guide, vous configurerez un serveur et un client NFS complets de zéro, vous comprendrez les options clés de /etc/exports, choisirez entre NFSv3 et NFSv4, réglerez les tailles des tampons de lecture/écriture pour les performances et rendrez les montages fiables avec /etc/fstab.

Prérequis

  • Deux machines Linux sur le même réseau — l’une faisant office de serveur, l’autre de client. Les deux rôles peuvent également être sur des machines virtuelles.
  • Accès root ou sudo sur les deux machines.
  • Accès du pare-feu au port 2049/TCP (et ports supplémentaires pour NFSv3 si utilisé).
  • Famille Debian/Ubuntu ou RHEL/Fedora/Rocky — les commandes pour les deux sont indiquées tout au long du guide.
  • Connaissances de base en adressage IP et permissions de fichiers Linux.

Installation du Serveur NFS

Sur le nœud serveur, installez le paquet du serveur NFS :

# Debian / Ubuntu
sudo apt update && sudo apt install -y nfs-kernel-server

# RHEL / Fedora / Rocky / AlmaLinux
sudo dnf install -y nfs-utils

Activez et démarrez le service pour qu’il survive aux redémarrages :

sudo systemctl enable --now nfs-server
sudo systemctl status nfs-server

Vérifiez que le serveur NFS écoute sur le port 2049 :

ss -tlnp | grep 2049

Vous devriez voir une entrée pour nfsd liée à 0.0.0.0:2049.

Configuration de /etc/exports

Le fichier /etc/exports est au cœur de la configuration du serveur NFS. Chaque ligne définit un chemin exporté et les clients qui peuvent y accéder, ainsi que les options de montage.

Syntaxe de base :

/chemin/vers/export  spec_client(options)

Un exemple minimal fonctionnel qui exporte /srv/nfs vers tout un sous-réseau :

/srv/nfs  192.168.1.0/24(rw,sync,no_subtree_check)

Créez le répertoire partagé et définissez les permissions avant l’export :

sudo mkdir -p /srv/nfs
sudo chown nobody:nogroup /srv/nfs   # mappage anonyme NFS typique
sudo chmod 755 /srv/nfs

Options courantes de /etc/exports expliquées :

OptionSignification
rwAutoriser l’accès en lecture et écriture
roAutoriser l’accès en lecture seule
syncÉcrire les données sur disque avant d’acquitter ; plus sûr mais plus lent
asyncAcquitter les écritures avant de vider sur disque ; plus rapide mais risqué en cas de crash
no_subtree_checkDésactiver la vérification de sous-arborescence ; réduit les erreurs parasites lors des déplacements de fichiers
subtree_checkActiver la vérification de sous-arborescence ; requis pour la sécurité lors de l’export d’un sous-répertoire
root_squashMapper root du client vers l’utilisateur nobody (par défaut, recommandé)
no_root_squashPermettre à root du client d’agir comme root ; utiliser uniquement dans des environnements totalement fiables
all_squashMapper tous les clients vers l’utilisateur anonyme
anonuid=1000Définir l’UID pour les mappages anonymes
fsid=0Marquer cet export comme la pseudo-racine NFSv4

Un fichier d’exports prêt pour la production avec plusieurs partages :

# Partage lecture-écriture pour le sous-réseau de l'équipe dev
/srv/nfs/projects  192.168.10.0/24(rw,sync,no_subtree_check,root_squash)

# Dépôt ISO en lecture seule disponible pour tous les clients internes
/srv/nfs/isos  192.168.0.0/16(ro,sync,no_subtree_check)

# Répertoires personnels partagés — hôtes spécifiques uniquement
/home  192.168.10.5(rw,sync,no_subtree_check) 192.168.10.6(rw,sync,no_subtree_check)

Après avoir modifié /etc/exports, appliquez les changements sans redémarrer le serveur :

sudo exportfs -ra    # recharger tous les exports
sudo exportfs -v     # lister les exports actifs avec leurs options

Comparaison NFSv3 vs NFSv4

Choisir la bonne version de NFS est important pour la sécurité, la configuration du pare-feu et le support des fonctionnalités. Les déploiements modernes devraient utiliser NFSv4 par défaut, sauf si des systèmes hérités nécessitent NFSv3.

FonctionnalitéNFSv3NFSv4
État du protocoleSans étatAvec état
Ports utilisés2049 + dynamiques (111, mountd, statd, lockd)2049 uniquement
Règles de pare-feuComplexes — plusieurs ports dynamiquesSimples — port unique
SécuritéAUTH_SYS (UID/GID uniquement)AUTH_SYS + Kerberos (RPCSEC_GSS)
Verrouillage de fichiersNLM (démon séparé)Intégré, obligatoire
Support ACLExtensions propriétaires uniquementACL POSIX nativement
Noms de fichiers UTF-8OptionnelRequis
DélégationNonOui — mise en cache côté client
Pseudo-racineNonOui — espace de noms unifié
Recommandé pourSystèmes hérités, configurations simplesClusters Linux modernes, traversée de pare-feu

Pour forcer une version NFS spécifique sur le client :

# Monter en utilisant explicitement NFSv4
sudo mount -t nfs4 server:/srv/nfs /mnt/nfs

# Monter en utilisant NFSv3 (si requis par un serveur hérité)
sudo mount -t nfs -o vers=3 server:/srv/nfs /mnt/nfs

Installation du Client NFS et Montage des Partages

Sur le nœud client, installez les utilitaires client NFS :

# Debian / Ubuntu
sudo apt install -y nfs-common

# RHEL / Fedora / Rocky
sudo dnf install -y nfs-utils

Créez un point de montage local et montez l’export :

sudo mkdir -p /mnt/nfs
sudo mount -t nfs4 192.168.1.100:/srv/nfs /mnt/nfs

Confirmez que le montage est actif et vérifiez l’espace disponible :

df -hT /mnt/nfs
mount | grep nfs

Testez l’accès en écriture depuis le client :

touch /mnt/nfs/testfile && echo "Accès en écriture confirmé"

Rendre les Montages NFS Persistants avec /etc/fstab

Un montage manuel disparaît après un redémarrage. Ajoutez le partage dans /etc/fstab pour le rendre permanent :

# Format : <serveur>:<export>  <pointdemontage>  <type>  <options>  <dump>  <pass>
192.168.1.100:/srv/nfs  /mnt/nfs  nfs4  defaults,_netdev  0  0

Options fstab clés pour NFS :

OptionObjectif
_netdevRetarde le montage jusqu’à ce que le réseau soit disponible — essentiel pour NFS au démarrage
nofailLe démarrage continue même si le serveur NFS est inaccessible
softRetourne une erreur si le serveur ne répond pas (au lieu de bloquer)
hardRéessaie indéfiniment jusqu’à ce que le serveur réponde (par défaut, plus sûr pour les données)
timeo=30Délai d’attente en dixièmes de seconde avant de réessayer
retrans=3Nombre de retransmissions avant d’abandonner (avec soft)

Une entrée fstab robuste pour la production :

192.168.1.100:/srv/nfs  /mnt/nfs  nfs4  defaults,_netdev,nofail,hard,timeo=30  0  0

Après avoir modifié fstab, testez sans redémarrer :

sudo mount -a
df -hT /mnt/nfs

Optimisation des Performances : rsize et wsize

Par défaut, NFS utilise des tailles de tampon conservatrices (souvent 1 Mo sur les noyaux modernes, mais les anciens systèmes peuvent utiliser 32 Ko ou 64 Ko par défaut). Sur un réseau gigabit ou plus rapide, augmenter rsize (tampon de lecture) et wsize (tampon d’écriture) à 1 Mo améliore significativement le débit.

Monter avec des tampons optimisés :

sudo mount -t nfs4 -o rsize=1048576,wsize=1048576 192.168.1.100:/srv/nfs /mnt/nfs

Évaluer le débit avant et après l’optimisation :

# Test d'écriture (client vers serveur)
dd if=/dev/zero of=/mnt/nfs/testfile bs=1M count=512 conv=fdatasync

# Test de lecture (serveur vers client)
dd if=/mnt/nfs/testfile of=/dev/null bs=1M

Options de performance supplémentaires :

OptionEffet
async (côté serveur)Augmente la vitesse d’écriture au détriment de la sécurité des données en cas de crash
noatimeDésactive les mises à jour de l’heure d’accès ; réduit le trafic d’écriture pour les charges de travail à lecture intensive
actimeo=60Met en cache les attributs de fichiers pendant 60 secondes ; réduit les RPC de métadonnées
nconnect=4Utilise plusieurs connexions TCP vers le serveur (Linux 5.3+, NFSv4.1+)

Pour les serveurs NVMe sur un réseau 10 GbE, combinez rsize=1048576,wsize=1048576,nconnect=4,noatime pour un débit maximal.

Ajoutez les options d’optimisation dans fstab :

192.168.1.100:/srv/nfs  /mnt/nfs  nfs4  defaults,_netdev,nofail,rsize=1048576,wsize=1048576,noatime  0  0

Scénario Réel : /home Partagé sur un Cluster de Laboratoire

Vous disposez d’un cluster de laboratoire Linux à quatre nœuds — un nœud de gestion (lab-mgmt) et trois nœuds de travail (lab-worker-1, lab-worker-2, lab-worker-3). Tous les nœuds partagent les mêmes comptes utilisateurs, et vous voulez que les utilisateurs voient leurs répertoires personnels quel que soit le nœud sur lequel ils se connectent. NFS rend cela transparent.

Sur lab-mgmt (serveur NFS) :

# Installer le serveur
sudo apt install -y nfs-kernel-server

# Les répertoires personnels existent déjà sous /home
# Exporter /home vers tous les nœuds de travail
sudo bash -c 'cat >> /etc/exports <<EOF

/home  192.168.10.11(rw,sync,no_subtree_check) 192.168.10.12(rw,sync,no_subtree_check) 192.168.10.13(rw,sync,no_subtree_check)
EOF'

sudo exportfs -ra
sudo exportfs -v

Sur chaque nœud de travail (lab-worker-1/2/3) :

# Installer le client
sudo apt install -y nfs-common

# Créer le point de montage (sauvegarder /home local si nécessaire)
sudo mount -t nfs4 192.168.10.10:/home /home

# Test : se connecter en tant qu'utilisateur normal et vérifier la présence des fichiers
ls /home/jcarlos

Rendre persistant avec fstab sur chaque nœud de travail :

192.168.10.10:/home  /home  nfs4  defaults,_netdev,hard,timeo=30,rsize=1048576,wsize=1048576  0  0

Désormais, lorsqu’un utilisateur se connecte à n’importe quel nœud de travail, son répertoire personnel — incluant l’historique du shell, les clés SSH et les fichiers de configuration — est identique sur tous les nœuds. Associez cela à un /etc/passwd partagé ou à LDAP pour des comptes utilisateurs entièrement cohérents.

Pièges et Cas Particuliers

  • Incompatibilité UID/GID : NFS se base sur les UIDs et GIDs numériques, pas sur les noms d’utilisateurs. Si un utilisateur a l’UID 1001 sur le serveur mais l’UID 1002 sur le client, ils verront les fichiers de l’autre avec le mauvais propriétaire. Synchronisez les UIDs/GIDs sur tous les nœuds avec LDAP ou un /etc/passwd partagé, ou utilisez NFSv4 avec idmapd.
  • root_squash et opérations privilégiées : Avec root_squash activé (par défaut), l’utilisateur root sur un client est mappé vers nobody. Cela casse des opérations comme chown et certaines sauvegardes. Utilisez no_root_squash uniquement sur des réseaux internes entièrement fiables.
  • Règles de pare-feu pour NFSv3 : NFSv3 utilise des ports RPC dynamiques pour mountd, statd et lockd. Fixez-les sur des ports statiques dans /etc/sysconfig/nfs et ouvrez-les dans votre pare-feu, ou passez à NFSv4 qui nécessite uniquement le port 2049.
  • async vs sync : L’option async améliore les performances en écriture mais les données non encore vidées sur disque peuvent être perdues en cas de crash du serveur. Utilisez toujours sync pour les bases de données partagées, les artefacts de compilation ou tout ce où l’intégrité des données est importante.
  • Descripteurs NFS obsolètes : Si le serveur redémarre ou si les exports changent pendant que des clients sont montés, les processus peuvent recevoir des erreurs “Stale file handle”. Démontez et remontez le partage pour effacer l’état obsolète.
  • Montage automatique avec autofs : Pour les grands environnements, envisagez autofs plutôt que des entrées fstab statiques. Autofs monte les partages à la demande et les démonte quand ils sont inactifs, réduisant le temps de démarrage et évitant les échecs quand les serveurs NFS sont temporairement indisponibles.

Résolution de Problèmes

Le montage se bloque indéfiniment : Le client ne peut pas atteindre le serveur. Vérifiez la connectivité avec ping, vérifiez que le service NFS fonctionne sur le serveur (systemctl status nfs-server) et confirmez que le port 2049 est ouvert (nc -zv server 2049).

Permission refusée lors du montage : L’adresse IP du client n’est pas dans /etc/exports. Vérifiez avec exportfs -v et ajoutez le CIDR ou le nom d’hôte correct du client, puis exécutez exportfs -ra.

Fichiers appartenant à nobody sur le client : Incompatibilité UID/GID. Alignez les UIDs sur tous les systèmes ou configurez idmapd pour le mappage d’identités NFSv4. Vérifiez /var/log/syslog sur le serveur pour les erreurs idmapd.

Performances NFS lentes : Vérifiez les valeurs rsize et wsize avec mount | grep nfs. Augmentez à 1048576. Vérifiez également que l’export côté serveur utilise async si la vitesse d’écriture est critique et que le risque de durabilité est acceptable.

“exportfs: /etc/exports: No such file or directory” : Créez le fichier : sudo touch /etc/exports, ajoutez vos lignes d’export et exécutez exportfs -ra.

Résumé

  • NFS partage des répertoires d’un serveur vers plusieurs clients en utilisant un protocole léger natif au noyau.
  • Installez nfs-kernel-server sur le serveur et nfs-common sur les clients (Debian/Ubuntu), ou nfs-utils sur les deux pour les systèmes RHEL.
  • Configurez les exports dans /etc/exports au format /chemin client(options) et rechargez avec exportfs -ra.
  • Préférez NFSv4 pour les déploiements modernes : port unique (2049), connexions avec état, verrouillage intégré et meilleure compatibilité avec les pare-feux.
  • Utilisez _netdev dans /etc/fstab pour que les montages NFS attendent le réseau au démarrage, et testez avec mount -a.
  • Réglez rsize=1048576,wsize=1048576 sur le client pour les transferts LAN à haut débit ; ajoutez nconnect=4 sur Linux 5.3+ pour NFSv4.1 multi-connexions.
  • Synchronisez les UIDs/GIDs sur tous les nœuds pour éviter les incompatibilités de permissions — le problème NFS le plus fréquent.

Articles Connexes