Module 2
Chapitre 01 - NFS
1. Présentation de NFS/RPC
1.1 Le protocole NFS
Le protocole NFS (Network file system) fût mis en place par Sun Microsystems en 1984 dans le but de permettre l'accès à des ressources situées sur des hôtes distants.
Le système NFS permet de monter des volumes réseaux et d'y accéder de manière transparente pour l'utilisateur.
1.2 RPC
NFS utilise la méthode de connexion RPC (Remote procedure call) également inventée par SUN. RPC décrit une methode de type client/serveur utilisant le format XDR (eXternal Data Representation) ou chaque service est representé par un numero indiqué dans le fichier /etc/rpc.
Extrait du fichier /etc/rpc
portmapper 100000 portmap sunrpc rpcbind
rstatd 100001 rstat rup perfmeter rstat_svc
rusersd 100002 rusers
nfs 100003 nfsprog
RPC fonctionne sur TCP/IP, un serveur RPC va faire la correspondance entre le numero de service RPC et le port.
Lorsqu'un client se connecte au serveur RPC celui-ci lui envoie le numero de service auquel il veut acceder et le serveur lui renvoi le port associé.
Le client n'a donc pas besoin de connaitre les details réseau. Les serveurs RPC disponibles se nomme rpcbind et portmap, ceux-ci ecoutent sur le port 111 tcp/udp par defaut. RPC se situe au niveau de la couche 5 (session) du modele OSI.

