Mise en place et utilisation de NFS

Yann Le Thieis - yann.le-thieis@tuxcoffee.net

NFS (Network File System) est un service de partage de fichiers à distance. C'est un protocole Unix qui permet de monter (d'accéder), via le réseau, un système de fichiers distant. Comme tel il est utilisable sur tous les systèmes Unix et par conséquent sous Linux.

NFS est un service RPC (Remote Procedure Call: Appel de procédures distantes). Pour le partage NFS sous Windows il existe un applicatif winnfsd qui permet de monter des répertoires d'un système Windows depuis un poste Unix ( http://sourceforge.net/projects/winnfsd).

Table des matières

Les RPC: Remote Procedure Call
Serveur NFS
Mise en place d'un partage NFS
Client NFS

Les RPC: Remote Procedure Call

Les RPC sont la base de NFS sur lesquels il s'appuie. NFS est un service RPC. Les RPC sont une API développée par SUN et mis depuis dans le domaine public. Elles permettent l'écriture d'applications du type client/serveur qui consiste à demander l'exécution d'une procédure distante avec retour du résultat. Les services RPC sont gérés via un annuaire nommé le portmapper . Un programme client qui envoie une requête NFS s'adresse au portmapper qui est un démon accessible sur le port 111 en TCP ou UDP (voir le fichier /etc/services pour une description des ports standards). Lorsque ce client s'adresse au portmapper, il lui demande où se trouve le serveur NFS et portmapper lui indique alors le port correspondant à ce service (port 2049 par défaut pour NFS).

Une commande RPC utile, rpcinfo, permet de connaître les services RPC qui sont actifs sur une machine. Exemple:

       yann@yuluth:~$ rpcinfo -p
       program no_version protocole no_port
   	   100000    2   tcp    111  portmapper
       100000    2   udp    111  portmapper
       100024    1   udp    772  status
       100024    1   tcp    775  status
       100003    2   udp   2049  NFS
       100003    3   udp   2049  NFS
       100003    4   udp   2049  NFS
       100003    2   tcp   2049  NFS
       100003    3   tcp   2049  NFS
       100003    4   tcp   2049  NFS
       100021    1   udp  32790  nlockmgr
       100021    3   udp  32790  nlockmgr
       100021    4   udp  32790  nlockmgr
       100021    1   tcp  32770  nlockmgr
       100021    3   tcp  32770  nlockmgr
       100021    4   tcp  32770  nlockmgr
       100005    1   udp    834  mountd
       100005    1   tcp    837  mountd
       100005    2   udp    834  mountd
       100005    2   tcp    837  mountd
       100005    3   udp    834  mountd
       100005    3   tcp    837  mountd

Serveur NFS

NFS (Network File System) est un service de partage de fichiers à distance. Cette partie concerne une mise en oeuvre minimale et fonctionnelle du partage NFS sur un réseau TCP/IP.

La partie serveur de NFS est intégré au noyau sous forme de module ou compilé en dur. Sur Debian il est sous la forme de module et pour l'activer directement au démarrage il faut installer le paquetage NFS-kernel-server.

La première chose à faire est de déterminer les répertoires que l'on veut partager sur le réseau, avec qui ou quoi les partager, comment les partager (i.e. quelles propriétés associer à chaque répertoire partagé) et ensuite de les configurer dans le serveur NFS.

Un serveur NFS est actif si les démons suivants sont actifs sur le serveur.

  • Le démon portmap qui permet tout service RPC.
  • Le démon rpc.mountd qui réalise les montages demandés par les clients via le portmapper.
  • Le démon nfsd qui exécute une requête NFS (il peut exister aussi sous le nom rpc.nfsd).

Mise en place d'un partage NFS

A titre d'exemple, nous allons voir la mise en place d'un répertoire de données /data dans différentes circonstances sur le serveur gavrinis.

La configuration du partage des répertoires via NFS se fait dans le fichier /etc/exports.

Synopsis d'une ligne de configuration d'un partage dans /etc/exports:

/chemin/repertoire machine1(option1,option2,...) autre_machine(...)

Remarque: Sur la debian, le service de partage NFS ne se lancera pas si le fichier /etc/exports n'est pas renseigné.

Configuration de /etc/exports pour le partage de /data de gavrinis pour la machine berder uniquement:

gavrinis:~# cat /etc/exports
# /etc/exports: the access control list for filesystems which may be exported
#  to NFS clients.  See exports(5).
/data berder(rw)

La ligne indique que nous exportons le répertoire /data (exporter = partager) pour le client berder uniquement et en lecture/écriture (rw).

Ensuite il faut lancer le service de partage NFS (maintenant /etc/exports est renseigné):

gavrinis:~# /etc/init.d/NFS-kernel-server start

Les options sont disponibles via la commande: man exports

On pourrait, en plus, vouloir partager ce répertoire pour les autres machines du réseau en lecture seule:

gavrinis:~# cat /etc/exports
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients.  See exports(5).
/data berder(rw,sync) 192.168.1.*
gavrinis:~# /etc/init.d/NFS-kernel-server restart

Pour la partie des machines du réseau nous aurions pu ajouter l'option ro pour lecture seule, mais c'est le mode actif par défaut!

Client NFS

Pour la partie cliente, la prise en compte d'un partage NFS revient à faire un simple montage de système de fichiers qui sera vu avec le type NFS.

Pour les manipulations suivantes vérifions ce qu'il y a dans le répertoire /data du serveur gavrinis:

gavrinis:~# ls /data
debian  libcurses-perl_1.12-1ubuntu1_i386.deb 
libcurses-ui-perl_0.95-1_all.deb  libterm-readkey-perl_2.21-1.3_i386.deb 
fstab  sysv-rc-conf_0.99-1_all.deb
kernel  welcome.msg

Par exemple en ligne de commande sur la machine berder:

berder:~# mkdir /mnt/data
berder:~# mount -t NFS gavrinis:/data /mnt/data
berder:~# ls /mnt/data
debian  libcurses-perl_1.12-1ubuntu1_i386.deb 
libcurses-ui-perl_0.95-1_all.deb  libterm-readkey-perl_2.21-1.3_i386.deb
fstab   sysv-rc-conf_0.99-1_all.deb
kernel  welcome.msg

Pour prendre en compte ce montage au démarrage du système, la ligne suivante peut être renseignée dans le fichier /etc/fstab de berder:

gavrinis:/data /mnt/data  NFS rsize=1024,wsize=1024,rw,nosuid 0 0

rsize et wsize sont des options de montage associées au type NFS qui indiquent la taille des blocs en lecture ("taille de blocs réseaux") et la taille des blocs en écriture. Cela concerne les capacités de la carte réseau et les tailles par défauts, respectivement 4096 et 8192 peuvent ne pas convenir).

L'accès est ici en lecture/écriture (rw).

nosuid est une option qui supprime les bits suid dans la zone de partage (vu par le client). C'est une mesure de protection.


Dernière mise à jour :  2005-12-03 - Copyright (c) 2005 - 2006 Yann Le Thieis.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".