Debian logo [inetdoc.LINUX]

4. Configuration du système de fichiers NFS

4.1. Paquets et services communs

Liste des paquets à installer pour le fonctionnement commun du serveur et du client NFS.

portmap

portmap gère les appels de procédures distantes ou Remote Procedure Call (RPC).

nfs-common

nfs-common gère les états des transactions NFS.

État de l'installation des paquets Debian :

saphir:~# dpkg -l portmap nfs-common
Souhait=inconnU/Installé/suppRimé/Purgé/H=à garder
| État=Non/Installé/fichier-Config/dépaqUeté/échec-conFig/H=semi-installé
|/ Err?=(aucune)/H=à garder/besoin Réinstallation/X=les deux (État,Err: majuscule=mauvais)
||/ Nom                 Version        Description
+++-===================-==============-=============================================
ii  portmap             5-10           The RPC portmapper
ii  nfs-common          1.0.7-3        NFS support files common to client and server

Contrôle de l'état des services :

saphir:~# ps aux |grep portmap
daemon    4770  0.0  0.1   1684   484 ?     Ss   09:07   0:00 /sbin/portmap -i 127.0.0.1 1
saphir:~# ps aux |grep rpc
root      5487  0.0  0.2   2452   932 ?     Ss   09:07   0:00 /sbin/rpc.statd

1

Côté client le service de gestion des requêtes RPC n'est en écoute que sur l'interface de boucle locale lo.

saphir:~# netstat -autp |grep rpc
tcp        0      0 *:1005                  *:*           LISTEN     5487/rpc.statd
tcp        0      0 localhost.locald:sunrpc *:*           LISTEN     4770/portmap
udp        0      0 *:999                   *:*                      5487/rpc.statd
udp        0      0 *:1002                  *:*                      5487/rpc.statd
udp        0      0 localhost.locald:sunrpc *:*                      4770/portmap

Contrôle du fonctionnement local des requêtes RPC :

saphir:~# rpcinfo -p
 program no_version protocole  no_port
  100000    2   tcp    111  portmapper
  100000    2   udp    111  portmapper
  391002    2   tcp    790  sgi_fam
  100024    1   udp   1002  status
  100024    1   tcp   1005  status

4.2. Configuration du serveur NFS

Côté serveur, il faut installer le paquet Debian nfs-kernel-server en plus des paquets précédents listés dans la Section 4.1, « Paquets et services communs ».

État de l'installation des paquets Debian :

rubis:~# dpkg -l portmap nfs-common nfs-kernel-server
Souhait=inconnU/Installé/suppRimé/Purgé/H=à garder
| État=Non/Installé/fichier-Config/dépaqUeté/échec-conFig/H=semi-installé
|/ Err?=(aucune)/H=à garder/besoin Réinstallation/X=les deux (État,Err: majuscule=mauvais)
||/ Nom                 Version        Description
+++-===================-==============-=============================================
ii  portmap             5-10           The RPC portmapper
ii  nfs-common          1.0.7-3        NFS support files common to client and server
ii  nfs-kernel-server   1.0.7-3        Kernel NFS server support

Pour que le service de gestion des requêtes RPC accepte les requêtes émises par le client NFS, il faut que ce service soit en écoute sur le réseau local. On doit donc passer par une reconfiguration du paquet portmap et|ou une édition du fichier de configuration du service /etc/default/portmap.

rubis:~# dpkg-reconfigure portmap
<snipped/>

Portmap doit-il être lié à l'adresse de bouclage ? <Non>  

Contrôle de l'état des services :

  • Liste des processus actifs.

    rubis:~# ps aux |grep -e rpc -e portmap
    root      9511  0.0  0.2   2452   928 ?        Ss   11:51   0:00 /sbin/rpc.statd
    daemon    9972  0.0  0.1   1688   464 ?        Ss   11:58   0:00 /sbin/portmap
    
  • Liste des ports réseau ouverts.

    rubis:~# netstat -autp |grep rpc
    tcp        0      0 *:sunrpc           *:*         LISTEN     9972/portmap
    tcp        0      0 *:789              *:*         LISTEN     9511/rpc.statd
    udp        0      0 *:783              *:*                    9511/rpc.statd
    udp        0      0 *:786              *:*                    9511/rpc.statd
    udp        0      0 *:sunrpc           *:*                    9972/portmap
    