La commande rpcinfo permet de dialoger avec un serveur RPC (visualisation des tables...).
$ rpcinfo -p hostname
2. Installation d'un client/serveur NFS
L'installation du client se deroule de maniere similaire a celle du serveur. On peut distinguer 2 parties :
la partie noyau (kernel land) : permet au noyau de prendre en charge le protocole.
la partie logicielle (user land) : prend en charge la partie appplicative.
2.1 La partie noyau
Il faut activer (si cela n'est deja fait) le support du systeme de fichiers NFS dans le noyau :

Pour cela rentrez dans le menu de configuration du noyau et activer le support du NFS (File systems -> Network File Systems -> NFS file system support).
Dans le cas d'un serveur NFS il faut également activer le support du serveur NFS dans le noyau :
Pour cela rentrez dans le menu de configuration du noyau et activer le support du serveur NFS (File systems -> Network File Systems -> NFS server support), cochez ensuite l'option "Provide NFSv3 server support".

2.2 La partie logicielle
L'installation logicielle (NFS utils) permet d'obtenir les commandes clientes que nous etudirons un peu plus loin ainsi que le daemon NFS et les scripts de demarrage associes.
Il faut pour cela telecharger l'archive sur le site http://nfs.sourceforge.net/ , la procédure d'installation est la même que pour les autres logiciels.
./configure
make && make install
2.3 Configuration du serveur
Le fichier de configuration du serveur se stitue dans /etc et se nomme exports, il contient tous les répertoires partagés lors du demarrage du service ainsi que les options qui leur sont associees.
Le format est le suivant :
répertoire host1(options1,option2,...optionN) host2(option1,option2,...optionN)....hostn(option1,option2,...optionN)
"répertoire" correspond au répertoire partagé, "host1(options)...." correspond aux machines qui le droit d'accéder à ce répertoire. Les options indiquent de quelles manières les hôtes vont se connecter (Voir plus loin dans ce chapitre).
Comme vous pouvez le remarquer NFS se base UNIQUEMENT sur le nom de machine (ou l'adresse IP), cela est à prendre en compte lors de l'établissement des politiques de securité.
Vous pouvez utiliser l'opérateur '*' afin de spécifier que tout le monde à le droit de se connecter au répertoire.
répertoire *(options)
2.4 Mode syncrone/asyncrone
Mode syncrone : c'est la valeur par défaut, lorsque un utilisateur effectue une operation (copie, modification, création...), celle-ci est traitée directement par le serveur.
Avantage : Sécurité
Inconvénient : Lenteur
Mode asyncrone : lorsque un utilisateur effectue une opération (copie, modification, création...), celle-ci est mise en "tampon", c'est à dire que le serveur vous rend la main avant d'avoir effectuer l'opération (avant même d'avoir écrit le fichier ou autre sur le disque).
Avantage : rapidité pour l'utilisateur
Inconvenient : dangeureux, imaginons que le service rencontre un problème, vous ne pouvez pas être certain que vos changements ont bien été pris en compte.
2.5 Gestion des UID/GID
Rappel :
L'UID (User Identifier) est un numero unique sur le systeme representant un utilisateur unique (un utilisateur possede un et un seul UID et un UID correspond a un et un seul utilisateur).
Le GID (Group Identifier) est la meme chose que l'UID sauf qu'il s'applique pour les groupes.
L'UID du super utilisateur 'root' est egal à 0. Le GID du groupe 'root' est egal à 0.
Comme nous l'avons vu précédemment, NFS se base sur les noms des machines, il faut donc trouver un moyen de gérer les permissions ainsi que l'appartenance des ressources. Pour cela NFS se base sur l'UID/GID du client, c'est à dire que si le client fait des manipulations sur le serveur NFS avec le compte user1 (il s'agit du compte avec lequel la personne s'est connectée sur son poste de travail) qui a comme UID 1001, le serveur NFS le considérera comme utilisateur 1001 local (cela peut pointer sur un autre utilisateur).
Cela peut paraitre aberrant, mais il faut penser que NFS a été créé pour des réseaux de type serveurs/terminaux où les UID etaient partout les mêmes.
Un autre probleme se pose, imaginons qu'une personne soit root sur un client et se connecte au serveur NFS, son UID local est egal à 0 et donc le serveur lui attribue l'UID 0 sur le partage.
Pour palier à ce problème, NFS propose la possibilité d'imposer un UID/GID à tous les utilisateurs qui se connectent à un répertoire (partage), on appele cela un UID/GID anonyme. Cela signifie que si on configure l'UID/GID anonyme du partage à 4242/2121, tout les utilisateurs qui se connectent sur le partage recevrons l'UID/GID 4242/2121. Cette directive s'applique à tous les utilisateurs sauf root, pour celui-ci une directive spéciale permet d'indiquer que les utilisateurs se connectant avec un UID egal à 0 recoivent l'UID anonyme.

Maintenant que nous avons passé en revue la "théorie", nous allons énumerer les principales options ainsi que leur effet.
Option | Effet |
rw | le client a les droits d'écriture |
ro | le client a seulement les droits de lecture |
async | active le mode asyncrone |
sync | active le mode syncrone (par défaut) |
anonuid | spécifie l'UID des utilisateurs anonymes |
anongid | specifie le GID des utilisateurs anonymes |
all_squash | tous les utilisateurs (sauf root) récupèrent l'UID anonyme |
no_all_squash | Les utilisateurs gardent leur UID (par défaut) |
root_squash | l'utilisateur root récupère l'UID anonyme (par défaut) |
no_root_squash | l'utilisateur root garde son UID (dangeureux !!!) |
Pour obtenir la liste complete des options editez le manuel d'exports :
$ man exports
Exemple :
/ftp/films client1(rw,anonuid=1004,anongid=1006) client2(ro,async)
/cours *(ro)
L'arborescence /ftp/films est accessible par les clients client1 (lecture/écriture, UID anonyme=1004 et GID anonyme=1006) et client2 (lecture seule). L'arborescence /cours est accessible par tout le monde en lecture seule.
Il est bien sûr possible de spécifier une adresse IP à la place du nom de machine.
3. Administration/Maintenance d'un serveur NFS
3.1 Les differents daemons
Voici les differents daemons necessaires au bon fonctionnement du serveur NFS :
daemon | description |
portmap | le deamon portmap permet de faire la correspondance numéro RPC/Port (voir partie 2) |
rpc.mountd | le deamon rpc.mountd réalise le montage demandé par un client |
rpc.nfsd | le deamon nfsd éxécute les requêtes NFS |
rpc.statd | ce daemon récupere des statistiques (Voir plus loin dans le cours) |
3.2 Lancement et arrêt du serveur NFS
Les différents daemons cités précédemment doivent tous être lancés. Afin de nous faciliter la tâche, le script d'init installé via les nfs-utils permet de lancer/arrêter automatiquement tous les daemons.
Ce script se situe dans /etc/init.d et se nomme nfs, voici comment le manipuler :
# /etc/init.d/nfs operation
Voici les différentes opérations supportées par le script :
opération | effet |
start | démarrage des daemons |
stop | arrêt des daemons |
restart | redémarrage des daemons (stop + start) |
status | affiche l'état des daemons |
| Note: | |
selon la distribution utilisée d'autres options peuvent être disponibles. |
Exemple :
Lancement du serveur NFS :
# /etc/init.d/nfs start
3.3 Commandes d'administration et de maintenance
3.3.1 La commande exportfs :
La commande exportfs permet de manipuler les partages à "chaud" (lorsque que le serveur NFS tourne). Exportfs permet de désactiver, activer (on parle aussi d'exportation), modifier et ajouter des partages.
Voici une liste des options les plus couramment utilisées :
option | effet |
-a | exporte tous les partages contenus dans /etc/exports |
-u | désactive un partage |
-ua | désactive tous les partages contenus dans /etc/exports |
-o | permet de spécifier des options |
Voici la procédure à suivre pour ajouter à "chaud" un nouveau partage (sans avoir besoin de redémarrer le service NFS) :
# exportfs -o option1,option2 host:/répertoire
Les options sont les mêmes que celles du fichier /etc/exports.
Exemple :
# exportfs -o rw,async host1:/data
Cette commande ajoute le répertoire /data pour la machine host1 avec comme options rw et async.
3.3.2 La commande showmount :
La commande showmount permet d'afficher les répertoires partagés d'un serveur NFS ainsi que les machine ayant le droit d'y accéder.
Voici comment procéder :
$ showmount -e hostaname
Exemple :
# showmount -e nfs_server
Export list for localhost:
/data STS.esi-supinfo.com,localhost
Dans cet exemple l'hote nfs_server exporte le répertoire /data pour les machines localhost et STS.
D'autres options sont disponibles, consultez la page de manuel de showmount :
$ man showmount
3.3.3 La commande nfsstat
nfsstat affiche des statistiques NFS et RPC recuperées par le daemon rpc.statd.
Voici une liste des options les plus courament utilisees :
option | Effet |
-s | affiche uniquement les statistiques du serveur |
-c | affiche uniquement les statistiques du client |
-n | affiche uniquement les statistiques NFS |
-r | affiche uniquement les statistiques RPC |
D'autres options sont disponibles, consultez la page de manuel de showmount :
$ man nfsstat
4. Utilisation du client NFS
Nous allons maintenant nous interresser à la partie cliente de NFS, à savoir : comment monter un partage NFS distant.
Pour cela nous allons utiliser la commande mount. Il faut au préalable connaitre l'IP/nom du serveur ainsi que le répertoire auquel on souhaite accéder (voir la commande showmount).
Voici comment utiliser mount pour acceder a un partage NFS distant :
# mount -t nfs -o options serveur:/partage /point_de_montage
Les options sont propres à mount, voici celles utiles pour NFS :
option | effet |
fg | si le montage échoue les tentatives suivantes se feront en avant-plan (par défaut) |
bg | si le montage échoue les tentatives suivantes se feront en arrière-plan |
rw | monte le partage en read/write (par défaut) |
ro | monte le partage en read only (lecture seule) |
suid | autorise l'utilisation de programmes suid (par défaut) |
nosuid | interdit l'éxécution de programmes suid |
hard | En cas d'échec, recommence l'opération jusqu'à sa réussite (par défaut) |
soft | abandonne l'opération en cas d'échec |
Les options du serveur sont prioritaires face à celle du client. C'est à dire que si le serveur permet à client1 de monter /data en read only (lecture seule) et que le client monte en Read/Write, alors le partage sera monté en read only.
Exemple :
# mount -t nfs -o ro,nosuid server:/data /mnt/nfs/
Le répertoire /data de la machine 'server' sera monté dans /mnt/nfs en read only/nosuid.
Pour monter un répertoire au démarrage du système il faut ajouter une entrée dans le fstab (comme pour les péripheriques locaux).
Voici la syntaxe a appliquer :
serveur:/partage /point_de_montage nfs options 0 0
options corresponds aux options citées ci-dessus, il est important de laisser le dump/pass à 0 (il parait assez logique de ne pas vérifier l'integrité du répertoire NFS à chaque démarrage).
A titre d'exemple nous allons reprendre le précedent exemple mais cette fois-ci nous le monterons a chaque démarrage.
server:/data /mnt/nfs nfs ro,nosuid 0 0