08 - NFS

Introduction

NFS (Network File System)

NFS a été développé en 1980 par SUN Microsystems.

NFS permet le partage de systèmes de fichiers par le réseau.

Il utilise des fonctionnalités de la couche session, au-dessus de la couche transport, nommées les RPC (Remote Procedure Call).

Avec NFS il y a deux rôles:

  • Les serveur: il exporte tout ou partie de son système de fichiers

  • Le client: il importe la partie du système de fichiers que le serveur partage. Elle sera intégrée au système de fichiers du client.

Pour le client, l’action d’importer un partage NFS s’appelle monter le système de fichier et nécessite l’utilisation d’un processus.

L’utilisateur va donc monter le système de fichiers NFS dans un point de montage (un répertoire) comme il le ferait pour n’importe quel autre système de fichier.

La commande utilisée pour monter des systèmes de fichiers est la commande mount.

La commande mount correspond au mode manuel pour monter un système de fichiers.

Pour que le système de fichier reste monté même après de redémarrages de la machine, on utilisera les fonctionnalités du fichier /etc/fstab.

Pour optimiser les ressources et faire du montage automatique à la demande, on utilisera autofs.

Installation du serveur

# dnf install -y nfs-utils

Démarrage du serveur NFS

Lorsque l’on démarre nfs-server, deux autres services sont démarrés:

  • nfs-lock: permet de mettre des lock sur les fichiers (en cas d’écriture par exemple).

  • nfs-idmap: permet l’authentification des utilisateur.

  • rpcbind: gère les connexions RPC

Démarrage du serveur NFS:

$ systemctl status nfs-server
$ systemctl start nfs-server

NFS et Portmap

NFS dépend des RPC.

Le service portmap reçoit les appels de procédure distant et est capable de les transférer au bon service.

Lorsqu’un service utilisant RPC démarre, il contacte portmap pour l’informer du port sur lequel ils écoutent et de leur numéro de programme.

Lorsque le client veut interagir avec le serveur, il contacte le service portmap en indiquant le numéro du programme qu’il cherche à contacter.

portmap redirige alors le client vers le port utilisé par le programme.

Comme vous le voyez, NFS dépend de portmap pour fonctionner.

Il faut donc que le service portmap soit démarré avant de démarrer une application l’utilisant comme NFS.

Si portmap s’arrête brutalement, il faudra redémarrer portmap mais aussi tous les programmes utilisant portmap pour qu’ils puissent s’enregistrer.

Configuration du serveur NFS

Le fichier /etc/exports

Il contient la liste des répertoires qui sont exportés (partagés).

# Répertoire	Machines
/home		ordiclient(ro)

Par défaut le fichier est vide.

Il contient 3 champs:

  • Le répertoire exporté

  • La liste des machines ayant le droit de monter le répertoire avec les droits. Si cette liste est vide, toutes les machines ont le droit de monter le répertoire exporté.

Deux possibilités pour obtenir la liste des exportations:

$ cat /etc/exports
$ exportfs -v

Exporter un partage (côté serveur)

Toutes les informations concernant les partages (quel répertoire, quels droits) sont stockées dans le fichier /etc/exports.

Le programme exportfs lit ce fichier et transmet les informations qu’il contient à deux autres programmes:

  • rpc.mountd

  • nfsd

Ces deux programmes permettront le montage à distance des répertoires exportés.

Le fichier /etc/exports

Voici la syntaxe du fichier /etc/exports:

Répertoire		[hôte autorisés][(options)]		[hôte autorisé][(options)]

Le fichier /etc/exports est un standard utilisé sur toutes les distributions.

Il permet de contrôler les droits d’accès aux répertoires partagés.

Vous pouvez y mettre:

  • Des lignes vides: elles seront ignorés.

  • Des lignes commentées avec #

  • Écrire une ligne sur plusieurs lignes avec \

Le premier paramètre d’une ligne est le nom du répertoire à exporter.

Ensuite il y a la liste des hôtes autorisés à accéder au partage. Ils doivent être séparés par un espace ou une tabulation.

