Liste des paquets à installer pour le fonctionnement commun du serveur et du client 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.1saphir:~# ps aux |grep rpc root 5487 0.0 0.2 2452 932 ? Ss 09:07 0:00 /sbin/rpc.statd
|
Côté client le service de gestion des requêtes
RPC n'est en écoute que sur l'interface de boucle
locale |
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
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(sync,rw
,no_root_squash
,no_subtree_check
)
|
La réponse à une requête ne peut être émise que lorsque les opérations sur le support de stockage sont terminées. |
|
|
Le répertoire est exporté en lecture et écriture. |
|
|
Le super-utilisateur sur le client n'a plus les mêmes droits sur l'arborescence exportée par le serveur. |
|
|
La routine |
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
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 :
|
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
( |
|
|
La première séquence utilise le port client
|
|
|
Une fois le port |
|
|
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 TCP914
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:713
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=77
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=3,tcp
,posix
rubis:/var/exports /mnt/nfs saphir:~# ls /mnt/nfs/ saphir:~# umount /mnt/nfs
|
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. |
|
|
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. |
|
|
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"
Vous êtes ici :