need_for_speed_example

Oui, c'est vrai, NFS c'est aussi le nom d'un jeu vidéo d'aventures et de réflexion, avec de très jolies carrosseries.. Et des voitures aussi..
Mais ce n'est pas le sujet ici..



Pour rappel, la partie précédente traite des points de montage sur une Linux en utilisant des partages réseau Samba ou Windows (environnement mixte donc).
Cette section décrit le même type d'utilisation mais via NFS (Serveur Linux / Client Linux) avec également quelques détails sur les exports côté serveur.


Network File System (ou NFS) est à l'origine un système de fichiers en réseau développé en 1984 par Sun Micro-Systems.

Par opposition aux partages réseau habituellement rencontrés (sous Windows ou via Samba), les droits d'accès se gèrent au niveau machine, pas utilisateur.
Un serveur NFS partage donc certains dossiers à destination d'un ou plusieurs postes définis ou de tout un réseau, indépendamment de la personne ou du profil ouvert sur le (ou les) client(s).

Sur les configurations les plus pointues, une gestion des utilisateurs (au sens Linux/Unix) peut-être ajoutée, comme pour tout dossier ou fichier, mais ce n'est pas l'objet de ce tuto.

Les versions 1, 2 et 3 de NFS sont décrites comme étant "sans état" (stateless) et ne permettent pas la reprise d'un fichier en cours de modif en cas de coupure réseau ou machine.
NFS V4 vient corriger la donne avec une ré-écriture complète et bien entendu offre la fameuse reprise sur incident, annoncée tant depuis le client que du côté serveur.


Note 1 : Le protocole NFS n'est pas (re)connu pour ses performances (vitesse). Avant mise en prod, effectuez des tests avec les outils habituels mais aussi en transférant des dossiers contenant une multitude de petits fichiers, c'est la situation la plus pénalisante pour NFS. Si vous ne trouvez pas votre bonheur et que vous êtes à la recherche de montages plus rapides, privilégiez Samba ou SSHFS.

Note 2 : Gardez à l'esprit que le choix entre NFS V3 (ou inférieur) et NFS V4 se fait sur le poste client. Toutefois, certaines options d'export (configuration sur le serveur donc) fonctionnant avec NFS V3 ne marcheront pas avec V4 et inversement. Si vous utilisez d'autres options que celles décrites dans ces lignes, vérifiez au préalable leur compatibilité avec votre modèle NFS.

Note 3 : Le protocole NFS, tout du moins jusqu'à sa version 4, est considéré comme peu sécurisé du fait qu'il s'appuie sur l'ip du client pour les autorisations (de base, hors options particulières). Sur un réseau local non sécurisé, on peut facilement imaginer qu'un intrus (Linux/Unix) ayant récupéré (usurpé) une ip valide va pouvoir utiliser un export NFS sans trop de difficultés. L'idéal étant donc de créer un réseau dédié (physique ou au moins virtuel) réservé au NFS.


Environnement matériel


  • Dans le cas présent, le serveur utilisé pour l'export NFS est une CentOS 5.9 complètement à jour. En ce qui nous concerne, pas de NFS via CentOS 6.x pour le moment (performances trop réduites lors du transfert d'un nombre important de petits fichiers "home utilisateur" ou "serveurs Web" par exemple). Mais cela n'empêchera pas la présence des infos NFS V4 dans les lignes qui suivent. Le tuto sera mis à jour au fur et à mesure de nos avancées.
  • Le serveur NFS aura pour IP : 192.168.0.20 (Parefeu et Selinux désactivés).
  • Pour le tuto, utilisation d'un réseau Gigabit non dédié, c'est à dire pas de cartes réseau réservées à un lien exclusif Serveur / Client en parallèle du réseau dit classique (C'est un plus indéniable, tant du point du vue performances que sécurité, si vous pouvez le faire, n'hésitez pas).
  • Client CentOS 6.4 32 bits complètement à jour. Il aura pour IP : 192.168.0.61



Configuration de l'export côté serveur


  • Avant tout, il faut s'assurer que les paquets utiles soient présents (en root) :
# yum -y install nfs-utils portmap


# chkconfig portmap on
# chkconfig nfs on


  • Pour notre tuto, création du dossier qui servira d'export (c'est un exemple, adaptez avec vos choix) :
# mkdir /nfs-export
# chmod 777 /nfs-export


  • La définition des dossiers à exporter via NFS est à effectuer dans le fichier "/etc/exports", une ligne par dossier exporté :
# vi /etc/exports


  • Exemple d'export NFS pour toutes les machines d'un réseau (attention solution peu sûre, présentée pour l'exemple, mais à éviter en prod) :
# partiel de fichier

#Exemple NFS V3 et V4 pour tout un réseau :

/nfs-export    192.168.0.0/255.255.255.0(rw,async,no_root_squash)


  • Exemple NFS v3 et v4 machine par machine (plus sûr que le précédent) :
# partiel de fichier

# exemple NFS v3 et v4 poste par poste
# mettre un espace entre chaque client

/nfs-export       ip_client1(rw,async,no_root_squash) ip_client2(rw,async,no_root_squash)


  • Même exemple mais avec plusieurs lignes d'exports :
# partiel de fichier

# exemple NFS v3 et v4 poste par poste
# mettre un espace entre chaque client

/nfs-export       ip_client1(rw,async,no_root_squash) ip_client2(rw,async,no_root_squash)
/second-export       ip_client1(rw,async,no_root_squash) ip_client2(rw,async,no_root_squash)
/partage_lecture_seule       ip_client1(ro,async,no_root_squash) ip_client2(ro,async,no_root_squash)




Les options courantes d'export pour NFS V3 et V4


Il s'agit des options NFS à insérer dans l'export, côté serveur donc (cette liste n'est pas limitative, nous présentons uniquement les options compatibles V3 et V4). Si vous avez un doute, conservez les options déjà présentes dans les exemples.

  • rw : Lecture, ecriture. Utilisez l'option "ro" pour lecture seule.
  • async : Cette option permet d'améliorer très sensiblement les performances mais il y a un risque plus important de corrompre le ou les fichiers ouverts en cas de crash. Contraire de l'option "sync"
  • no_root_squash : Pas de transfert d'identité pour l'utilisateur root vers anonyme (contraire de "root_squash"). Notez que l'option "all_squash" force tous les utilisateurs vers anonyme.
  • no_subtree_check : Neutralise la vérification de sous-répertoires et permet donc un léger gain de perfs. Cette option est activée par défaut, si vous souhaitez forcer la vérification des sous-répertoires, utilisez "subtree_check" (déconseillé).
  • anonuid=1001 : Force les utilisateurs anonymes vers l'UID indiqué (exemple ici avec 1001). Nécessite donc la présence de l'option "all_squash" pour prise en compte dans tous les cas.
  • anongid=1001 : Force les utilisateurs anonymes vers le GID indiqué (exemple ici avec 1001). Nécessite donc la présence de l'option "all_squash" pour prise en compte dans tous les cas.




Un peu plus de sécurité avec les fichiers "/etc/hosts.allow" (ip réseau autorisées) et "/etc/hosts.deny" (ip réseau interdites)


Ces deux fichiers ne font pas partie de NFS au sens propre, toutefois ils définissent les machines (via ip) autorisées ou au contraire interdites d'accès au serveur. Cette partie est optionnelle mais conseillée.

  • Commençons par le fichier des machines interdites. On va faire propre, c'est à dire tous les postes du réseau :
# vi /etc/hosts.deny


# fichier hosts.deny pour mgroup.fr
#
#
# hosts.deny    This file describes the names of the hosts which are
#               *not* allowed to use the local INET services, as decided
#               by the '/usr/sbin/tcpd' server.
#
ALL:ALL
# fin du fichier


  • Puis on autorise les IP spécifiques qui pourront utiliser NFS :
# vi /etc/hosts.allow


# fichier hosts.allow pour mgroup.fr
#
#
# hosts.allow   This file describes the names of the hosts which are
#               allowed to use the local INET services, as decided
#               by the '/usr/sbin/tcpd' server.
#
ALL:192.168.0.61
# fin du fichier


  • Ou, avec plus de précision (mode parano /on, bien utile parfois), on limite au strict nécessaire pour NFS (à réserver aux serveurs qui ne font que de l'export NFS) :


# fichier hosts.allow pour mgroup.fr
#
#
# hosts.allow   This file describes the names of the hosts which are
#               allowed to use the local INET services, as decided
#               by the '/usr/sbin/tcpd' server.
#
portmap:192.168.0.61
lockd:192.168.0.61
mountd:192.168.0.61
statd:192.168.0.61
# fin du fichier


  • Redémarrage des services concernés :


# service portmap restart
# service nfs restart




Avant de commencer vos montages, vérifiez l'accès aux dossiers NFS exportés par le Serveur


Depuis le serveur: il est possible de "checker" les dossiers exportés et la (ou les) version(s) de NFS disponibles :

# nfsstat -o nfs


Server nfs v3:
null         getattr      setattr      lookup       access       readlink
6        14% 9        21% 0         0% 6        14% 5        11% 0         0%
read         write        create       mkdir        symlink      mknod
0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
remove       rmdir        rename       link         readdir      readdirplus
0         0% 0         0% 0         0% 0         0% 0         0% 1         2%
fsstat       fsinfo       pathconf     commit
3         7% 9        21% 3         7% 0         0%

Server nfs v4:
null         compound
6        37% 10       62%

Server nfs v4 operations:
op0-unused   op1-unused   op2-future   access       close        commit
0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
create       delegpurge   delegreturn  getattr      getfh        link
0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
lock         lockt        locku        lookup       lookup_root  nverify
0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
open         openattr     open_conf    open_dgrd    putfh        putpubfh
0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
putrootfh    read         readdir      readlink     remove       rename
10      100% 0         0% 0         0% 0         0% 0         0% 0         0%
renew        restorefh    savefh       secinfo      setattr      setcltid
0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
setcltidconf verify       write        rellockowner
0         0% 0         0% 0         0% 0         0%



Note 1 : Cette commande n'obtiendra un retour que si l'export NFS a été monté au moins une fois par un client. En effet, si aucun montage n'a encore eu lieu, il n'y a pas de statistique possible.

Note 2 : Il est possible de savoir quels clients sont connectés au serveur via l'option "-m" de "nfsstat". Voir "nfsstat --help" pour plus d'infos.



Depuis un client Linux déclaré: vous pouvez lister les dossiers accessibles via NFS (en root) :

# showmount -e ip_du_serveur



  • Dans notre exemple, la commande nous renvoie le dossier exporté et l'ip du client autorisé :
# showmount -e 192.168.0.20


Export list for 192.168.0.20:
/nfs-export 192.168.0.61




Création et montage temporaire depuis un terminal pour NFS V3 (ou plus ancien)


On se place maintenant sur le poste "client", afin de vérifier l'accès à l'export NFS ainsi que son montage depuis un terminal (en root) :

  • Création du dossier cible (en local). Il servira de point de montage (adaptez avec vos propres choix et les droits en conséquence) :
# mkdir /mnt/montage-nfs1
# chmod 777 /mnt/montage-nfs1


  • commande de montage à proprement dite :
# mount -t nfs 192.168.0.20:/nfs-export  /mnt/montage-nfs1


  • Si le système ne renvoie aucun message d'erreur, on peut vérifier le mountage via une commande "df" sur le dossier cible :
# df -kh  /mnt/montage-nfs1


Sys. de fichiers              Taille  Uti. Disp. Uti% Monté sur
192.168.0.20:/nfs-export       108G  1,3G  101G   2% /mnt/montage-nfs1


  • Pour démonter, rien de plus simple, une commande "umount" en précisant la cible (le point de montage) :
# umount /mnt/montage-nfs1




Création et montage temporaire depuis un terminal pour NFS V4


  • Pour utiliser le protocole NFS V4, s'il est disponible sur votre serveur NFS, la commande est sensiblement la même :
# mount -t nfs4  192.168.0.20:/nfs-export  /mnt/montage-nfs1




Note : Attention aux options côté serveur mais aussi client si vous utilisez NFS V4. Les options V3 ne sont pas toutes compatibles avec V4 et inversement. Commencez avec un minimum d'options ("rw,hard,async" par exemple) puis effectuez un montage et testez les performances lecture/écriture. Cet article peut vous y aider.


Utilisation de fstab pour un montage permanent et automatique


Pour une utilisation permanente et automatique au démarrage du client, il suffit de créer une ligne dans le fichier "/etc/fstab" de celui-ci. Vous trouverez plus d'informations sur "fstab" à partir de cette page. Ci-dessous, quelques options assez utilisées avec le protocole NFS dans un exemple de ligne "fstab".

  • Exemple de ligne de montage NFS dans le fichier "/etc/fstab" :
# vi  /etc/fstab


# partiel de fichier

# ligne de base
# ip_serveur:/dossier_exporté      point de montage    type (nfs)      option1,option2,option3    0   0

# exemple pour mgroup.fr
192.168.0.20:/nfs-export  /mnt/montage-nfs1         nfs          rw,async,hard,intr        0    0



Quelques options utiles côté client pour le fichier /etc/fstab (compatibles NFS V3 et V4)


  • rw : Lecture écriture. Pour limiter en lecture seule depuis le client, choisissez "ro" (read only)
  • async : Cette option permet d'améliorer très sensiblement les performances mais il y a un risque plus important de corrompre le ou les fichiers ouverts en cas de crash. Contraire de l'option "sync"
  • soft : Cette option laisse le logiciel gérer en cas de crash serveur. Je ne vous la recommande pas du fait d'un risque trop grand de données corrompues. Privilégiez le couple "hard,intr" ci-après.
  • hard : Un programme accédant au fichier sur un système NFS figera si le serveur tombe ou se retrouve injoignable et reprendra dès son retour. C'est une option recommandée (plutôt que l'option "soft") qui doit être associée à "intr" (ci dessous).
  • intr : Cette option autorise l'annulation des requêtes NFS en cas de panne serveur.
  • rsize=8192 : Permet de préciser la taille des paquets en lecture. A ne pas manipuler si vous n'êtes pas à l'aise avec ces notions.
  • wsize=8192 : Permet de préciser la taille des paquets en écriture. A ne pas manipuler si vous n'êtes pas à l'aise avec ces notions.
  • nolock : Cette option est parfois nécessaire lors de connexions à un serveur disposant d'une ancienne version NFS (V2 ou antérieur).



Note : Sauf cas particulier ("ro" par exemple), les options côté client doivent correspondre avec celles insérées côté serveur.







La prochaine partie de ce tuto vous donnera un aperçu de SSHFS (en cours de rédaction).


N'hésitez pas à partager vos avancées et commentaires sur le topic dédié du forum..
Merci de noter que ce tuto regroupe les bases indispensables à l'utilisation de NFS et non les cas particuliers. Rendez vous sur le forum pour vos situations propres et les éventuelles options qui pourraient vous être utiles.



Sources et Liens utiles :