Comme indiqué dans le support de travaux pratiques, on créé un répertoire et on configure son exportation vers le réseau local :

rubis:~# mkdir /var/exports
rubis:~# vim /etc/exports
rubis:~# cat /etc/exports
# /etc/exports: the access control list for filesystems which may be exported
#               to NFS clients.  See exports(5).

/var/exports    192.168.1.0/24(sync1,rw2,no_root_squash3,no_subtree_check4)

1

La réponse à une requête ne peut être émise que lorsque les opérations sur le support de stockage sont terminées.

2

Le répertoire est exporté en lecture et écriture.

3

Le super-utilisateur sur le client n'a plus les mêmes droits sur l'arborescence exportée par le serveur.

4

La routine subtree_check a pour but de contrôler qu'un fichier demandé par le client appartient bien à l'arborescence exportée par le serveur. En règle générale, il faut désactiver cette fonction lorsque l'on exporte des répertoires utilisateurs sur lesquels les modifications et les opérations d'écriture sont fréquentes.

Les explications complètes sont disponibles à partir de la section Setting Up an NFS Server du Linux NFS-HOWTO et des pages de manuels du paquet serveur nfs-kernel-server : man exports.

rubis:~# /etc/init.d/nfs-kernel-server restart
Stopping NFS kernel daemon: mountd nfsd.
Unexporting directories for NFS kernel daemon...done.
Exporting directories for NFS kernel daemon...done.
Starting NFS kernel daemon: nfsd mountd.

Contrôle de l'état des services :

  • Liste des processus actifs.

    rubis:~# ps aux |grep -e rpc -e portmap
    root      9511  0.0  0.2   2452   928 ?        Ss   11:51   0:00 /sbin/rpc.statd
    daemon    9972  0.0  0.1   1688   468 ?        Ss   11:58   0:00 /sbin/portmap
    root     10708  0.0  0.0      0     0 ?        S<   12:11   0:00 [rpciod/0]
    root     10710  0.0  0.2   2492   908 ?        Ss   12:11   0:00 /usr/sbin/rpc.mountd
    
  • Catalogue des services RPC disponibles.

    rubis:~# rpcinfo -p
       program no_version protocole  no_port
       100000    2   tcp    111  portmapper
       100000    2   udp    111  portmapper
       391002    2   tcp    903  sgi_fam
       100024    1   udp    786  status
       100024    1   tcp    789  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   1041  nlockmgr
       100021    3   udp   1041  nlockmgr
       100021    4   udp   1041  nlockmgr
       100021    1   tcp   1029  nlockmgr
       100021    3   tcp   1029  nlockmgr
       100021    4   tcp   1029  nlockmgr
       100005    1   udp    710  mountd
       100005    1   tcp    713  mountd
       100005    2   udp    710  mountd
       100005    2   tcp    713  mountd
       100005    3   udp    710  mountd
       100005    3   tcp    713  mountd
    

4.3. Montage manuel NFS

Contrôle de la disponibilité du service NFS :

saphir:~# showmount -e rubis
Export list for rubis:
/var/exports 192.168.1.0/24

Suivant l'état du fichier /etc/hosts ou du service DNS, il faut éventuellement utiliser la commande avec une adresse IP. Par exemple : showmount -e 192.168.1.4.

L'analyse réseau correspondant à la commande ci-dessus illustre les points suivants :

1

L'ensemble des communications utilise le protocole de couche transport TCP. Comme TCP est un protocole orienté connexion garantissant une grande fiabilité de communication, on pourra utiliser les services RPC sur un réseau étendu. On retrouve donc les séquences usuelles d'établissement ([SYN], [SYN, ACK], [ACK]) de maintien ([ACK]) et de libération ([FIN, ACK], [ACK]) de connexion.

2

La première séquence utilise le port client 914 et le port serveur sunrpc|111. Elle consiste en un appel de procédure distante Portmap V2 GETPORT qui permt d'attribuer un numéro de port pour la séquence suivante.

3

Une fois le port 713 attribué, le client (port 915) peut interroger le serveur NFS pour connaître ses répertoires exportés. L'appel de procédure distante utilisé est MOUNT V1 EXPORT.

4

Les évolutions des numéros de séquence et d'acquittement donnent une image des quantités de données échangées. Les données reçues par le client sont celles affichées lors de l'exécution de la commande showmount.

phil@saphir:~$ sudo tshark -i wlan0
Capturing on wlan0
 1 192.168.1.7 -> 192.168.1.4  TCP1 9142 sunrpc [SYN] Seq=0 Ack=0 Win=5840 Len=0
 2 192.168.1.4 -> 192.168.1.7  TCP sunrpc > 914 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0
 3 192.168.1.7 -> 192.168.1.4  TCP 914 > sunrpc [ACK] Seq=1 Ack=1 Win=5840 Len=0
 4 192.168.1.7 -> 192.168.1.4  Portmap V2 GETPORT Call MOUNT(100005) V:1 TCP
 5 192.168.1.4 -> 192.168.1.7  TCP sunrpc > 914 [ACK] Seq=1 Ack=61 Win=5792 Len=0
 5 192.168.1.4 -> 192.168.1.7  Portmap V2 GETPORT Reply (Call In 10) Port:7133
 6 192.168.1.7 -> 192.168.1.4  TCP 914 > sunrpc [ACK] Seq=61 Ack=33 Win=5840 Len=0
 7 192.168.1.7 -> 192.168.1.4  TCP 914 > sunrpc [FIN, ACK] Seq=61 Ack=33 Win=5840 Len=0
 8 192.168.1.7 -> 192.168.1.4  TCP 915 > 713 [SYN] Seq=0 Ack=0 Win=5840 Len=0
 9 192.168.1.4 -> 192.168.1.7  TCP sunrpc > 914 [FIN, ACK] Seq=33 Ack=62 Win=5792 Len=0
10 192.168.1.7 -> 192.168.1.4  TCP 914 > sunrpc [ACK] Seq=62 Ack=34 Win=5840 Len=0
11 192.168.1.4 -> 192.168.1.7  TCP 713 > 915 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0
12 192.168.1.7 -> 192.168.1.4  TCP 915 > 713 [ACK] Seq=1 Ack=1 Win=5840 Len=0
13 192.168.1.7 -> 192.168.1.4  MOUNT V1 EXPORT Call
14 192.168.1.4 -> 192.168.1.7  TCP 713 > 915 [ACK] Seq=1 Ack=77 Win=5792 Len=0
15 192.168.1.4 -> 192.168.1.7  MOUNT V1 EXPORT Reply (Call In 20)
16 192.168.1.7 -> 192.168.1.4  TCP 915 > 713 [ACK] Seq=77 Ack=81 Win=5840 Len=0
17 192.168.1.7 -> 192.168.1.4  TCP 915 > 713 [FIN, ACK] Seq=774 Ack=81 Win=5840 Len=0
18 192.168.1.4 -> 192.168.1.7  TCP 713 > 915 [FIN, ACK] Seq=81 Ack=78 Win=5792 Len=0
19 192.168.1.7 -> 192.168.1.4  TCP 915 > 713 [ACK] Seq=78 Ack=82 Win=5840 Len=0

Voici un exemple de syntaxe de montage d'un répertoire. Il est volontairement «riche» en options de façon à illustrer les fonctions NFS :

saphir:~# mkdir /mnt/nfs
saphir:~# mount -t nfs -o nfsvers=31,tcp2,posix3 rubis:/var/exports /mnt/nfs
saphir:~# ls /mnt/nfs/
saphir:~# umount /mnt/nfs

1

On impose l'utilisation de la version 3 du protocole NFS. Cette version doit normalement être utilisée par défaut avec la distribution Debian.

2

On impose le protocole de transport TCP. Là encore, c'est normalement le protocole de transport par défaut avec la version 3 du protocole NFS.

3

On impose la conformité aux règles POSIX pour les opérations sur le système de fichiers.

Voici une analyse réseau expurgée des étblissements, maintiens et libérations de connexion TCP. On y retrouve les appels de procédures distantes correspondant à chaque commande de la capture d'écran ci-avant :

 1 192.168.1.7 -> 192.168.1.4  Portmap V2 GETPORT Call NFS(100003) V:3 TCP
 2 192.168.1.4 -> 192.168.1.7  Portmap V2 GETPORT Reply (Call In 1) Port:2049
 3 192.168.1.7 -> 192.168.1.4  Portmap V2 GETPORT Call NFS(100003) V:3 TCP
 4 192.168.1.4 -> 192.168.1.7  Portmap V2 GETPORT Reply (Call In 3) Port:2049
 5 192.168.1.7 -> 192.168.1.4  NFS V3 NULL Call
 6 192.168.1.4 -> 192.168.1.7  NFS V3 NULL Reply (Call In 5)
 7 192.168.1.7 -> 192.168.1.4  Portmap V2 GETPORT Call MOUNT(100005) V:3 TCP
 8 192.168.1.4 -> 192.168.1.7  Portmap V2 GETPORT Reply (Call In 7) Port:713
 9 192.168.1.7 -> 192.168.1.4  Portmap V2 GETPORT Call MOUNT(100005) V:3 TCP
10 192.168.1.4 -> 192.168.1.7  Portmap V2 GETPORT Reply (Call In 9) Port:713
11 192.168.1.7 -> 192.168.1.4  MOUNT V3 NULL Call
12 192.168.1.4 -> 192.168.1.7  MOUNT V3 NULL Reply (Call In 11)
13 192.168.1.7 -> 192.168.1.4  MOUNT V3 MNT Call
14 192.168.1.4 -> 192.168.1.7  MOUNT V3 MNT Reply (Call In 13)
15 192.168.1.7 -> 192.168.1.4  NFS V3 FSINFO Call, FH:0x04780406
16 192.168.1.4 -> 192.168.1.7  NFS V3 FSINFO Reply (Call In 15)
17 192.168.1.7 -> 192.168.1.4  NFS V3 GETATTR Call, FH:0x04780406
18 192.168.1.4 -> 192.168.1.7  NFS V3 GETATTR Reply (Call In 17)
19 192.168.1.7 -> 192.168.1.4  NFS V3 ACCESS Call, FH:0x04780406
20 192.168.1.4 -> 192.168.1.7  NFS V3 ACCESS Reply (Call In 19)
21 192.168.1.7 -> 192.168.1.4  NFS V3 READDIRPLUS Call, FH:0x04780406
22 192.168.1.4 -> 192.168.1.7  NFS V3 READDIRPLUS Reply (Call In 21) . ..
23 192.168.1.7 -> 192.168.1.4  Portmap V2 GETPORT Call MOUNT(100005) V:3 TCP
24 192.168.1.4 -> 192.168.1.7  Portmap V2 GETPORT Reply (Call In 23) Port:713
25 192.168.1.7 -> 192.168.1.4  Portmap V2 GETPORT Call MOUNT(100005) V:3 TCP
26 192.168.1.4 -> 192.168.1.7  Portmap V2 GETPORT Reply (Call In 25) Port:713
27 192.168.1.7 -> 192.168.1.4  MOUNT V3 NULL Call
28 192.168.1.4 -> 192.168.1.7  MOUNT V3 NULL Reply (Call In 27)
29 192.168.1.7 -> 192.168.1.4  MOUNT V3 UMNT Call
30 192.168.1.4 -> 192.168.1.7  MOUNT V3 UMNT Reply (Call In 29)

On retrouve le numéro de port 2049 dans les attributions issues des appels de procédures distantes RPC. Il peut être intéressant d'effectuer une capture réseau spécifique à partir de ce numéro de port. Voici un exemple de syntaxe de capture :

phil@saphir:~$ sudo tshark -i wlan0 -R "tcp.port==2049"