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
sudosur 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 :
| Option | Signification |
|---|---|
rw | Autoriser l’accès en lecture et écriture |
ro | Autoriser l’accès en lecture seule |
sync | Écrire les données sur disque avant d’acquitter ; plus sûr mais plus lent |
async | Acquitter les écritures avant de vider sur disque ; plus rapide mais risqué en cas de crash |
no_subtree_check | Désactiver la vérification de sous-arborescence ; réduit les erreurs parasites lors des déplacements de fichiers |
subtree_check | Activer la vérification de sous-arborescence ; requis pour la sécurité lors de l’export d’un sous-répertoire |
root_squash | Mapper root du client vers l’utilisateur nobody (par défaut, recommandé) |
no_root_squash | Permettre à root du client d’agir comme root ; utiliser uniquement dans des environnements totalement fiables |
all_squash | Mapper tous les clients vers l’utilisateur anonyme |
anonuid=1000 | Définir l’UID pour les mappages anonymes |
fsid=0 | Marquer 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é | NFSv3 | NFSv4 |
|---|---|---|
| État du protocole | Sans état | Avec état |
| Ports utilisés | 2049 + dynamiques (111, mountd, statd, lockd) | 2049 uniquement |
| Règles de pare-feu | Complexes — plusieurs ports dynamiques | Simples — port unique |
| Sécurité | AUTH_SYS (UID/GID uniquement) | AUTH_SYS + Kerberos (RPCSEC_GSS) |
| Verrouillage de fichiers | NLM (démon séparé) | Intégré, obligatoire |
| Support ACL | Extensions propriétaires uniquement | ACL POSIX nativement |
| Noms de fichiers UTF-8 | Optionnel | Requis |
| Délégation | Non | Oui — mise en cache côté client |
| Pseudo-racine | Non | Oui — espace de noms unifié |
| Recommandé pour | Systèmes hérités, configurations simples | Clusters 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 :
| Option | Objectif |
|---|---|
_netdev | Retarde le montage jusqu’à ce que le réseau soit disponible — essentiel pour NFS au démarrage |
nofail | Le démarrage continue même si le serveur NFS est inaccessible |
soft | Retourne une erreur si le serveur ne répond pas (au lieu de bloquer) |
hard | Réessaie indéfiniment jusqu’à ce que le serveur réponde (par défaut, plus sûr pour les données) |
timeo=30 | Délai d’attente en dixièmes de seconde avant de réessayer |
retrans=3 | Nombre 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 :
| Option | Effet |
|---|---|
async (côté serveur) | Augmente la vitesse d’écriture au détriment de la sécurité des données en cas de crash |
noatime | Désactive les mises à jour de l’heure d’accès ; réduit le trafic d’écriture pour les charges de travail à lecture intensive |
actimeo=60 | Met en cache les attributs de fichiers pendant 60 secondes ; réduit les RPC de métadonnées |
nconnect=4 | Utilise 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/passwdpartagé, ou utilisez NFSv4 avecidmapd. - root_squash et opérations privilégiées : Avec
root_squashactivé (par défaut), l’utilisateurrootsur un client est mappé versnobody. Cela casse des opérations commechownet certaines sauvegardes. Utilisezno_root_squashuniquement sur des réseaux internes entièrement fiables. - Règles de pare-feu pour NFSv3 : NFSv3 utilise des ports RPC dynamiques pour
mountd,statdetlockd. Fixez-les sur des ports statiques dans/etc/sysconfig/nfset ouvrez-les dans votre pare-feu, ou passez à NFSv4 qui nécessite uniquement le port 2049. asyncvssync: L’optionasyncamé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 toujourssyncpour 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
autofsplutô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-serversur le serveur etnfs-commonsur les clients (Debian/Ubuntu), ounfs-utilssur les deux pour les systèmes RHEL. - Configurez les exports dans
/etc/exportsau format/chemin client(options)et rechargez avecexportfs -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
_netdevdans/etc/fstabpour que les montages NFS attendent le réseau au démarrage, et testez avecmount -a. - Réglez
rsize=1048576,wsize=1048576sur le client pour les transferts LAN à haut débit ; ajouteznconnect=4sur 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.