Aller au contenu
medium

NFS : partager des fichiers entre serveurs Linux

17 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 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.

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.

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 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
  • Kerberos (sec=krb5p) est indispensable en production pour authentifier les clients et chiffrer le trafic

Ce site vous est utile ?

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

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn