Aller au contenu
medium

Utiliser NFS sur Linux

21 min de lecture

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.

  • Fonctionnement de NFS : protocole, versions, architecture client-serveur
  • Installation : nfs-kernel-server (serveur) et nfs-common (client)
  • Configuration des exports : /etc/exports, options rw, 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

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.

VersionAnnéeApports principaux
NFSv21989Première version publique, fichiers limités à 2 Go
NFSv31995Fichiers volumineux, écriture asynchrone, meilleur cache
NFSv42003Protocole à états, un seul port (2049/tcp), sécurité Kerberos native
NFSv4.12010Sessions, pNFS (parallel NFS) pour la performance
NFSv4.22016Copie côté serveur, sparse files, étiquetage sécurité

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)
CritèreNFSiSCSISamba (CIFS)SSHFS
ProtocoleFichiersBlocFichiersFichiers
Port2049/tcp3260/tcp445/tcp22/tcp
Clients natifsLinux, macOSLinux, WindowsWindows, LinuxLinux, macOS
PerformanceBonneExcellenteMoyenneFaible
ComplexitéFaibleModéréeFaibleTrès faible
Cas d'usagePartages LinuxDisques virtuelsPartages WindowsAccès ponctuel
  • 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 sudo sur 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).

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.

Fenêtre de terminal
sudo apt update
sudo apt install nfs-kernel-server

Le service démarre automatiquement. Vérifiez son état :

Fenêtre de terminal
sudo systemctl status nfs-server

Résultat attendu : Active: active (exited). Le statut exited est normal car le serveur NFS fonctionne via des threads noyau, pas un processus classique.

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.

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 :

Fenêtre de terminal
sudo mkdir -p /srv/nfs/partage /srv/nfs/projets
sudo chown nobody:nogroup /srv/nfs/partage /srv/nfs/projets

Éditez le fichier /etc/exports pour déclarer vos partages :

Fenêtre de terminal
sudo nano /etc/exports
/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)
OptionSignificationQuand l'utiliser
rwLecture et écriture autoriséesPartages collaboratifs
roLecture seuleDistributions de configs, documentation
syncÉcrit sur disque avant de répondre au clientToujours en production (fiabilité)
asyncRépond avant l'écriture sur disqueTests de performance uniquement (risque de perte)
fsid=0Désigne la racine du pseudo-filesystem NFSv4Une seule ligne avec cette option
crossmntTraverse les sous-montages automatiquementSur la racine d'export
no_subtree_checkDésactive la vérification de sous-arbreRecommandé (performances + stabilité)
no_root_squashLe root du client reste root sur le serveurDéploiement automatisé, Ansible
root_squashLe root du client devient nobody (défaut)Production (sécurité)
all_squashTous les utilisateurs deviennent nobodyPartages publics en lecture seule
anonuid=N / anongid=NUID/GID utilisé pour les utilisateurs « squashés »Contrôler les permissions du nobody

Après toute modification de /etc/exports, appliquez les changements :

Fenêtre de terminal
sudo exportfs -ra

Vérification, Affichez les exports actifs avec leurs options :

Fenêtre de terminal
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,...)
Fenêtre de terminal
sudo apt update
sudo apt install nfs-common

Créez les points de montage et montez les partages :

Fenêtre de terminal
sudo mkdir -p /mnt/nfs-partage /mnt/nfs-projets
sudo mount -t nfs4 192.168.122.50:/partage /mnt/nfs-partage
sudo mount -t nfs4 192.168.122.50:/projets /mnt/nfs-projets

Vérification, Confirmez le montage et la version négociée :

Fenêtre de terminal
mount | grep nfs4
192.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.

Créez un fichier depuis le serveur, puis vérifiez depuis le client :

Fenêtre de terminal
# Sur le client : écrire sur le partage rw
echo "Données partagées via NFS" | sudo tee /mnt/nfs-partage/test.txt
# Vérifier la lecture
cat /mnt/nfs-partage/test.txt
Données partagées via NFS

Testez que le partage en lecture seule refuse bien l'écriture :

Fenêtre de terminal
echo "test" | sudo tee /mnt/nfs-projets/interdit.txt
tee: /mnt/nfs-projets/interdit.txt: Read-only file system

Le partage projets est bien en lecture seule : le serveur refuse l'écriture conformément à l'option ro configurée dans /etc/exports.

Pour que les partages se montent automatiquement au démarrage, ajoutez-les dans /etc/fstab :