Les options doivent être “collées” à l’hôte et entre parenthèses. Pas d’espace entre l’hôte et les options.

Voici un exemple:

/home		192.168.0.34
/var/tmp	192.168.0.34(rw) 192.16.0.23
/tmp		192.168.0.34
/root		192.168.0.34

Accordez une attention particulière à la syntaxe de votre fichier, de petites erreurs peuvent conduire à une configuration totalement erronée.

Exemple:

/home	192.168.0.34(rw)

Et

/home	192.168.0.34 (rw)

N’ont pas du tout le même sens.

La première ligne donne accès en lecture et écriture uniquement à 192.168.0.34, personne d’autre ne pourra accéder au partage.

La deuxième ligne donne les droits par défaut à 192.168.0.34 c’est à dire lecture seule mais donnera lecture et écriture à la planète entière.

Après avoir modifié le fichier /etc/exports vous devez dire à NFS de relire sa configuration:

$ systemctl reload nfs-server

Si aucune option n’est spécifiée, ce sont les options par défaut qui s’appliquent.

Voici la liste des options:

ro, rw

(défaut: ro) lecture seule : les hôtes qui montent ce système de fichiers ne peuvent le modifier. Pour permettre aux hôtes d’effectuer des changements au système de fichiers, vous devez spécifier rw(lecture-écriture).

async, sync

(défaut: sync). L’option async permet au serveur d’écrire des données sur le disque lorsqu’il le juge opportun. En spécifiant l’option sync, toute modification de fichier doit être engagée sur le disque avant que la demande d’écriture du client ne soit complétée. Cela peut ralentir les performances.

wdelay, no_wdelay

(défaut: wdelay) fait en sorte que le serveur NFS retarde l’écriture sur le disque s’il pense qu’une autre demande d’écriture est imminente. Cela peut améliorer les performances en réduisant le nombre d’accès au disque par des commandes d’écriture différentes et le temps-système dédié à l’écriture. Utilisez no_wdelay pour désactiver cette fonction, qui ne fonctionne que si vous utilisez l’option sync.

root_squash, no_root_squash

(défaut: root_squash) fait en sorte que tout accès client au système de fichiers exporté, exécuté en tant que super-utilisateur sur l’ordinateur client, se fasse en tant qu’ID utilisateur “nfsnobody” (personne). Cela permet de “réduire” la puissance du super-utilisateur distant à celle de l’utilisateur local le plus bas, l’empêchant ainsi d’agir comme s’il était le super-utilisateur du système local.

Vous pouvez désactiver la diminution du super-utilisateur avec l’option no_root_squash. Pour diminuer tout utilisateur distant, y compris le super-utilisateur, utilisez l’option all_squash.

Pour spécifier quels ID utilisateur et groupe utiliser avec les utilisateurs distants d’un hôte spécifique, utilisez les options anonuid et anongid, respectivement. De cette façon, vous pouvez créer un compte utilisateur spécial à partager pour les utilisateurs NFS distants et spécifier (anonuid=, anongid=), où est le numéro d’ID utilisateur et est le numéro d’ID groupe.

all_squash, no_all_squash

(défaut: no_all_squash) permet de changer l’identité de n’importe quel usager à l’usager anonyme nfsnobody pour des raisons de sécurité.

no_all_squash permet de désactiver all_squash.

anonuid=uid

permet de spécifier le uid de l’usager anonyme.

anongid=gid

permet de spécifier le gid de l’usager anonyme.

La commande exportfs

La commande exportfs permet d’exporter ou d’annuler l’exportation de tout ou seulement quelques uns des répertoires.

exportfs écrit ses modifications dans /var/lib/nfs/etab.

Comme le démon rpc.mountd se réfère sans arrêt à ce fichier au moment d’accorder des droits, les modifications sont prises en compte immédiatement sans avoir besoin de recharger NFS.

Les options de exportfs:

  • -r : permet de prendre en compte les modifications apportées à /etc/exports.

  • -a : la suite de la commande s’applique à tous les répertoires.

  • -o : permet d’exporter un répertoire comme vous le feriez avec /etc/exports

