Un, Qu'est-ce que NFS et son fonctionnement
La fonction principale de NFS (Network File System) est de permettre le partage de fichiers et de répertoires entre différents systèmes via un réseau. Un serveur NFS autorise les clients à monter des répertoires partagés distants sur leur propre système. Pour le client, le répertoire distant apparaît comme une partition locale. Bien que le point de montage local puisse avoir n'importe quel nom, il est préférable de le conserver identique à celui du serveur pour faciliter la gestion.
NFS est couramment utilisé pour stocker des données statiques telles que des vidéos et des images.
Le transfert de données entre le serveur et le client se fait via le réseau. Pour ce faire, des ports réseau spécifiques sont nécessaires. Le serveur NFS sélectionne aléatoirement les ports pour le transfert de données. Comment le client peut-il alors connaître ces ports ? C'est grâce au protocole d'appel de procédure distatne (RPC). Le service RPC gère l'allocation des ports pour NFS. Le client communique d'abord avec le RPC serveur pour obtenir les ports nécessaires, puis établit une connexion pour le transfert de données.
Conseil : Avant de démarrer le serveur NFS, il faut impérativement démarrer le service RPC, sinon le serveur NFS ne pourra pas s'enregistrer. De plus, si le service RPC est redémarré, toutes les informations de ports enregistrées seront perdues, nécessitant un redémarrage du service NFS pour réenregistrement. Notez que modfiier le fichier de configuration de NFS ne nécessite généralement pas de redémarrage complet ; la commande /etc/init.d/nfs reload ou exportfs –rv suffit pour appliquer les modifications de /etc/exports.
« Processus de communication entre client et serveur NFS »
- Le serveur démarre d'abord le service RPC et ouvre le port 111
- Le serveur démarre le service NFS et enregistre ses ports auprès du RPC
- Le client démarre son RPC et demande au RPC serveur les ports NFS
- Le RPC serveur renvoie les informations de ports au client
- Le client utilise ces ports pour établir une connexion avec le serveur NFS et transférer les données
Deux, Déploiement de NFS
1, Vérification des paramètres système et version du serveur
[root@serveur ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[root@serveur ~]# uname -r
3.10.0-327.el7.x86_64
[root@serveur ~]#
2, Deux méthodes pour installer les logiciels du service NFS
1) [root@cloud ~]# yum groupinstall "Serveur de fichiers NFS" -y
2) yum install -y nfs-utils rpcbind
3, Démarrage du service NFS (côté serveur)
1) Activation du service RPC
[root@cloud ~]# systemctl start rpcbind
Starting rpcbind: [ OK ]
2) Vérification des services intermédiaires actifs
[root@cloud ~]# rpcinfo -p 127.0.0.1
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
3) Démarrage du service NFS
[root@cloud ~]# systemctl start nfs
Starting NFS services: [ OK ]
Starting NFS mountd: rpc.mountd: svc_tli_create: could not open connection for udp6
rpc.mountd: svc_tli_create: could not open connection for tcp6
rpc.mountd: svc_tli_create: could not open connection for udp6
rpc.mountd: svc_tli_create: could not open connection for tcp6
[ OK ]
Starting NFS daemon: rpc.nfsd: address family inet6 not supported by protocol TCP
[ OK ]
Starting RPC idmapd: [ OK ]
4) Vérification des services après le démarrage de NFS
[root@cloud ~]# rpcinfo -p 127.0.0.1
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100005 1 udp 46787 mountd
100005 1 tcp 48141 mountd
100005 2 udp 51029 mountd
100005 2 tcp 34046 mountd
100005 3 udp 54267 mountd
100005 3 tcp 33692 mountd
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049 nfs_acl
100227 3 tcp 2049 nfs_acl
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049 nfs_acl
100227 3 udp 2049 nfs_acl
100021 1 udp 49372 nlockmgr
100021 3 udp 49372 nlockmgr
100021 4 udp 49372 nlockmgr
100021 1 tcp 33433 nlockmgr
100021 3 tcp 33433 nlockmgr
100021 4 tcp 33433 nlockmgr
[root@cloud ~]#
5) Activation au démarrage
[root@cloud ~]# systemctl enable rpcbind
[root@cloud ~]# systemctl enable nfs
4, Le client n'a besoin que du service RPC
[root@client ~]# systemctl start rpcbind
[root@client ~]# systemctl status rpcbind
rpcbind (pid 18859) is running...
[root@client ~]# systemctl enable rpcbind
5, Fichier de configuration NFS sur le serveur
1) [root@cloud ~]# cat /etc/exports
##Test pour RPC et NFS
/ressources 192.168.222.0/24(rw,sync) Si ro, lecture seule
Cela signifie partager le répertoire /ressources, accessible uniquement aux hôtes du réseau 192.168.222.0/24, avec droits en lecture/écriture, et synchronisation des tampons avec le disque
2) Redémarrage en douceur
systemctl reload nfs
Si une ressource est en cours d'utilisation, elle reste accessible ; sinon, elle devient indisponible
3) Vérification des partages (côté serveur)
showmount -e localhost
(Serveur NFS)
[root@cloud ~]# showmount -e 127.0.0.1
Export list for 127.0.0.1:
/ressources 10.0.0.0/24
(Client)
showmount -e adresse_IP_du_serveur
[root@client ~]# showmount -e 192.168.222.140
Export list for 192.168.222.140:
/ressources 192.168.222.0/24
6, Montage du répertoire partagé sur le client. /ressources est le répertoire partagé, /mnt est le point de montage local. Ce montage est temporaire et sera perdu au redémarrage. Pour un montage permanent, ajouter dans /etc/fstab ou dans rc.local
[root@client ~]# mount -t nfs 192.168.222.140:/ressources /mnt
[root@client ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_client-lv_root
18G 5.1G 12G 31% /
tmpfs 932M 80K 932M 1% /dev/shm
/dev/sda1 477M 43M 410M 10% /boot
/dev/sr0 1.9G 1.9G 0 100% /media/CentOS-6.7-x86_64-LiveDVD
192.168.222.140:/ressources
17G 2.4G 14G 16% /mnt
[root@client ~]#
[root@client ~]# cd /mnt
[root@client mnt]# ls
fichier.txt
[root@client mnt]# cat fichier.txt
contenu du fichier de test
[root@client mnt]#
###Montage, deux méthodes
/etc/fstab
192.168.222.140:/ressources /mnt ext4 defaults 0 0
/etc/rc.local
mount -t nfs 192.168.222.140:/ressources /mnt
a, Dans /etc/rc.local
Inconvénient : Parfois le montage au démarrage échoue. En production, il est recommandé de configurer le montage au démarrage ET de surveiller le point de montage.
b, Dans /etc/fstab
Inconvénient : Évitez de placer les systèmes de fichiers réseau NFS dans fstab.
- fstab est prioritaire au démarrage réseau. À ce moment, le serveur NFS n'est pas encore accessible.
- Même pour les systèmes de fichiers locaux, faites attention aux deux dernières colonnes de fstab qui doivent être 0 0, sinon cela peut empêcher le démarrage du serveur.
7, La lecture fonctionne, mais l'écriture pose problème
[root@client mnt]# touch nouveau_fichier.txt
touch: cannot touch `nouveau_fichier.txt': Permission denied
[root@client mnt]#
Vérifions les permissions du répertoire partagé sur le serveur. L'utilisateur actuel est nfsnobody
[root@serveur /]# ls -l ressources
total 4
-rw-r--r--. 1 root root 17 Aug 14 07:00 fichier.txt
[root@serveur /]# chmod -R 777 ressources Ça fonctionne maintenant
Vérification des autres utilisateurs
[root@serveur ~]# cat /var/lib/nfs/etab
/ressources 192.168.222.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
Exemple de cas :
Implémenter un scénario où plusieurs clients montent un serveur NFS et où, quel que soit le client qui écrit des données, tous les autres clients peuvent lire et écrire, avec tous les fichiers écrits sur le serveur NFS appartenant au même utilisateur et groupe "utilisateur_partage".
Voici un résumé du processus, similaire à une optimisation :
- Créer sur le serveur et les clients l'utilisateur "utilisateur_partage" avec le même UID et GID sur tous les systèmes :
[root@serveur ~]# id utilisateur_partage
uid=555(utilisateur_partage) gid=555(utilisateur_partage) groups=555(utilisateur_partage)
[root@serveur ~]#
[root@client ~]# id utilisateur_partage
uid=555(utilisateur_partage) gid=555(utilisateur_partage) groups=555(utilisateur_partage)
[root@client ~]#
- Configuration du fichier exports :
[root@serveur ~]# vim /etc/exports
##Test pour RPC et NFS
##/ressources 192.168.222.0/24(rw,sync)
/ressources 192.168.222.0/24(rw,sync,all_squash,anonuid=555,anongid=555) Compresser tous les utilisateurs en utilisateur_partage
Astuces importantes pour la configuraton NFS en production
- Assurer que tous les serveurs ont les mêmes permissions sur le répertoire partagé NFS a) all_squash : Compresser tous les clients en utilisateur anonyme. b) L'utilisateur spécifié par anonuid et anongid.
- Tous les clients et serveurs doivent avoir le même utilisateur avec le même UID et GID, comme nfsnobody (l'UID doit être identique)
- Appliquer les modifications :
[root@serveur ~]# systemctl reload nfs
[root@serveur ~]# cat /var/lib/nfs/etab
/ressources 192.168.222.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=555,anongid=555,sec=sys,rw,secure,root_squash,all_squash)
- Définir l'utilisateur et le groupe du répertoire /ressources :
[root@serveur /]# chown -R utilisateur_partage.utilisateur_partage ressources
umount -lf /mnt,,, Pour démonter alors que le répertoire est en cours d'utilisation
===============================================Optimisation des paramètres de montage, haut débit, blocs de lecture/écriture.
Paramètres de sécurité couramment utilisés côté client : nosuid,noexec,nodev,rw
mount -t nfs -o nosuid,noexec,nodev,rw ********:/ressources /mnt
Paramètres d'optimisation côté serveur les plus courants : sync
Optimisation côté client : noatime.nodiratime (pour les environnements à haut débit)
[root@client ~]# cat /proc/mounts ……
192.168.222.140:/ressources/ /mnt nfs4 (Plus récente version du protocole, meilleure performance)rw,relatime,vers=4,rsize=262144,wsize=262144(actuellement très performant),namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.222.138,minorversion=0,local_lock=none,addr=192.168.222.140 0 0
noatime:
Lorsqu'un fichier est créé, modifié ou accédé, le système Linux enregistre ces informations temporelles. Lorsque les opérations de lecture de fichiers sont fréquentes, l'enregistrement du dernier accès au fichier représente une charge non négligeable. Pour améliorer les performances, nous pouvons éviter de mettre à jour l'attribut atime lors de la lecture des fichiers. L'option noatime lors du montage du système de fichiers empêche la mise à jour de l'information d'accès au fichier. Lorsqu'un système de fichiers est monté avec l'option noatime, la lecture des fichiers ne modifie pas l'attribut atime. L'importance de cette option est d'éliminer les opérations d'écriture sur le système de fichiers lors des lectures. Comme les opérations d'écriture sont plus consommatrices de ressources que les lectures, ce paramètre peut améliorer significativement les performances du serveur.
nodiratime:
Ne pas mettre à jour les temps d'accès aux inodes des répertoires sur ce système de fichiers.
Optimisations NFS officielles, modification suggérée, optimisation du noyau
[root@serveur ~]# cat /proc/sys/net/core/rmem_default //Valeur par défaut de la taille du tampon de réception (octets)
212992
[root@serveur ~]# cat /proc/sys/net/core/rmem_max //Valeur maximale de la taille du tampon de réception (octets)
212992
Augmentation des valeurs
echo 262144 >/proc/sys/net/core/rmem_default
[root@serveur ~]# cat /proc/sys/net/core/wmem_default //Tampon d'envoi
212992
[root@serveur ~]# cat /proc/sys/net/core/wmem_max
212992
Modification du répertoire partagé via la ligne de commande
exportfs -o rw,sync,all_squash,anonuid=555,anongid=555 192.168.222.0/24:/ressources
[root@serveur ~]# cd /var/lib/nfs/
[root@serveur nfs]# ls
etab export-lock nfsdcltrack rmtab rpc_pipefs statd state v4recovery xtab
[root@serveur nfs]# cat etab //Vérification des paramètres par défaut
/ressources 192.168.222.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=555,anongid=555,sec=sys,rw,secure,root_squash,all_squash)
[root@serveur ~]# cat /etc/exports //Paramètres de configuration
##Test pour RPC et NFS
##/ressources 192.168.222.0/24(rw,sync)
/ressources 192.168.222.0/24(rw,sync,all_squash,anonuid=555,anongid=555)
mount -a Vérifie si les montages sont corrects
[root@serveur ~]# cat /proc/mounts //Affiche les paramètres de montage détaillés (systèmes de fichiers), y compris les éléments de montage non affichés importants. Par exemple : /dev/pts