/etc/fstab
192.168.122.50:/partage /mnt/nfs-partage nfs4 defaults,_netdev 0 0
192.168.122.50:/projets /mnt/nfs-projets nfs4 defaults,ro,_netdev 0 0

L'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 :

Fenêtre de terminal
sudo mount -a
df -h | grep nfs
OptionEffetRecommandation
vers=4.2Force NFSv4.2Utile si le serveur supporte plusieurs versions
hardRetente indéfiniment en cas de coupure (défaut)Production (pas de perte de données)
softAbandonne après un délaiScripts batch non critiques
noatimeNe met pas à jour la date de dernier accèsPerformance (réduit les écritures)
rsize=262144Taille des blocs de lecture (octets)Augmenter si bande passante disponible
wsize=262144Taille des blocs d'écriture (octets)Idem
nconnect=4Connexions TCP parallèlesRéseau rapide (10 Gbps+)
_netdevAttend le réseau pour monterObligatoire dans fstab

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.

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.

Fenêtre de terminal
# Vérifier l'UID d'un utilisateur
id bob
# uid=1000(bob) gid=1000(bob) groups=1000(bob)

Si les UID diffèrent, modifiez-les :

Fenêtre de terminal
sudo usermod -u 1000 bob
sudo groupmod -g 1000 bob
sudo find / -user ANCIEN_UID -exec chown -h 1000 {} \;

Mesurez les débits avant toute optimisation pour avoir une base de comparaison :

Fenêtre de terminal
# Écriture (100 Mo, I/O direct)
dd if=/dev/zero of=/mnt/nfs-partage/bench bs=1M count=100 oflag=direct
# Lecture
dd if=/mnt/nfs-partage/bench of=/dev/null bs=1M iflag=direct

Sur notre lab (réseau virtio, même hôte KVM), les résultats sont :

SensDébit mesuré
Écriture~135 Mo/s
Lecture~2,7 Go/s

Pour de meilleurs débits, augmentez la taille des blocs et activez les connexions parallèles :

Fenêtre de terminal
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 0

Augmentez les buffers réseau du noyau pour supporter les transferts volumineux :

/etc/sysctl.d/99-nfs-perf.conf
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
Fenêtre de terminal
sudo sysctl -p /etc/sysctl.d/99-nfs-perf.conf
CommandeUsage
nfsstat -sStatistiques NFS côté serveur (appels RPC)
nfsstat -cStatistiques NFS côté client
mountstatsDétails par montage (latence, retransmissions)
iostat -x 1Activité disque en temps réel
Fenêtre de terminal
# Voir les statistiques détaillées d'un montage
mountstats /mnt/nfs-partage

Par défaut, NFS utilise le mode sec=sys (AUTH_SYS), que man nfs résume sans détour : aucune sécurité cryptographique. L'autorisation repose sur deux éléments faibles : l'adresse IP déclarée dans /etc/exports et l'UID que le client s'attribue lui-même à chaque requête. Le serveur fait confiance à cet UID sans le vérifier : un attaquant disposant des droits root sur une machine du réseau peut forger n'importe quel UID et lire les fichiers correspondants. Même root_squash ne protège que l'UID 0, pas les autres.

Conséquence concrète : sans Kerberos, NFS n'est sûr que sur un réseau de confiance et isolé (VLAN dédié, pare-feu strict). Pour tout réseau partagé ou exposé, Kerberos ajoute une authentification forte et, en option, le chiffrement des données en transit.

NiveauOptionAuthentificationIntégritéChiffrementImpact performance
Basiquesec=krb5OuiNonNonFaible
Intégritésec=krb5iOuiOuiNonModéré
Completsec=krb5pOuiOuiOuiSignificatif (~30–50 %)
  • 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)
  1. Installer les paquets Kerberos :

    Fenêtre de terminal
    sudo apt install krb5-user nfs-kernel-server
  2. Créer un principal NFS dans le KDC :

    Fenêtre de terminal
    kadmin -q "addprinc -randkey nfs/serveur.lab.local"
  3. 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
  4. Configurer l'export avec Kerberos :

    /etc/exports
    /srv/nfs 192.168.122.0/24(rw,sync,fsid=0,crossmnt,sec=krb5p)
  5. Redémarrer le serveur :

    Fenêtre de terminal
    sudo exportfs -ra
    sudo systemctl restart nfs-server
  1. Installer les paquets :

    Fenêtre de terminal
    sudo apt install krb5-user nfs-common
  2. Obtenir un ticket Kerberos :

    Fenêtre de terminal
    kinit utilisateur@LAB.LOCAL
    klist # vérifier le ticket
  3. Monter avec Kerberos :

    Fenêtre de terminal
    sudo mount -t nfs4 -o sec=krb5p serveur.lab.local:/ /mnt/nfs