exportfs -o async,rw 192.168.0.22:/var/tmp

À quoi serait équivalente la commande ci-dessus?

  • -i : indique à exportfs d’ignorer /etc/exports. Seules les options de la ligne de commande seront prises en compte.

  • -u : permet de “départager” un répertoire.

exportfs -ua 

supprime tous les partages

exportfs -v -u 192.168.0.34:/home 

supprime un seul partage

  • -v : affiche plus de détails.

ATTENTION: les partages configurés avec exportfs ne sont pas permanents. Ils disparaissent au redémarrage.

La commande exportfs seule affiche les partages actuels.

exportfs -v affiche la même chose mais avec plus de détails.

Voici 3 méthodes pour prendre en compte les modifications apportées à /etc/exports:

systemctl reload nfs
systemctl restart nfs
exportfs -r

Lab 1

Partagez le répertoire /home avec les droits read only pour toutes les machines en utilisant la commande exportfs.

Partagez le répertoire de base de l’utilisateur ayant l’uid 1000 avec les droits lecture/écriture pour votre machine cliente en utilisant le fichier /etc/exports.

Affichez la liste des partage de deux manières différentes.

Montage d’un partage NFS (client NFS)

Pour monter un partage chez un client, il existe trois méthodes:

Manuelle: à chaque démarrage du système root doit utiliser la commande mount pour monter le système et umount avant l’arrêt de la machine machine.

/etc/fstab: le système de fichiers est monté automatiquement à chaque démarrage du système et démonté à chaque arrêt.

autofs: le système de fichier n’est monté que lorsque nécessaire.

Configuration du client

Il faut déterminer le point de montage sur le client. On peut créer un répertoire dans /mnt pour le cours:

$ mkdir /mnt/montage

Ensuite on utilise la commande mount sur le client:

$ mount -t nfs ordiserveur:/home /mnt/montage

Structure de la commande mount:

$ mount -t (type de fichier) (serveur):(répertoire partagé) (point de montage)

Montage manuel

Pour monter un système de fichiers avec la commande mount:

$ mount -t nfs -o soft,timeo=20 neptune:/home /mnt/nfs

Pour démonter le système de fichier avec la commande umount:

$ umount /mnt/nfs

Pour afficher les points de montage avec la commande mount:

$ mount

Des options peuvent être utilisées en manuel avec fstab ou autofs.

hard/soft: permet d’annuler (soft) ou non (hard) une requête NFS si le serveur ne répond pas. Avec soft on peut spécifier timeo=[valeur].

nolock: parfois nécessaire pour de plus vieux serveurs.

noexec: pour interdire l’exécution de binaires sur le système distant. Utile pour des systèmes de fichiers non Linux.

Lab 2

Grâce à la commande mount, montez manuellement le répertoire de base de l’utilisateur ayant l’uid 1000 dans le répertoire ~/mnt

  • Pouvez-vous lire les fichiers?

  • Pouvez-vous écrire?

Avec la commande mount, montez /home de la machine distante dans /mnt.

  • Pouvez-vous lire les fichiers?

  • Pouvez-vous écrire?

  • Est-ce la même chose pour tous les utilisateurs?

Démontez les deux systèmes de fichiers avec a commande umount.

Montage automatique /etc/fstab

Le fichier /etc/fstab est lu au démarrage, il contient tous les systèmes de fichiers à monter par le système.

Tous les systèmes de fichiers contenus dans le fichier seront montés y compris les systèmes NFS.

La syntaxe est la suivante:

[serveur]:[partage]	[point montage]	nfs	[options]	0	0

[serveur]: nom ou ip du serveur NFS.

[partage]: nom du répertoire partagé.

[point de montage]: spécifie dans quel répertoire le système de fichier sera monté.

nfs: indique le type de système de fichiers.

[options]: indique les options comme les droits (ro, rw…), on utilisera “defaults” la majorité du temps.

Pour monter le système spécifié dans /etc/fstab, il faut soit redémarrer le système soit la commande:

