Misfu, le site des cours Informatique/Bureautique/Mathematiques


 

Network File System (NFS)

Généralités & Définitions


Le Network File System est une technologie (un mécanisme ou un protocole pour faire simple) permettant d'accéder aux fichiers présents sur des machines distantes exactement comme s'ils sont locaux.


Sous les systèmes UNIX (y compris linux), il est considéré comme un système de fichiers à part entière.


Proposé par Sun Microsystem, le protocole NFS s'est imposé comme un standard dans le monde UNIX mais dépasse le simple cadre du monde UNIX.


Il s'appuie sur une représentation standard des objets proposée par le protocole XDR et le mécanisme d'appels de procédures distantes implémenté par le protocole RPC (Remote Procedure Call). Tous ces deux protocoles sont aussi l'œuvre de Sun Microsystem.


En fait NFS est composé de quatre protocoles distincts qui reposent tous sur les RPC et donc sur le programme rpc.portmap. Un des rôles de ce programme est de convertir les numéros de programmes RPC en numéros de ports. Quand un serveur RPC démarre, il va préciser à portmap quel port il utilisera et les numéros de programmes RPC qu'il gère. Quand un client souhaite envoyer une requête RPC vers un numéro de programme donné, il contacte d'abord le serveur portmap pour obtenir le numéro de port sur lequel tourne le programme souhaité. Ensuite, il adresse les paquets RPC au port concerné.


Quatre services correspondent à ces quatre protocoles et permettent à NFS de fonctionner ; ce sont nfsd, mountd, statd, lockd. Ils sont décrits brièvement dans le tableau ci-dessous.


Protocole

Description

Daemon

nfs

Ce protocole est la base qui permet la création de fichier, leur recherche, leur lecture ou leur écriture. ce protocole gère également l'authentification et les statistiques sur les fichiers

nfsd

mountd

Ce protocole s'occupe du montage des systèmes exportés auxquels on accédera par nfs. Il envoie des requêtes de type mount et umount au serveur, qui doit conserver des informations sur les systèmes de fichiers exportés.

mountd

nsm (Network Status Monitor)

Ce protocole sert à monitorer (superviser) les nœuds du réseau pour connaître l'état d'une machine (cliente ou serveur) pour signaler, par exemple, qu'elle redémarre.

statd

nlm (Network Lock Manager)

Pour éviter que des données soient altérées par plusieurs clients en même temps, ce protocole gère un système de veroous (locks , serrure ou fermeture en anglais) qui permettent de signaler les systèmes de fichiers utilisés. Ainsi, à l'aide du protocole nsm qui sait quand un client redémarre, il libère tous les locks du client avant de les lui restituer si une nouvelle requête est émise.

lockd

Vérifications avant usage & installation


Avant de pouvoir utiliser NFS, que ce soit en serveur ou en client, il faut vérifier que le noyau que l'on utilise a bien été compilé avec le support de NFS.


Le support de NFS par le noyau peut être assuré soit sous forme de module soit directement dans le noyau. dans le premier cas il suffit de consulter la liste de tous les modules liés aux systèmes de fichiers dans le répertoire /lib/modules//fs pour connaître ceux supporté par le noyau en question.
Par ailleurs, la plupart des versions récentes du système linux disposent d'une interface dans le système de fichier proc, qu'il suffit d'afficher à l'aide de la commande cat pour savoir si le support de NFS est assuré.


# cat /proc/filesystems

minix

ext2

xiafs

msdos

nodev proc

nodev nfs

iso9660


Si nfs n'apparaît pas dans la liste comme ci-dessus, il faut recompiler la noyau après avoir validé le support de NFS.


Deuxième vérification :

il faut s'assurer que les paquetages contenant les programmes nécessaires pour le fonctionnement de NFS (surtout en serveur) sont installés sur la machine. Ces programmes sont répartis sur quatre paquetages : glib, portmap, nfs-utils-clients et nfs-utils. Ainsi par exemple la distribution mandriva dispose des paquetages suivants :


. glibc-x.x.x-xxmdk.i586.rpm. Ce paquetage contient de nombreuses librairie et programmes dont les programmes /usr/sbin/rpcinfo, /usr/sbin/utmpd et /usr/sbin/zdump.


. portmap-x.x-xxmdk.i586.rpm. Ce paquetage contient le programme portmapper /sbin/portmap. Le succès de son installation dépend de l'existence du programme /sbin/chkconfig (voir plus loin dans ce même dossier).


. nfs-utils-clients-x.x.x-xmdk.i586.rpm. Ce paquetage contient les programmes rpc.lockd, rpc.statd et showmount entre autres. Le succès de son installation dépend essentiellement de l'existence de portmap.


. nfs-utils -x.x.x-xmdk.i586.rpm. Ce paquetage contient les programmes rpc.mountd, rpc.nfsd, rpc.rquotad et exportfs entre autres. Le succès de son installation dépend de l'existence des paquetages portmap et nfs-utils-clients.


Pour vérifier si ces quatre paquetages sont installés, il suffit de taper la commande suivante :


# rpm -qa | egrep 'glibc|portmap|nfs


Cette commande devra afficher au moins quatre lignes correspondant à ces quatre paquetages. Sinon, il faudra installer les paquetages manquants dans l'ordre : glibc, portmap, nfs-utils-clients et nfs-utils.


Troisième vérification :

s'assurer que le programme portmap a été démarré et s'exécute, puisque les protocoles nécessaires à l'utilisation de NFS se servent des RPCs. Cette vérification se fait par la commande rpcinfo qui permet de connaître les services RPC qui fonctionnent sur la machine spécifiée en argument après l'option -p. La même option sans un argument permet d'indiquer la machine sur laquelle la commande est lancée comme cible.


# /usr/sbin/rpcinfo -p


Quand portmap tourne, la commande ci-dessus retourne quelque chose comme ceci :


program vers proto port

100000 2 tcp 111 portmaper

100000 2 udp 111 portmaper

100011 1 udp 779 rquotad

100011 2 udp 779 rquotad

100003 2 udp 2049 nfs

100005 1 udp 1024 mountd

100005 1 tcp 1024 mountd

100005 2 udp 1024 mountd

100005 2 tcp 1024 mountd



Quand portmap ne tourne pas encore, la commande rpcinfo retourne un message d'erreur qui ressemble à ceci :


'rpcinfo : can't contact portmaper : RPC : Remote system error - Connection refused.'


Dans ce cas, il faut le démarrer par la commande :


# /sbin/portmap


Notons toutefois que la plupart des distributions qui sont diffusées actuellement mettent en place des scripts qui permettent le démarrage de portmap de manière automatique au démarrage de la machine.


Par ailleurs, la commande rpcinfo peut renvoyer la même réponse négative si une interdiction est faite au portmapper de répondre, par l'entremise des fichiers /etc/hosts.allow et /etc/hosts.deny. La tradition dans ce domaine se présente comme suit :


- On commence par interdire l'accès au service portmapper à toutes les machines par la ligne suivante dans le fichier /etc/hosts.deny


# hosts.deny : interdiction absolue pour tout le monde de se servir du portmap

portmap: ALL


- Ensuite, dans le fichier /etc/hosts.allow, on contrebalance cette interdiction drastique en autorisant l'accès à toutes les machines souhaitées.


Quatrième vérification :

Une fois le serveur NFS installé et démarré, on peut vérifier que tout fonctionne correctement par la commande :

# ps auxwww | egrep 'nfs|mount|lock|stat'

En réponse le serveur devrait affiché un résultat contenant au moins une ligne pour chacun des services évoqués plus haut, en plus de la ligne correspondant à la commande egrep.


Configuration et fonctionnement de NFS


Sur le serveur :

La configuration du serveur NFS se fait dans le fichier /etc/exports. A l'intérieur de ce fichier, on liste tous les répertoires partagés (on dit aussi exportés), et pour chaque répertoire, la liste des machines clientes autorisées à y accéder et le type d'accès autorisé. La page man de exports décrit les syntaxes valides pour les noms de clients et les options. En guise d'illustration, nous présentons ci-dessous un exemple simple :


# Fichier exports de christophe.misfu.home

/home afrique(rw) poucet(rw)

/usr/Tex afrique(ro) poucet(ro)

/ afrique(rw,no_root_squash)

/home/ftp (ro)


Commentaires :


- Quand aucun nom de machine n'est indiqué, n'importe quel client peut monter le répertoire correspond.

- Chaque ligne définit un répertoire à exporter, suivi d'une liste des clients autorisés à y accéder ; à la suite de chaque nom de client, on ajoute une liste facultative d'options (drapeaux), séparées par des virgules, entre parenthèses.

- Les formats acceptés pour les noms de clients sont :

. un nom de machine ;

. des caractères joker sur un nom de domaine comme post*.anfalab.org ;

. un netgroup, sous la forme @group, si NIS est utilisé et en définit

. une adresse IP, …

- Le tableau ci-dessous donne la signification et la valeur des options les plus utilisées


OPTIONS

SIGNIFICATIONS

root_squash

Interdiction aux superutilisateurs des machines spécifiées d'être assimilés au superutilisateur du serveur, en transformant leur UID/GID o en ceux de l'utilisateur nobody (UID 65534 eq. -2) Cette option est active par défaut

no_root_squash

Annulation de l'option par defaut (root_squash)

ro

read-only. Le client peut seulement lire dans le répertoire exporté (et don monté en lecture seule)

rw

read-write. Le client peut lire et écrire dans le répertoire exporté (et donc monté en lecture et écriture)

intr

Autorise les signaux à interrompre un appel NFS. Ceci est utile lorsque le serveur ne répond pas

timeo=n

indique le temps (en dixièmes de seconde) pendant lequel le client nfs attendra qu'une requête aboutisse. La valeur par défaut est 7 donc 0.7s



Lorsque l'on a fini de modifier le fichier de configuration, il faut transmettre de nouveau son contenu au serveur. Et c'est la commande exportfs qui se charge de ce travail quand on l'exécute avec l'option -a :


# exportfs -a


L'option -r synchronise le fichier /etc/mtab avec le fichier /etc/exports ; l'option -v permet de connaître les systèmes de fichiers exportés avec leurs options.


Cinq autres fichiers interviennent dans le fonctionnement normal du serveur NFS, en plus du fichier /etc/exports.


/etc/mtab. Il contient une liste de tous les fichiers montés par le noyau par la commande mount ou par autofs/automount.


/var/lib/nfs/rmtab. Il contient un ensemble de lignes, avec sur chaque ligne le nom d'un client et le système de fichiers qu'il importe de ce serveur.


/var/lib/nfs/etab. Il est créé par exportfs et contient sur chaque ligne toutes les informations liées à l'exportation vers un client unique. Il sert de référence à rpc.mount lors de son initialisation. C'est dans ce fichier que mound recherche afin de déterminer s'il peut accéder à l requête d'un client voulant avoir accès à un système de fichiers.


/proc/fs/nfs/exports. Il contient la liste des clients reconnus par le noyau.


/var/lib/nfs/xtab. Il joue le même rôle que le fichier précédent mais il ne contient que des noms de machines explicites alors que etab contient indifféremment des noms de clients et des groupes de machines (via des caractères jokers ou les netgroups).


Quand un client souhaite accéder à un répertoire par nfs, il commence par le demander à mountd. Celui-ci recherche alors dans etab si la requête est accessible. Il vérifie aussi auprès du noyau que la requête du client est légitime par l'intermédiaire des fichiers hosts.allow et hosts.deny ou des règles de pare-feu. Cette vérification lui permet, entre autres, de mettre à jour etab si c'est nécessaire. Si dans ce fichier, le répertoire exporté est autorisé à un groupe auquel appartient le client, mountd restreint alors la requête au client et en informe le noyau qui met à jour xtab avec ce nouvel hôte.


Sur le client :

Les répertoires exportés par NFS sont montés presque de la même façon que les systèmes de fichiers traditionnels, avec la commande mount qui dispose d'options propres à NFS. Nous retiendrons essentiellement quatre options parmi les plus utilisées.


Parmi ces options additionnelles, l'option -t nfs a ceci de particulier qu'il assimile NFS à un système de fichier à part entière (le système nfs).
Sur la ligne de commande, les autres options sont placées après le commutateur -o, comme l'illustre l'exemple qui suit :


# mount -t nfs afrique :/home /home -o timeo=14, intr


Dans cet exemple, nous supposons que la machine afrique dispose d'un serveur NFS et exporte son répertoire /home et nous souhaitons y accéder de la machine ramses.


L'argument afrique :/home spécifie le pseudo-device à monter, sous la forme nom-du-serveur:repertoire-exporte.


L'argument /home indique le point de montage du répertoire exporté sur le client ramses.


Il existe une autre manière de faire : monter le réperttoire exporté de manière permanente au démarrage du client (à condition que le serveur soit opérationnel). Pour ce faire on édite le fichier /etc/fstab comme pour les systèmes de fichiers traditionnels.
L'exemple ci-dessus donnerait dans fstab la ligne suivante :


# device point de montage système de fichiers options dump fsckorder

afrique:/home /home nfs timeo=14,intr 0 0



Par l'équipe technique A.N.F.A