Comment implémenter un pilote de pilote de système de fichiers sous Linux? [fermé]

14

Supposons que j'ai inventé un nouveau système de fichiers et que je souhaite maintenant créer un pilote de système de fichiers pour celui-ci.

Comment pourrais-je implémenter ce pilote de système de fichiers, est-ce fait en utilisant un module de noyau?

Et comment le pilote du système de fichiers peut-il accéder au disque dur, si le pilote du système de fichiers contient du code pour accéder au disque dur, ou Linux contient-il un pilote de périphérique pour accéder au disque dur utilisé par tous les pilotes du système de fichiers?

user343344
la source

Réponses:

24

Oui, les systèmes de fichiers sous Linux peuvent être implémentés en tant que modules du noyau. Mais il y a aussi l'interface FUSE (Filesystem in USErspace), qui peut permettre à un processus d'espace utilisateur normal d'agir comme un pilote de système de fichiers. Si vous prototypez un nouveau système de fichiers, l'implémenter d'abord à l'aide de l'interface FUSE pourrait faciliter les tests et le développement. Une fois que les composants internes du système de fichiers ont été élaborés sous forme FUSE, vous pouvez alors commencer à en implémenter une version de module de noyau optimisée pour les performances.

Voici quelques informations de base sur l'implémentation d'un système de fichiers dans l'espace noyau. C'est assez vieux (de 1996!), Mais cela devrait au moins vous donner une idée de base du genre de choses que vous devrez faire.

Si vous choisissez d'aller sur la route FUSE, voici libfuse, l'implémentation de référence du côté espace utilisateur de l'interface FUSE.

Pilote de système de fichiers en tant que module du noyau

Fondamentalement, la fonction d'initialisation de votre module de pilote de système de fichiers doit simplement appeler une register_filesystem()fonction et lui donner comme paramètre une structure qui inclut un pointeur de fonction qui identifie la fonction dans votre pilote de système de fichiers qui sera utilisée comme première étape dans l'identification de votre système de fichiers tapez et montez-le. Il ne se passe plus rien à ce stade.

Lorsqu'un système de fichiers est en cours de montage et que le type de système de fichiers est spécifié pour correspondre à votre pilote ou que la détection automatique du type de système de fichiers est effectuée, la couche Virtual FileSystem du noyau (VFS pour faire court) appellera cette fonction. Il dit essentiellement "Voici un pointeur vers une représentation au niveau du noyau d'un périphérique bloc Linux standard. Jetez-y un œil, voyez si c'est quelque chose que vous pouvez gérer, puis dites-moi ce que vous pouvez en faire."

À ce stade, votre pilote est censé lire tout ce dont il a besoin pour vérifier que c'est le bon pilote pour le système de fichiers, puis renvoyer une structure qui inclut des pointeurs vers d'autres fonctions que votre pilote peut faire avec ce système de fichiers particulier. Ou si le pilote du système de fichiers ne reconnaît pas les données sur le disque, il est censé renvoyer un résultat d'erreur approprié, puis VFS signalera une défaillance dans l'espace utilisateur ou - si une détection automatique de type de système de fichiers est effectuée - demandera à un autre système de fichiers pilote à essayer.

Les autres pilotes du noyau fourniront l'interface de périphérique de bloc standard, de sorte que le pilote du système de fichiers n'aura pas à implémenter la prise en charge matérielle. Fondamentalement, le pilote du système de fichiers peut lire et écrire des blocs de disque à l'aide de fonctions standard au niveau du noyau avec le pointeur de périphérique qui lui est attribué.

La couche VFS s'attend à ce que le pilote du système de fichiers mette un certain nombre de fonctions standard à la disposition de la couche VFS; certains d'entre eux sont obligatoires pour que la couche VFS fasse quoi que ce soit de significatif avec le système de fichiers, d'autres sont facultatifs et vous pouvez simplement retourner un NULL à la place d'un pointeur vers une telle fonction facultative.

telcoM
la source
1
C'est une très bonne réponse, mais pour répondre pleinement à la question comme indiqué, vous devez également en dire un peu plus sur les fonctionnalités que la couche de périphérique de bloc fournit pour la couche de système de fichiers sur laquelle s'appuyer.
kasperd
J'ai en quelque sorte fait allusion à cela avec le bit "voici un pointeur vers un périphérique de bloc standard", mais bon point; J'ai développé cela.
telcoM
Cette réponse, en particulier la description de ce qui se passe dans quel ordre, est divine. Y a-t-il une sorte de livre / site Web que je pourrais lire qui a des descriptions comme ça pour tout "comment Linux fonctionne"?
Adam Barnes
Vous pourriez être intéressé par Linux Kernel Internals ou Linux Device Drivers, 3rd Edition . Et bien sûr, il y a la possibilité de lire le code source réel.
telcoM
0

Oui, cela se fait généralement à l'aide d'un pilote de noyau qui peut être chargé en tant que module du noyau ou compilé dans le noyau.

Vous pouvez consulter des pilotes de système de fichiers similaires et leur fonctionnement ici .

Ces pilotes utilisent probablement des fonctions internes du noyau pour accéder aux périphériques de stockage sous forme de blocs d'octets, mais vous pouvez également utiliser des périphériques de blocs tels qu'exposés par les pilotes dans les dossiers des périphériques de bloc et des périphériques de caractères .

Erik
la source
0

Vous pouvez utiliser fuse, pour créer un système de fichiers utilisateur, ou écrire un module noyau. C'est plus facile à faire avec les fusibles, car vous avez le choix des langues, et vous ne planterez pas le noyau (et donc tout le système).

Les modules du noyau peuvent être plus rapides, mais la première règle d'optimisation est la suivante: ne le faites pas avant d'avoir testé le code de travail. La seconde est comme ça: ne le faites pas avant d'avoir la preuve que c'est trop lent. Et le troisième: ne le conservez pas sauf si vous avez la preuve qu'il le rend plus rapide / plus petit.

Et oui, le noyau a déjà des pilotes pour le matériel, vous ne les réimplémentez pas.

ctrl-alt-delor
la source
Il y a des inconvénients majeurs à FUSE autres que les performances: il est difficile de l'utiliser pour votre système de fichiers racine. (Peut-être possible avec un initrd, mais le binaire FUSE n'a pas pu être libéré après le démarrage car il serait toujours en cours d'exécution à partir du ramdisk.)
Peter Cordes
1
@PeterCordes Il n'a pas pu être libéré , mais cela ne signifie pas qu'il ne peut pas être dissocié. S'il y a toujours une référence, il sera conservé en mémoire, que vous ayez quitté ou non les initramfs et supprimé le binaire sous-jacent.
forêt
@forest: c'est vrai, donc vous ne pouvez pas démonter l'initrd après pivot_root, car il y a encore des inodes occupés dans les initramfs.
Peter Cordes
Un normal /initdémarré à partir d'un initramfs s'exécutera (je pense) /initaprès pivot_root, pour transférer le contrôle aux vrais root FS /init. Mais un binaire FUSE ne pouvait pas se remplacer par execve si l'accès à la racine FS dépendait du processus FUSE répondant au noyau. Eh bien, peut-être en amorçant d'abord la pagecache, mais cela ne semble pas fiable.
Peter Cordes