$ mount 

Lab 3

Même exercice que Lab 2 mais en utilisant le fichier /etc/fstab.

Montez les systèmes de fichiers et assurez-vous que tout fonctionne.

À la fin du lab, supprimez les systèmes de fichiers NFS de /etc/fstab et démontez les.

Montage automatique autofs

Le problème de fstab est que les systèmes de fichiers distants sont montés en permanence ce qui mobilise des ressources sur la machines cliente.

S’il y a beaucoup de systèmes de fichiers distants à maintenir, les performances du système peuvent être affectés.

La solution consiste à utiliser l’utilitaire automount qui s’occupe de monter et démonter les systèmes de fichiers automatiquement lors de leur utilisation.

Il existe donc un service nommé autofs que vous pouvez activer:

systemctl start autofs

Le fichier utilisé pour contrôler autofs est /etc/auto.master.

automount peut être géré par la ligne de commande mais il est plus pratique de le gérer par un ensemble de fichiers ce qui permet d’automatiser.

Chaque ligne de auto.master réfère un montage en nommant un fichier dans lequel sera décrit précisément le montage.

[point-de-montage]	[fichier de montage]

[point-de-montage] indique le répertoire local dans lequel sera monté le système de fichier distant.

[fichier de montage] indique un fichier dans lequel on décrit précisément le point de montage.

Le fichier de mappe sera généralement nommé auto.[point-de-montage] où [point-de-montage] est le nom utilisé pour désigner le point de montage dans auto.master.

La syntaxe du fichier de mappe est la suivante:

[répertoire] [option de montage]	[hôte]:[partage]

[répertoire] indique le point de montage.

[option de montage] sont les mêmes options que vues précédemment.

Lab 4

Montez les mêmes répertoires que dans les labs précédents à l’aide de autofs.

Sur le client dans /etc/auto.master:

/mnt	/etc/auto.home	--timeout 60

Dans /etc/auto.home:

montage    -fstype=nfs	<serveur>:/home

Redémarrez le service autofs:

$ systemctl restart autofs

Comme précédemment, le partage sera monté lors de son utilisation.

$ ls /mnt/montage

Faites de même avec le répertoire de base de l’utilisateur ayant l’uid 1000.

Que constatez-vous?

Lab 5

Montez le partage [serveur]:/home/axel dans /home/axel/mnt.

Créez d’abord le partage dabs /etc/exports sur le serveur.

Sur le client, dans /etc/auto.master:

/-	/etc/auto.axel		--timeout 60

Dans /etc/auto.axel

/home/axel/mnt	<serveur>:/home/axel

Redémarrez le service autofs:

$ systemctl restart autofs.service

Le montage s’activera lorsqu’il sera utilisé comme par exemple avec:

$ cd /home/axel/mnt

Accès hôte

NFS contrôle les droits au niveau de l’hôte qui se connecte et non au niveau de l’utilisateur.

Ceci signifie que vous faites confiance aux utilisateurs qui utilisent le système client.

Il n’y a pas d’authentification de l’utilisateur lorsque celui-ci essaye d’utiliser le système de fichiers.

Le serveur NFS peut aussi utiliser les fichiers hosts.allow et hosts.deny (TCP Wrappers) pour gérer les autorisations des machines ayant le droit de se connecter (voir cours Linux 3).

Droits

Les fichiers sont protégés par des droits d’utilisateur et de groupe comme sur un système de fichiers local.

L’utilisateur et le groupe propriétaire sont des uid et gid.

Si deux postes clients ont un utilisateur dont l’uid est 1000 et que ces deux utilisateurs utilisent un répertoire/fichier sur le serveur dont l’utilisateur propriétaire a été défini comme l’uid 1000, alors ces deux utilisateurs pourront modifier les mêmes fichiers.

Vous voyez que dans ce cas l’utilisateur root sur le client aura les droits de root sur le partage NFS car root a le même uid sur tous les systèmes.

Le paramètre root_squashing permet de donner les droits de l’utilisateur nfsnobody à un utilisateur connecté en root sur son système local.