NFS : partage de fichiers Unix natif

NFS : partage de fichiers Unix natif

NFS (Network File System) est le protocole de partage de fichiers natif Unix. Plus rapide que Samba sur LAN Linux-only, ideal pour partager des homes, du stockage VM, ou des data partagees entre serveurs.

Introduction

NFS :

  • Protocole de partage Unix natif (depuis 1984)
  • Plus performant que SMB sur LAN Linux
  • Mount transparent : un partage NFS apparait comme un FS local
  • Versions : NFSv3 (UDP/TCP), NFSv4 (TCP only, plus securise et performant)
  • Authentification : Unix uid/gid (NFSv3), Kerberos optionnel (NFSv4)

Cas d'usage : NAS Linux, homes partages, stockage VM (Proxmox, KVM), data scientifique partagee.

⚠️ NFS sans Kerberos = securite par IP source uniquement. Jamais sur Internet.

Prerequis

  • Serveur Linux Debian / Ubuntu (le NFS server)
  • Clients Linux qui mountent
  • LAN dedie ou VPN
  • Acces root

Etape 1 : Installation cote serveur

sudo apt update
sudo apt install -y nfs-kernel-server
sudo systemctl status nfs-server

Etape 2 : Creer un dossier a partager

sudo mkdir -p /srv/nfs/partage
sudo chown nobody:nogroup /srv/nfs/partage
sudo chmod 755 /srv/nfs/partage

Pour un partage utilisable en write :

sudo chmod 775 /srv/nfs/partage

Etape 3 : Exporter le partage

/etc/exports :

/srv/nfs/partage   192.168.50.0/24(rw,sync,no_subtree_check,no_root_squash)
/srv/nfs/data      192.168.50.10(rw,sync,no_subtree_check) 192.168.50.11(rw,sync,no_subtree_check)
/srv/nfs/readonly  192.168.50.0/24(ro,sync,no_subtree_check,root_squash)

