Fondamentaux du NFS
Le Network File System (NFS) est un protocole de partage de fichiers en réseau fonctionnant sur la couche TCP/IP. Il permet de dissocier le stockage du traitement applicatif, renforçant ainsi la sécurité et la centralisation des données. Contrairement à de nombreux services, NFS ne possède pas de port fixe : il s'appuie sur le service RPC (rpcbind) pour négocier dynamiquement les ports d'écoute.
Deux services sont impliqués :
rpcbind: agit comme un annuaire, mettant en relation le client et le serveur NFS.nfs-server: orchestre l'ensemble des processus nécessaires au partage de fichiers.
Sur les distributions modernes, l'installation du paquet nfs-utils entraîne automatiquement celle de rpcbind en tant que dépendance.
Mécanisme de communication
- Le démon NFS côté serveur s'enregist auprès de
rpcbindlocal en lui communiquant ses ports. - Le client émet une requête vers son propre service
rpcbindpour initier la connexion. - Le
rpcbindclient interroge lerpcbindserveur pour récupérer les ports NFS enregistrés. - Le serveur RPC répond au client avec les informations de port.
- Le client établit alors directement la communication avec le service NFS et monte le répertoire distant.
Note : rpcbind doit toujours être actif avant nfs-server. Les versions récentes des distributions gèrent cet ordre automatiquement.
Paramètres clés du fichier /etc/exports
| Option | Description |
|---|---|
ro |
Accès en lecture seule |
rw |
Accès en lecture/écriture (soumis aux permissions du système de fichiers) |
root_squash |
Le root client est converti en utilisateur anonyme (no body) côté serveur |
no_root_squash |
Le root client conserve ses privilèges (à éviter, risqué) |
all_squash |
Tous les utilisateurs clients sont mappés vers un compte anonyme (recommandé) |
no_all_squash |
Les identifiants des utilisateurs ordinaires sont conservés tels quels |
anonuid / anongid |
Force le mappage vers un UID/GID précis (défaut : 65534/nobody) |
sync |
Écriture synchrone en mémoire et sur disque (recommandé) |
async |
Écriture asynchrone, plus rapide mais risquée en cas de crash |
Mise en pratique : partage d'un répertoire
Côté serveur
Création du dossier destiné au partage :
[root@SRV01 ~]# mkdir -p /srv/nfs_partage
Définition de la politique de partage dans /etc/exports :
[root@SRV01 ~]# cat > /etc/exports << 'EOF'
/srv/nfs_partage 192.168.126.0/24(rw,all_squash,sync,anonuid=2000,anongid=2000)
EOF
Ici, tous les accès clients seront mappés vers l'UID 2000 et le GID 2000. Assurons-nous que le répertoire autorise l'écriture pour ce propriétaire :
[root@SRV01 ~]# groupadd -g 2000 nfsgrp
[root@SRV01 ~]# useradd -u 2000 -g 2000 -s /sbin/nologin nfsuser
[root@SRV01 ~]# chown -R nfsuser:nfsgrp /srv/nfs_partage
[root@SRV01 ~]# chmod 755 /srv/nfs_partage
Application de la configuration et démarrage du service :
[root@SRV01 ~]# exportfs -rav
exporting 192.168.126.0/24:/srv/nfs_partage
[root@SRV01 ~]# systemctl enable --now nfs-server.service
Côté client
Vérification des ressources disponibles sur le serveur :
[root@CLI01 ~]# showmount -e 192.168.126.100
Export list for 192.168.126.100:
/srv/nfs_partage 192.168.126.0/24
Création du point de montage et cnonexion :
[root@CLI01 ~]# mkdir -p /mnt/nfs_distant
[root@CLI01 ~]# mount -t nfs4 192.168.126.100:/srv/nfs_partage /mnt/nfs_distant
[root@CLI01 ~]# df -h /mnt/nfs_distant
Filesystem Size Used Avail Use% Mounted on
192.168.126.100:/srv/nfs_partage 95G 2.8G 93G 3% /mnt/nfs_distant
Test d'écriture dans le partage :
[root@CLI01 ~]# echo "test" > /mnt/nfs_distant/fichier_test.txt
[root@CLI01 ~]# ls -l /mnt/nfs_distant/fichier_test.txt
-rw-r--r-- 1 2000 2000 5 Nov 1 20:00 /mnt/nfs_distant/fichier_test.txt
Côté serveur, le fichier appartient bien à nfsuser :
[root@SRV01 ~]# ls -l /srv/nfs_partage/fichier_test.txt
-rw-r--r-- 1 nfsuser nfsgrp 5 Nov 1 20:00 /srv/nfs_partage/fichier_test.txt
Persistance au démarrage via /etc/fstab
Pour que le montage soit effectué automatiquement à chaque boot, on peut ajouter une entrée dans /etc/fstab :
[root@CLI01 ~]# echo "192.168.126.100:/srv/nfs_partage /mnt/nfs_distant nfs4 defaults,_netdev 0 0" >> /etc/fstab
Cette approche présente un risque : si le serveur NFS est injoignable au boot, le client peut se bloquer. Une alternative consiste à utiliser un script de démarrage :
[root@CLI01 ~]# echo "mount -t nfs4 192.168.126.100:/srv/nfs_partage /mnt/nfs_distant" >> /etc/rc.d/rc.local
[root@CLI01 ~]# chmod +x /etc/rc.d/rc.local
Montage dynamique avec autofs
L'outil autofs permet de monter les partages NFS à la demande, c'est-à-dire uniquement lorsque l'on accède au point de montage. Après un délai d'inactivité configurable, le montage est automatiquement libéré.
Installation et démarrage :
[root@CLI01 ~]# yum install -y autofs
[root@CLI01 ~]# systemctl enable --now autofs
Ajustement du délai avant démontage automatique (exprimé en secondes) :
[root@CLI01 ~]# sed -i 's/^timeout.*/timeout = 10/' /etc/autofs.conf
Montage par découverte automatique
Le fichier /etc/auto.master définit les points de montage racine gérés par autofs :
[root@CLI01 ~]# cat >> /etc/auto.master << 'EOF'
/net -hosts
EOF
[root@CLI01 ~]# systemctl restart autofs
On peut alors parcourir directement le partage en accédant au répertoire du serveur :
[root@CLI01 ~]# cd /net/192.168.126.100/srv/nfs_partage
[root@CLI01 nfs_partage]# ls
fichier_test.txt
[root@CLI01 ~]# mount | grep autofs
-hosts on /net/192.168.126.100/srv/nfs_partage type autofs (rw,relatime,fd=13,pgrp=2300,timeout=10,minproto=5,maxproto=5,offset,pipe_ino=45023)
Après 10 secondes sans accès, le montage disparaît de la liste des systèmes de fichiers actifs.
Montage ciblé avec sous-configuration
Pour un point de montage personnalisé, on crée une entrée dédiée dans /etc/auto.master ainsi qu'un fichier de map séparé :
[root@CLI01 ~]# cat >> /etc/auto.master << 'EOF'
/mnt/nfs_on_demand /etc/auto.nfs_custom
EOF
[root@CLI01 ~]# cat > /etc/auto.nfs_custom << 'EOF'
partage_srv -fstype=nfs4 192.168.126.100:/srv/nfs_partage
EOF
[root@CLI01 ~]# systemctl restart autofs
L'accès au sous-répertoire déclenche le montage :
[root@CLI01 ~]# cd /mnt/nfs_on_demand/partage_srv
[root@CLI01 partage_srv]# df -h .
Filesystem Size Used Avail Use% Mounted on
192.168.126.100:/srv/nfs_partage 95G 2.8G 93G 3% /mnt/nfs_on_demand/partage_srv
Après fermeture du répertoire et expiration du délai, le montage est libéré automatiquement :
[root@CLI01 ~]# cd ~
[root@CLI01 ~]# sleep 12 && df -h /mnt/nfs_on_demand/partage_srv
df: /mnt/nfs_on_demand/partage_srv: No such file or directory