

document original par Marcus Brinkmann
traduction: Damien Genet
Avant d'étudier le fonctionnement des traducteurs, commençons par considérer les systèmes de fichiers normaux. Un système de fichiers est un magasin pour un arbre hiérarchique de répertoires et de fichiers. Vous pouvez accèder aux répertoires et aux fichiers par une chaine de caractères spéciale : le chemin. Il y a, de plus, les liens symboliques se référer à un fichier à différent endroits de l'arbre, ainsi que les liens physiques pour donner plusieurs noms à un fichier. Il y a aussi les fichiers de périphériques pour communiquer avec les pilotes matériels du noyau. Il y a les points de montage pour inclure d'autres magasins (c'est à dire d'autres systèmes de fichiers) dans l'arbre. Enfin il y a d'autres objets obscurs comme le listes fifos et les liens physiques.
Bien que ces objets soient vraiment différents, ils partagent des propriétés communes, par exemple, ils ont tous un propriétaire et un groupe associé, ainsi que des droits d'accès (les permissions). Point commun suplémentaire, toutes ces informations sont écrites dans les inodes. Chaque objet est associé à, exactement, un inode (les liens physiques sont un peu spéciaux comme ils partagent le même inode). Parfois, l'inode contient d'autres informations : il peut contenir la cible d'un lien symboliques.
Toutefois, ces points communs ne sont généralement pas exploités dans les implémentations habituelles, malgré une interface de progammation commune. Toutes les inodes peuvent être appelées à travers les appels POSIX, comme read() ou write(). Pour ajouter un nouveau type d'objet (comme un noveau type de lien) à un noyau unix monolithique, vous devez modifier le code de chaque système de fichier séparément.
Dans le Hurd, les choses marchent différemment. Bien qu'un système de fichier spécial puisse avoir des propriétés spéciales pour des objets standards comme les liens (les liens rapides dans le système de fichier ext2, par exemple), il existe une interface générale pour ajouter de telles caractéristiques sans modifier le code existant.
L'astuce consiste à autoriser un programme à être inséré entre : le contenu réel d'un fichier, et l'accès utilisateur au fichier. Un tel programme est appelé un traducteur, parce qu'il est capable de traiter les requêtes de différentes manières. En d'autres mots, un traducteur est un serveur du Hurd qui fournit l'interface du système de fichier.
Les traducteurs possèdent des propriétés très intéressantes. Du point de vue du noyau, il ne sont que des processus utilisateurs. Ce qui veut dire que les traducteurs peuvent être lancés par n'importe quels utilisateurs : vous n'avez pas besoin de privilèges administrateur pour installer ou modifier un traducteur, vous avez seulement besoin des droits d'accès pour l'inode sous-jacent auquel le traducteur est attaché (comme pour la création d'un fichier normal). Beaucoup de traducteurs n'ont pas besoin d'utiliser un fichier existant pour fonctionner, ils peuvent fournir l'information par leurs propres moyens. C'est pourquoi l'information à propos des traducteurs est stocké dans l'inode.
Les traducteurs délivrent toutes les opération du système de fichier de l'inode auquel ils sont attachés. Parce qu'ils ne sont pas restreints aux objets habituels (fichiers de périphérique, liens ..), ils sont libres de retourner tout ce qui peut avoir du sens pour le programmeur. On pourrait même imaginer un traducteur qui se comporterait comme un répertoire quand on y accède par cd ou ls et en même temps se comportant comme un fichier quand on y accède par cat.
Un point de montage peut être vu comme un inode qui a un traducteur attaché. Son dessein serait de traduire les opération sur le point de montage en opérations dans un autre magasin, disons par exemple, une autre partition.
Il s'agit, en fait, de la façon dont les systèmes de fichiers sont implémentés dans le Hurd. Un système de fichier est un traducteur. Ce traducteur prend un magasin comme argument, et est capable de servir toutes les opérations de systèmes de fichiers de façon transparente.
Il y a beaucoup de fichiers de périphériques différents, et, dans un système à noyau monolithique, ils sont tous fournis par le noyau lui même. Dans le Hurd, tous les fichiers de périphériques sont pourvus par des traducteurs. Un traducteur peut fournir le support pour plein de fichiers de périphériques similaires : toutes les partitions du disque dur, par exemple. De cette façon, le nombre de traducteurs nécessaires est réduit. Toutefois, notez que pour chaque accès à un périphérique, une tâche différente est lancée. Comme le Hurd est fortement multi-tâche, celà reste d'un coût très léger.
Quand le matériel est impliqué, un traducteur commence habituellement par communiquer avec le noyau pour récupérer des données du matériels. Mais si aucun accès matériel n'est nécessaire, le noyau n'a pas besoin d'être impliqué. Par exemple, /dev/zero ne requiert aucun accès matériel, et peut donc être complètement implémenté en espace utilisateur.
Un lien symbolique peut être vu comme un traducteur. Accèder au lien symbolique démarrerais le traducteur, qui transmettrais la requête au système de fichier contenant le fichier, sur lequel le lien pointe.
Toutefois, pour de meilleures performances, les systèmes de fichiers peuvent avoir un support natif des liens symboliques. De façon interne, l'accès à un lien symbolique ne lance alors aucun nouveau processus traducteur. Pour l'utilisateur, celà se passera comme si un traducteur passif étais invoqué (voir ci-dessous pour une explication sur ce qu'est un traducteur passif).
Parce que le Hurd est livré avec un traducteur de liens symboliques, n'importe quel serveur de système de fichiers qui fournit le support pour les traducteurs, possède automatiquement le support pour les liens symboliques (et pour les fichiers de périphériques, ...)! Ce qui veut dire, que vous pouvez avoir un système de fichiers qui très vite fonctionne, et ajouter le support natif des liens symboliques ainsi d'autres caractéristiques plus tard.
Il y a deux types de traducteurs, les passifs et les actifs. Ils sont complètements différents, donc ne mélangez pas les deux, mais ils possèdent une relation de proximité l'un et l'autre.
Un traducteur actif est un processus traducteur en cours de fonctionnement, comme présenté ci-dessus. Vous pouvez mettre en place et enlever un traducteur actif en utilisant la commande settrans -a. L'option a est nécessaire pour notifier à settrans que vous voulez modifier le traducteur actif.
La commande settrans prend trois types d'arguments. Premièrement, vous pouvez spécifier les options pour settrans lui même, comme -a pour modifier le traducteur actif. Vous pouvez alors spécifier l'inode que vous voulez modifier. Souvenez vous qu'un traducteur est toujours associé avec un inode dans la hiérarchie des répertoires. Vous ne pouvez modifier qu'un inode à la fois. Si vous n'ajoutez pas d'arguments suplémentaires, settrans essaiera de supprimer le traducteur existant. Si le traducteur est utilisé par un autre processus, vous obtiendrez un message d'erreur "devide or resource busy" ("périphérique ou ressource occupé") à moins que vous n'utilisiez l'option force.
En revanche, si vous spécifiez d'autres arguments, ils seront interprétés comme une ligne de commande pour lancer le traducteur. Ce qui veut dire que l'argument suivant est le nom du traducteur à éxecuter. Les arguments restants étant les options de ce traducteur, et non ceux de la commande settans.
Par exemple, pour monter une partition ext2fs, vous pouvez exécuter settrans -a -c /mnt/hurd/ext2fs /dev/hd2s5. L'option -c créant le point de montage si il n'existe pas déjà (point de montage qui, à propos, n'a pas forcément besoin d'être un répertoire). Pour démonter, vous devez juste essayer settrans -a /mnt.
Un traducteur passif est installé et modifié avec la même syntaxe qu'un traducteur actif (enlevez juste le -a), ainsi, tout ce qui a été dit ci-dessus est valable pour les traducteurs passifs. Il existe toutefois une différence : les traducteurs passifs ne sont pas encore lancés.
C'est à dire que les traducteurs seront lancés seulement en cas de besoin exemple : un traducteur passif sur un sytème de fichier ne sera lancé que quand vous voudrez accéder aux fichiers qu'il contient. Même chose pour le réseau le traducteur se lanceras dés qu'il y aura du traffic dessus. Et ainsi de suite.
Ainsi, au premier accès au traducteur passif, celui-ci est automatiquement lut dans l'inode, et un traducteur actif est lancé au-dessus, utilisant la ligne de commande qui étais conservée dans l'inode. Ce fonctionnement est similaire à l'automontage de Linux. Bien qu'ici, il ne s'agisse pas d'un "bonus" additionnel que vous avez à configurer manuellement, mais d'une partie intégrante du système. Car, la mise en place de traducteurs passifs, défèrre le lancement de la tache du traducteur, jusqu'à ce que vous en ayez réellement besoin. Au fait, avec un traducteur passif, lorsque le processus traducteur actif meurt pour une raison quelconque, lors du prochain accès à l'inode, il sera redémarré.
Il existe encore une autre différence : les traducteurs actifs peuvent mourrir ou être perdus. Dès que le traducteur actif est tué (par exemple, parceque vous avez redémarré la machine), il est perdu pour toujours. Les traducteurs passifs, eux, ne sont pas éphémères et sont conservés dans les inodes, même lors des redémarrages. Ceci jusqu'à ce que vous les modifiez avec le programme settrans, ou que vous détruisiez les inodes auxquels ils sont attachés. Ce qui veut dire que vous n'avez pas besoin de maintenir un fichier de configuration de vos points de montage (comme /etc/fstab sous Linux).
Un dernier point : même si vous avez installé un traducteur passif, vous pouvez toujours mettre en place un traducteur actif différent. Le traducteur passif n'est alors pris en considération, pour le lancement automatique d'un traducteur, que si aucun traducteur actif n'est en cours d'éxécution lors de l'accès à l'inode.
Comme mentionné ci-dessus, vous pouvez aussi utiliser settrans pour mettre en place et modifier des traducteurs actifs et passifs. Il existe une grande quantité d'options pour modifier le comportement de settrans, dans le cas où quelque chose irais de travers, ainsi que pour conditionner son action. Quelques utilisations possibles :
settrans -c /mnt /hurd/ext2fs /dev/hd2s5 monte une partition, le traducteur est conservé entre les redémarrages.settrans -a /mnt /hurd/ext2fs ~/image.fs monte un système de partition contenu dans un fichier image, le traducteur sera perdu si il meurt.settrans -fg /nfs-data force la suppression d'un traducteur.
Vous pouvez utiliser la commande showtrans pour vroir si un traducteur est attaché à un inode. Même si cette commande ne montre que les traducteurs passifs (utiliser ps Aux | grep /hurd/ pour obtenir la liste des traducteurs actifs).
Vous pouvez aussi changer les option d'un traducteur actif avec fsysopt sans avoir besoin de le redémarrer. Ce qui est très pratique, par exemple, pour faire ce qui s'appelle "remontage d'une partition en lecture seule" (sous Linux), simplement en lançant fsysopts /pointmontage --readonly. Le traducteur actif en cours d'exécution va tenter de modifier son comportement afin de satisfaire votre requête. La commande fsysopts /pointmontage sans paramètre montre les options actuelles.
Je vous recommande de commencer par lire le code de la commande /bin/mount, il s'agit d'un petit script. Comme le montage d'un traducteur de système de fichiers est similaire au montage d'une partition, vous pourrez, de cette manière, facilement comprendre le concept. Faîtes une image de système de fichiers avec dd if=/dev/zero of=image.fs bs=1024k count=8 && mke2fs image.fs puis "montez" cette image avec settrans -c pointmontage /hurd/ext2fs `pwd`/image.fs. Notez que le traducteur n'est pas encore lancé, aucun nouveau processus ext2fs ne s'éxécute pour l'instant (vérifiez avec ps Aux). Vérifiez que tout est correct en utilisant showtrans.
Maintenant tapez ls pointmontage, et vous pourrez remarquer un court délai pendant lequel le traducteur est lancé. Après çelà, il n'y aura plus de délai lors de l'accès au point de montage. Sous Linux, vous auriez automonté un système de fichier image. Vous pouvez vérifier avec ps Aux qu'il y a désormais un processus ext2fs test lancé, et en cours d'éxécution. Maintenant, ajoutez quelques fichiers dans ce nouveau répertoire. Essayez de passer le système de fichier en mode lecture seule avec fsysopt. Notez que maintenant les accès en écriture échouent. Essayez de tuer le traducteur actif avec settrans -g.
Vous devriez désormais mieux comprendre ce qui ce passe. Mais rappellez vous qu'il ne s'agissait que d'un serveur spécial, le serveur Hurd ext2fs. Vous trouverez plein d'autres serveurs dans le répertoire /hurd. Certains d'entres eux sont des systèmes de fichiers. D'autres sont nécessaires pour des fonctionalités de systèmes de fichiers comme les liens. D'autres fournissent les fichiers de périphériques. D'autres encore sont utiles pour le réseau. Imaginez le "montage" d'un serveur ftp avec settrans et le téléchargement de fichiers, simplement en utilisant la commande standard cp, ou l'édition de votre site web avec emacs /ftp/siteperso.mon.serveur.org/index.html!
Envoyez vos commentaires et suggestions à propos de ces pages à webmaster@hurdfr.org.
Vous pouvez aussi contacter directement les auteurs sur la page à propos.
Enfin, les informations sur la liste de diffusion sont disponible sur la page des listes HurdFr.
Copyright (C) 2001-2004 HurdFr, sauf mention contraire dans le document. PHP 5.4.4-15 sur GNU/Linux
V 0.9