Options importantes :

  • rw / ro : read-write / read-only
  • sync : ecritures synchrones (sur sur le disque avant l'ack). Plus sur. async est plus rapide mais risque en cas de crash.
  • no_subtree_check : recommande, evite des checks couteux
  • root_squash (defaut) : le root du client devient nobody cote serveur (securite)
  • no_root_squash : le root client = root serveur (dangereux, juste pour les cas legitimes)
  • all_squash : tous les utilisateurs deviennent nobody

Etape 4 : Appliquer et demarrer

sudo exportfs -ra
sudo systemctl restart nfs-server
sudo systemctl enable nfs-server

Verifier les exports :

sudo exportfs -v

Etape 5 : Ouvrir le firewall

NFSv4 utilise uniquement le port 2049 :

sudo ufw allow from 192.168.50.0/24 to any port 2049

NFSv3 a besoin de plusieurs ports dynamiques (rpcbind 111, mountd, nlockmgr). C'est pourquoi NFSv4 est preferable.

Pour figer les ports NFSv3 :

sudo nano /etc/default/nfs-kernel-server
RPCMOUNTDOPTS="--port 32767"
STATDOPTS="--port 32765"

Etape 6 : Cote client - installation

sudo apt update
sudo apt install -y nfs-common

Etape 7 : Mount manuel

sudo mkdir -p /mnt/nfs-partage
sudo mount -t nfs4 192.168.50.10:/srv/nfs/partage /mnt/nfs-partage
df -h /mnt/nfs-partage

Vous pouvez maintenant lire/ecrire dans /mnt/nfs-partage.

Etape 8 : Mount automatique via fstab

/etc/fstab :

192.168.50.10:/srv/nfs/partage  /mnt/nfs-partage  nfs4  defaults,_netdev,soft,intr,timeo=600  0  0

Options client :

  • soft : si serveur down, ne bloque pas (echec apres timeout)
  • hard : bloque indefinitivement (defaut, parfois necessaire pour les VMs)
  • _netdev : attendre le reseau au boot
  • timeo=600 : timeout RPC en dixiemes de seconde
  • nofail : ne pas bloquer le boot si mount echoue
sudo mount -a

Etape 9 : Automount (autofs)

Pour mounter a la demande seulement :

sudo apt install -y autofs
sudo nano /etc/auto.master

Ajoutez :

/mnt/nfs    /etc/auto.nfs --timeout=60
sudo nano /etc/auto.nfs
partage    -fstype=nfs4,soft,intr    192.168.50.10:/srv/nfs/partage
data       -fstype=nfs4,soft,intr    192.168.50.10:/srv/nfs/data
sudo systemctl restart autofs
ls /mnt/nfs/partage    # mount automatique

Apres 60s sans acces, autofs unmounte.

Etape 10 : Performance tuning

Tailles de buffer

Sur le client :

sudo mount -t nfs4 server:/path /mnt/point -o rsize=1048576,wsize=1048576,nconnect=8
  • rsize / wsize : tailles de bloc read/write (1 Mo recommande)
  • nconnect=8 : 8 connexions TCP paralleles (NFSv4.1+, gros boost de perf)

Async write (risque mais rapide)

sudo mount -t nfs4 server:/path /mnt/point -o async

⚠️ En cas de crash serveur, des ecritures peuvent etre perdues. A reserver aux usages tolerants.

Test de perf

dd if=/dev/zero of=/mnt/nfs-partage/test.bin bs=1M count=1024 oflag=direct
dd if=/mnt/nfs-partage/test.bin of=/dev/null bs=1M

Sur Gigabit LAN, attendez 110 MB/s+. Sur 10 GbE, 800 MB/s+.

Etape 11 : NFSv4 avec Kerberos (sec)

Pour de l'auth forte, configurez Kerberos puis exportez avec sec=krb5p :

/srv/nfs/secure   *(rw,sync,sec=krb5p)

C'est complexe (nécessite un KDC), surtout utile en entreprise. Pour de petits LAN, restez en sec=sys avec IP whitelist.

Etape 12 : Monitoring

Cote serveur :

sudo nfsstat -s
sudo nfsstat -m         # mounts cote serveur
sudo showmount -e        # exports actifs
sudo showmount -a 192.168.50.10   # qui est connecte

Cote client :

nfsstat -c
mount | grep nfs

Logs :

sudo journalctl -u nfs-server -f
sudo dmesg | grep nfs

Depannage

"mount.nfs: Connection refused"

Le service n'est pas demarre ou port bloque :

sudo systemctl status nfs-server
sudo ss -tunlp | grep 2049
sudo ufw status

"Permission denied" lors de l'ecriture

Probleme de uid mapping. Le client et le serveur doivent avoir le meme uid pour l'utilisateur. Sinon, utilisez all_squash avec anonuid :

/srv/nfs/partage  *(rw,sync,no_subtree_check,all_squash,anonuid=1000,anongid=1000)

"Stale file handle"

Le fichier a ete supprime ou le serveur a redemarre. Remountez :

sudo umount -f /mnt/nfs-partage
sudo mount /mnt/nfs-partage

Performance lente

mount | grep nfs        # voir les options actives

Augmentez rsize / wsize et essayez nconnect.

Le serveur ne demarre pas

sudo exportfs -ra
sudo journalctl -u nfs-server

Verifiez /etc/exports (syntaxe sensible, espaces importants).

Commandes utiles

# Cote serveur
sudo systemctl status nfs-server
sudo systemctl restart nfs-server
sudo exportfs -v
sudo exportfs -ra        # reload sans restart
sudo nfsstat -s
sudo showmount -e        # voir tous les exports
sudo showmount -a        # voir tous les mounts actifs

# Cote client
sudo mount -t nfs4 server:/path /mnt/point
sudo umount /mnt/point
sudo umount -f /mnt/point      # force
mount | grep nfs
nfsstat -c
sudo rpcinfo -p server    # voir les services RPC distants

# Diagnostic
sudo journalctl -u nfs-server -f
sudo dmesg | grep nfs
ss -tunlp | grep 2049

Conclusion

NFS est le standard de partage de fichiers Linux/Unix :

  • Performance superieure a SMB sur LAN Linux
  • Mount transparent
  • Stable, mature, dans le kernel

Limites :

  • Securite par IP / uid (sauf Kerberos)
  • Pas adapte aux LANs publics ou Internet sans VPN
  • Performance dependante du reseau (latence importante)

Pour aller plus loin :

  • Pour multi-client write-intensive, considerez GlusterFS ou CephFS
  • Pour HA NFS, regardez DRBD + Pacemaker ou un NAS commercial
  • Pour cross-platform, Samba reste plus universel

Ressources

Join our Discord community server

For any questions, suggestions, or just to chat with the community, join us on Discord!

900+Members