NFS (Network File System) permet de partager des répertoires entre plusieurs
serveurs Linux, comme s’ils étaient locaux. Vous montez un dossier distant
avec une simple commande mount et vos applications y accèdent de façon
transparente. Ce guide vous accompagne de l’installation d’un serveur NFSv4.2
sur Ubuntu 24.04 jusqu’au montage côté client, avec les options de
performance, la sécurité Kerberos et le dépannage — toutes les commandes
ont été testées en lab.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Fonctionnement de NFS : protocole, versions, architecture client-serveur
- Installation :
nfs-kernel-server(serveur) etnfs-common(client) - Configuration des exports :
/etc/exports, optionsrw,ro,sync - Montage côté client : commande
mount,/etc/fstab, négociation NFSv4.2 - Permissions :
root_squash,all_squash,idmapd - Performances :
rsize,wsize,nconnect, benchmarks - Sécurité Kerberos :
krb5,krb5i,krb5p - Dépannage : erreurs fréquentes et résolutions testées
Qu’est-ce que NFS ?
Section intitulée « Qu’est-ce que NFS ? »NFS (Network File System) est un protocole réseau qui permet à un serveur de partager des répertoires avec d’autres machines sur le réseau. Créé en 1984 par Sun Microsystems, il est devenu un standard dans le monde Unix/Linux.
Analogie : imaginez un serveur de fichiers comme une bibliothèque centrale. Chaque machine cliente « emprunte » un rayon entier (un répertoire partagé) et le place dans sa propre étagère (point de montage). Les livres restent physiquement à la bibliothèque, mais chaque emprunteur les lit et les modifie comme s’ils étaient chez lui.
Évolution des versions
Section intitulée « Évolution des versions »| Version | Année | Apports principaux |
|---|---|---|
| NFSv2 | 1989 | Première version publique, fichiers limités à 2 Go |
| NFSv3 | 1995 | Fichiers volumineux, écriture asynchrone, meilleur cache |
| NFSv4 | 2003 | Protocole à états, un seul port (2049/tcp), sécurité Kerberos native |
| NFSv4.1 | 2010 | Sessions, pNFS (parallel NFS) pour la performance |
| NFSv4.2 | 2016 | Copie côté serveur, sparse files, étiquetage sécurité |
Pourquoi utiliser NFS ?
Section intitulée « Pourquoi utiliser NFS ? »NFS reste pertinent pour plusieurs cas d’usage concrets :
- Centraliser les données : un seul emplacement à sauvegarder au lieu de copier les fichiers sur chaque machine
- Partager des répertoires home : les utilisateurs retrouvent leurs fichiers sur n’importe quel poste
- Distribuer des configurations : scripts, certificats, fichiers partagés accessibles depuis tout le parc
- Fournir du stockage à Kubernetes : NFS sert de backend pour les PersistentVolumes en lecture/écriture partagée (RWX)
NFS vs alternatives
Section intitulée « NFS vs alternatives »| Critère | NFS | iSCSI | Samba (CIFS) | SSHFS |
|---|---|---|---|---|
| Protocole | Fichiers | Bloc | Fichiers | Fichiers |
| Port | 2049/tcp | 3260/tcp | 445/tcp | 22/tcp |
| Clients natifs | Linux, macOS | Linux, Windows | Windows, Linux | Linux, macOS |
| Performance | Bonne | Excellente | Moyenne | Faible |
| Complexité | Faible | Modérée | Faible | Très faible |
| Cas d’usage | Partages Linux | Disques virtuels | Partages Windows | Accès ponctuel |
Prérequis
Section intitulée « Prérequis »- 2 machines Ubuntu 24.04 (physiques ou virtuelles)
- Connectivité réseau entre les deux (même sous-réseau ou routé)
- Accès root ou
sudosur les deux machines - Port 2049/tcp ouvert entre serveur et client
Pour reproduire ce lab, deux VMs KVM suffisent : un serveur (192.168.122.50) et un client (192.168.122.225).
Installation du serveur NFS
Section intitulée « Installation du serveur NFS »Le paquet nfs-kernel-server fournit le serveur NFS intégré au noyau Linux.
C’est la méthode recommandée sur Ubuntu car elle offre les meilleures
performances.
sudo apt updatesudo apt install nfs-kernel-serversudo dnf install nfs-utilsLe service démarre automatiquement. Vérifiez son état :
sudo systemctl status nfs-serverRésultat attendu : Active: active (exited). Le statut exited est normal
car le serveur NFS fonctionne via des threads noyau, pas un processus classique.
Configurer les exports
Section intitulée « Configurer les exports »Le fichier /etc/exports définit quels répertoires le serveur partage et avec
quelles permissions. Chaque ligne décrit un export : le chemin local, le réseau
autorisé et les options entre parenthèses.
Créer les répertoires partagés
Section intitulée « Créer les répertoires partagés »Commencez par créer la structure de répertoires. Avec NFSv4, on définit une
racine d’export (ici /srv/nfs) qui sert de point d’entrée unique pour
tous les partages :
sudo mkdir -p /srv/nfs/partage /srv/nfs/projetssudo chown nobody:nogroup /srv/nfs/partage /srv/nfs/projetsConfigurer /etc/exports
Section intitulée « Configurer /etc/exports »Éditez le fichier /etc/exports pour déclarer vos partages :
sudo nano /etc/exports/srv/nfs 192.168.122.0/24(rw,sync,fsid=0,crossmnt,no_subtree_check)/srv/nfs/partage 192.168.122.0/24(rw,sync,no_subtree_check,no_root_squash)/srv/nfs/projets 192.168.122.0/24(ro,sync,no_subtree_check,all_squash)Comprendre les options d’export
Section intitulée « Comprendre les options d’export »| Option | Signification | Quand l’utiliser |
|---|---|---|
rw | Lecture et écriture autorisées | Partages collaboratifs |
ro | Lecture seule | Distributions de configs, documentation |
sync | Écrit sur disque avant de répondre au client | Toujours en production (fiabilité) |
async | Répond avant l’écriture sur disque | Tests de performance uniquement (risque de perte) |
fsid=0 | Désigne la racine du pseudo-filesystem NFSv4 | Une seule ligne avec cette option |
crossmnt | Traverse les sous-montages automatiquement | Sur la racine d’export |
no_subtree_check | Désactive la vérification de sous-arbre | Recommandé (performances + stabilité) |
no_root_squash | Le root du client reste root sur le serveur | Déploiement automatisé, Ansible |
root_squash | Le root du client devient nobody (défaut) | Production (sécurité) |
all_squash | Tous les utilisateurs deviennent nobody | Partages publics en lecture seule |
anonuid=N / anongid=N | UID/GID utilisé pour les utilisateurs « squashés » | Contrôler les permissions du nobody |
Appliquer les exports
Section intitulée « Appliquer les exports »Après toute modification de /etc/exports, appliquez les changements :
sudo exportfs -raVérification — Affichez les exports actifs avec leurs options :
sudo exportfs -v/srv/nfs 192.168.122.0/24(rw,sync,wdelay,crossmnt,root_squash,...,fsid=0,...)/srv/nfs/partage 192.168.122.0/24(rw,sync,wdelay,no_root_squash,...,no_subtree_check,...)/srv/nfs/projets 192.168.122.0/24(ro,sync,wdelay,root_squash,...,all_squash,...,no_subtree_check,...)Monter un partage NFS côté client
Section intitulée « Monter un partage NFS côté client »Installer le client NFS
Section intitulée « Installer le client NFS »sudo apt updatesudo apt install nfs-commonsudo dnf install nfs-utilsMontage manuel
Section intitulée « Montage manuel »Créez les points de montage et montez les partages :
sudo mkdir -p /mnt/nfs-partage /mnt/nfs-projetssudo mount -t nfs4 192.168.122.50:/partage /mnt/nfs-partagesudo mount -t nfs4 192.168.122.50:/projets /mnt/nfs-projetsVérification — Confirmez le montage et la version négociée :
mount | grep nfs4192.168.122.50:/partage on /mnt/nfs-partage type nfs4 (rw,...,vers=4.2,...,proto=tcp,...)192.168.122.50:/projets on /mnt/nfs-projets type nfs4 (ro,...,vers=4.2,...,proto=tcp,...)Le résultat montre vers=4.2 : le client et le serveur ont automatiquement
négocié NFSv4.2, la version la plus récente.
Tester la lecture et l’écriture
Section intitulée « Tester la lecture et l’écriture »Créez un fichier depuis le serveur, puis vérifiez depuis le client :
# Sur le client — écrire sur le partage rwecho "Données partagées via NFS" | sudo tee /mnt/nfs-partage/test.txt
# Vérifier la lecturecat /mnt/nfs-partage/test.txtDonnées partagées via NFSTestez que le partage en lecture seule refuse bien l’écriture :
echo "test" | sudo tee /mnt/nfs-projets/interdit.txttee: /mnt/nfs-projets/interdit.txt: Read-only file systemLe partage projets est bien en lecture seule : le serveur refuse l’écriture
conformément à l’option ro configurée dans /etc/exports.
Montage automatique via /etc/fstab
Section intitulée « Montage automatique via /etc/fstab »Pour que les partages se montent automatiquement au démarrage, ajoutez-les
dans /etc/fstab :
192.168.122.50:/partage /mnt/nfs-partage nfs4 defaults,_netdev 0 0192.168.122.50:/projets /mnt/nfs-projets nfs4 defaults,ro,_netdev 0 0L’option _netdev indique au système d’attendre que le réseau soit disponible
avant de tenter le montage. Sans elle, le démarrage peut rester bloqué si le
serveur NFS n’est pas joignable.
Vérification — Testez le montage sans redémarrer :
sudo mount -adf -h | grep nfsOptions de montage utiles
Section intitulée « Options de montage utiles »| Option | Effet | Recommandation |
|---|---|---|
vers=4.2 | Force NFSv4.2 | Utile si le serveur supporte plusieurs versions |
hard | Retente indéfiniment en cas de coupure (défaut) | Production (pas de perte de données) |
soft | Abandonne après un délai | Scripts batch non critiques |
noatime | Ne met pas à jour la date de dernier accès | Performance (réduit les écritures) |
rsize=262144 | Taille des blocs de lecture (octets) | Augmenter si bande passante disponible |
wsize=262144 | Taille des blocs d’écriture (octets) | Idem |
nconnect=4 | Connexions TCP parallèles | Réseau rapide (10 Gbps+) |
_netdev | Attend le réseau pour monter | Obligatoire dans fstab |
Gestion des permissions : UID/GID et idmapd
Section intitulée « Gestion des permissions : UID/GID et idmapd »NFS utilise les UID et GID numériques pour les permissions. Si
l’utilisateur bob a l’UID 1000 sur le serveur et 1001 sur le client, les
fichiers apparaîtront avec le mauvais propriétaire.
Deux approches
Section intitulée « Deux approches »La méthode la plus simple : assurer que chaque utilisateur a le même UID et GID sur toutes les machines. C’est l’approche recommandée dans un petit environnement.
# Vérifier l'UID d'un utilisateurid bob# uid=1000(bob) gid=1000(bob) groups=1000(bob)Si les UID diffèrent, modifiez-les :
sudo usermod -u 1000 bobsudo groupmod -g 1000 bobsudo find / -user ANCIEN_UID -exec chown -h 1000 {} \;Pour les environnements plus grands, idmapd résout les noms d’utilisateurs
entre client et serveur. Configurez le même domaine sur toutes les machines
dans /etc/idmapd.conf :
[General]Domain = lab.local
[Mapping]Nobody-User = nobodyNobody-Group = nogroupRedémarrez le service :
sudo systemctl restart nfs-idmapdOptimiser les performances
Section intitulée « Optimiser les performances »Benchmark de référence
Section intitulée « Benchmark de référence »Mesurez les débits avant toute optimisation pour avoir une base de comparaison :
# Écriture (100 Mo, I/O direct)dd if=/dev/zero of=/mnt/nfs-partage/bench bs=1M count=100 oflag=direct
# Lecturedd if=/mnt/nfs-partage/bench of=/dev/null bs=1M iflag=directSur notre lab (réseau virtio, même hôte KVM), les résultats sont :
| Sens | Débit mesuré |
|---|---|
| Écriture | ~135 Mo/s |
| Lecture | ~2,7 Go/s |
Tuning du montage
Section intitulée « Tuning du montage »Pour de meilleurs débits, augmentez la taille des blocs et activez les connexions parallèles :
sudo mount -t nfs4 \ -o rsize=1048576,wsize=1048576,noatime,nconnect=4 \ 192.168.122.50:/partage /mnt/nfs-partageÉquivalent dans /etc/fstab :
192.168.122.50:/partage /mnt/nfs-partage nfs4 rsize=1048576,wsize=1048576,noatime,nconnect=4,_netdev 0 0Tuning système
Section intitulée « Tuning système »Augmentez les buffers réseau du noyau pour supporter les transferts volumineux :
net.core.rmem_default = 262144net.core.wmem_default = 262144net.core.rmem_max = 16777216net.core.wmem_max = 16777216sudo sysctl -p /etc/sysctl.d/99-nfs-perf.confSurveillance
Section intitulée « Surveillance »| Commande | Usage |
|---|---|
nfsstat -s | Statistiques NFS côté serveur (appels RPC) |
nfsstat -c | Statistiques NFS côté client |
mountstats | Détails par montage (latence, retransmissions) |
iostat -x 1 | Activité disque en temps réel |
# Voir les statistiques détaillées d'un montagemountstats /mnt/nfs-partageSécuriser NFS avec Kerberos
Section intitulée « Sécuriser NFS avec Kerberos »Par défaut, NFS fait confiance à l’adresse IP du client pour l’autorisation. C’est suffisant dans un réseau isolé, mais insuffisant en production. Kerberos ajoute une authentification forte et optionnellement le chiffrement des données en transit.
Les trois niveaux de sécurité
Section intitulée « Les trois niveaux de sécurité »| Niveau | Option | Authentification | Intégrité | Chiffrement | Impact performance |
|---|---|---|---|---|---|
| Basique | sec=krb5 | Oui | Non | Non | Faible |
| Intégrité | sec=krb5i | Oui | Oui | Non | Modéré |
| Complet | sec=krb5p | Oui | Oui | Oui | Significatif (~30–50 %) |
Prérequis Kerberos
Section intitulée « Prérequis Kerberos »- Un KDC (Key Distribution Center) — serveur d’authentification central (MIT Kerberos ou FreeIPA)
- Horloges synchronisées via NTP sur toutes les machines (tolérance ±5 min)
- DNS fonctionnel avec résolution directe et inverse (Kerberos utilise les FQDN)
Configuration côté serveur
Section intitulée « Configuration côté serveur »-
Installer les paquets Kerberos :
Fenêtre de terminal sudo apt install krb5-user nfs-kernel-server -
Créer un principal NFS dans le KDC :
Fenêtre de terminal kadmin -q "addprinc -randkey nfs/serveur.lab.local" -
Exporter la clé dans un keytab :
Fenêtre de terminal kadmin -q "ktadd -k /etc/krb5.keytab nfs/serveur.lab.local"sudo chmod 600 /etc/krb5.keytab -
Configurer l’export avec Kerberos :
/etc/exports /srv/nfs 192.168.122.0/24(rw,sync,fsid=0,crossmnt,sec=krb5p) -
Redémarrer le serveur :
Fenêtre de terminal sudo exportfs -rasudo systemctl restart nfs-server
Configuration côté client
Section intitulée « Configuration côté client »-
Installer les paquets :
Fenêtre de terminal sudo apt install krb5-user nfs-common -
Obtenir un ticket Kerberos :
Fenêtre de terminal kinit utilisateur@LAB.LOCALklist # vérifier le ticket -
Monter avec Kerberos :
Fenêtre de terminal sudo mount -t nfs4 -o sec=krb5p serveur.lab.local:/ /mnt/nfs
Vérification :
mount | grep nfs4 | grep sec=krb5pSi la ligne apparaît, le chiffrement Kerberos est actif.
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
mount bloqué ou timeout | Service NFS arrêté sur le serveur | sudo systemctl start nfs-server |
mount.nfs4: access denied | IP du client absente de /etc/exports | Vérifier le réseau dans /etc/exports et exportfs -ra |
Permission denied sur les fichiers | root_squash actif (root → nobody) | Utiliser no_root_squash ou travailler sans sudo |
Fichiers appartiennent à nobody | Domaine idmapd différent client/serveur | Synchroniser /etc/idmapd.conf (même Domain) |
| Montage en NFSv3 au lieu de v4 | Client négociant une version basse | Forcer mount -t nfs4 ou vers=4.2 dans fstab |
| Performances dégradées | Blocs trop petits (rsize/wsize) | Augmenter à 1048576 + activer nconnect=4 |
kinit échoue | Horloge désynchronisée (>5 min) vs KDC | Synchroniser avec NTP : sudo systemctl restart chronyd |
| Port 2049 filtré | Pare-feu bloque le trafic NFS | sudo ufw allow from 192.168.122.0/24 to any port 2049 |
Stale file handle | Export modifié sans exportfs -ra | sudo exportfs -ra puis re-monter côté client |
À retenir
Section intitulée « À retenir »- NFS permet de partager des répertoires entre machines Linux via le réseau, de façon transparente pour les applications
- NFSv4.2 est la version actuelle : un seul port (2049/tcp), négociation automatique, sécurité Kerberos native
- Le fichier
/etc/exportssur le serveur contrôle quoi est partagé, à qui et avec quelles permissions - L’option
fsid=0désigne la racine du pseudo-filesystem NFSv4 — les clients montent des chemins relatifs à cette racine - Utilisez
syncen production (fiabilité),root_squash(sécurité) et_netdevdans fstab (stabilité au boot) - Pour les performances, augmentez
rsize/wsizeà 1 Mo et activeznconnect=4sur les réseaux rapides - Kerberos (
sec=krb5p) est indispensable en production pour authentifier les clients et chiffrer le trafic