Vérification :

Fenêtre de terminal
mount | grep nfs4 | grep sec=krb5p

Si la ligne apparaît, le chiffrement Kerberos est actif.

NFS occupe une place particulière dans Kubernetes : il fournit le mode d'accès ReadWriteMany (RWX), où plusieurs nœuds montent le même volume en lecture-écriture. Peu de backends l'offrent (la plupart des disques bloc sont limités à un seul nœud), ce qui fait de NFS une solution simple pour partager des données entre pods.

Deux intégrations existent. Le csi-driver-nfs (nfs.csi.k8s.io, version 4.13.x en 2026) est l'approche moderne et recommandée : provisioning dynamique, snapshots et clonage à partir d'un serveur NFS existant. L'ancien nfs-subdir-external-provisioner (figé depuis début 2023) reste répandu mais n'est plus guère maintenu ; il crée un sous-répertoire par volume.

Deux pièges reviennent en cluster. Les permissions : si l'export est en root_squash, les conteneurs tournant en root et les chown récursifs déclenchés par fsGroup se heurtent à la projection vers l'utilisateur anonyme ; il faut cadrer les UID des conteneurs ou ajuster anonuid. Et le point de défaillance : un serveur NFS unique devient un SPOF pour tous les volumes RWX qui en dépendent.

SymptômeCause probableSolution
mount bloqué ou timeoutService NFS arrêté sur le serveursudo systemctl start nfs-server
mount.nfs4: access deniedIP du client absente de /etc/exportsVérifier le réseau dans /etc/exports et exportfs -ra
Permission denied sur les fichiersroot_squash actif (root → nobody)Utiliser no_root_squash ou travailler sans sudo
Fichiers appartiennent à nobodyDomaine idmapd différent client/serveurSynchroniser /etc/idmapd.conf (même Domain)
Montage en NFSv3 au lieu de v4Client négociant une version basseForcer mount -t nfs4 ou vers=4.2 dans fstab
Performances dégradéesBlocs trop petits (rsize/wsize)Augmenter à 1048576 + activer nconnect=4
kinit échoueHorloge désynchronisée (>5 min) vs KDCSynchroniser avec NTP : sudo systemctl restart chronyd
Port 2049 filtréPare-feu bloque le trafic NFSsudo ufw allow from 192.168.122.0/24 to any port 2049
Stale file handleExport modifié sans exportfs -rasudo exportfs -ra puis re-monter côté client

NFS est simple et efficace, mais il a des limites qu'il vaut mieux connaître avant de l'imposer partout.

  • Un serveur unique est un SPOF. Tous les clients en dépendent. La haute disponibilité NFS (Pacemaker + DRBD) est possible mais complexe à opérer ; si la résilience est critique, un stockage distribué par conception comme CephFS est plus adapté.
  • Les millions de petits fichiers font souffrir NFS : chaque opération de métadonnées synchrone paie un aller-retour réseau. Un système de fichiers distribué ou un stockage objet sont alors préférables.
  • Les bases de données s'accommodent mal du verrouillage réseau et des garanties de cohérence de NFS : pour un SGBD, préférez un stockage bloc (iSCSI ou disque local).

Le bon réflexe : NFS pour du partage de fichiers entre machines de confiance, un outil dédié dès que la résilience, la latence sur petits fichiers ou une base de données entrent en jeu.

  • 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/exports sur le serveur contrôle quoi est partagé, à qui et avec quelles permissions
  • L'option fsid=0 désigne la racine du pseudo-filesystem NFSv4, les clients montent des chemins relatifs à cette racine
  • Utilisez sync en production (fiabilité), root_squash (sécurité) et _netdev dans fstab (stabilité au boot)
  • Pour les performances, augmentez rsize/wsize à 1 Mo et activez nconnect=4 sur les réseaux rapides
  • Le mode par défaut sec=sys ne vérifie pas les UID : sans Kerberos (sec=krb5p), NFS n'est sûr que sur un réseau isolé et de confiance
  • Conservez hard (le défaut) ; soft peut corrompre des données silencieusement si le serveur tombe
  • NFS brille en RWX comme backend Kubernetes, mais reste un SPOF : pour la résilience ou une base de données, regardez CephFS ou un stockage bloc

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn