fuse(4) | Device Drivers Manual | fuse(4) |
fuse — périphérique FUSE (Filesystem in Userspace)
#include <linux/fuse.h>
Ce périphérique est l’interface principale entre le pilote du système de fichiers FUSE et un processus en espace utilisateur voulant fournir le système de fichiers (référé dans le reste de cette page de manuel comme démon du système de fichiers). Cette page de manuel est destinée à ceux qui veulent comprendre l’interface du noyau elle-même. Ceux mettant en œuvre un système de fichiers FUSE peuvent utiliser une bibliothèque en espace utilisateur telle que libfuse qui permet de faire abstraction de l’interface de bas niveau.
En substance, FUSE est un protocole client-serveur simple, dans lequel le noyau Linux est le client et le démon le serveur. Après l’obtention d’un descripteur de fichier pour ce périphérique, le démon peut lire (read(2)) les requêtes de ce descripteur de fichier et est présumé écrire (write(2)) en retour les réponses. Il est important de noter que ce descripteur de fichier est associé à un système de fichiers FUSE unique. En particulier, l’ouverture d’une seconde copie de ce périphérique ne permet pas l’accès aux ressources crées à travers le premier descripteur de fichier (et vice versa).
Chaque message lu par le démon commence par un en-tête décrit par la structure suivante :
struct fuse_in_header { uint32_t len; /* Taille totale des données, incluant cet en-tête */ uint32_t opcode; /* Le type d’opération (voir ci-après) */ uint64_t unique; /* Un identifiant unique pour cette requête */ uint64_t nodeid; /* ID de l’objet de système de fichiers qui est manipulé */ uint32_t uid; /* UID du processus requérant */ uint32_t gid; /* GID du processus requérant */ uint32_t pid; /* PID du processus requérant */ uint32_t padding; };
L’en-tête est suivi d’une partie de données de taille variable (pouvant être vide) spécifique à l’opération demandée (l’opération demandée est indiquée par opcode).
Le démon doit alors traiter la requête et, si applicable, envoyer une réponse (presque toutes les opérations demandent une réponse — si ce n’est le cas, cela est documenté ci-après) en réalisant un write(2) pour le descripteur de fichier. Toutes les réponses doivent débuter par l’en-tête suivant :
struct fuse_out_header { uint32_t len; /* Taille totale des données écrites sur le descripteur de fichier */ int32_t error; /* Toute erreur produite (0 si aucune) */ uint64_t unique; /* La valeur de la requête correspondante */ };
Cet en-tête est aussi suivi par des données (potentiellement absentes) de taille variable dépendant de la requête exécutée. Cependant, si la réponse est une réponse d’erreur (c’est-à-dire, error est définie), alors plus aucunes données de charge utile ne seront envoyées, indépendamment de la requête.
Cette section devrait contenir la documentation de chacun des messages du protocole. Cette page de manuel est actuellement incomplète, aussi tous les messages ne sont pas documentés. Pour chaque message, la structure envoyée par le noyau est fournie en premier, suivie par une description des sémantiques du message.
struct fuse_init_in { uint32_t major; uint32_t minor; uint32_t max_readahead; /* Depuis la version 7.6 du protocole */ uint32_t flags; /* Depuis la version 7.6 du protocole */ };
struct fuse_init_out { uint32_t major; uint32_t minor; uint32_t max_readahead; /* Depuis la version 7.6 */ uint32_t flags; /* Depuis la version 7.6 ; quelques bits de drapeaux ont été ajoutés après */ uint16_t max_background; /* Depuis la version 7.13 */ uint16_t congestion_threshold; /* Depuis la version 7.13 */ uint32_t max_write; /* Depuis la version 7.5 */ uint32_t time_gran; /* Depuis la version 7.6 */ uint32_t unused[9]; };
struct fuse_getattr_in { uint32_t getattr_flags; uint32_t dummy; uint64_t fh; /* Défini seulement si (getattr_flags & FUSE_GETATTR_FH) };
struct fuse_attr_out { /* Temporisation de cache d’attributs (secondes + nanosecondes) */ uint64_t attr_valid; uint32_t attr_valid_nsec; uint32_t dummy; struct fuse_attr { uint64_t ino; uint64_t size; uint64_t blocks; uint64_t atime; uint64_t mtime; uint64_t ctime; uint32_t atimensec; uint32_t mtimensec; uint32_t ctimensec; uint32_t mode; uint32_t nlink; uint32_t uid; uint32_t gid; uint32_t rdev; uint32_t blksize; uint32_t padding; } attr; };
struct fuse_access_in { uint32_t mask; uint32_t padding; };
struct fuse_open_in { uint32_t flags; /* Les drapeaux qui étaient passés à open(2) */ uint32_t unused; };
struct fuse_open_out { uint64_t fh; uint32_t open_flags; uint32_t padding; };
struct fuse_read_in { uint64_t fh; uint64_t offset; uint32_t size; uint32_t read_flags; uint64_t lock_owner; uint32_t flags; uint32_t padding; };
struct fuse_interrupt_in { uint64_t unique; };
struct fuse_entry_out { uint64_t nodeid; /* Id d’inœud */ uint64_t generation; /* Génération d’inœud */ uint64_t entry_valid; uint64_t attr_valid; uint32_t entry_valid_nsec; uint32_t attr_valid_nsec; struct fuse_attr attr; };
struct fuse_flush_in { uint64_t fh; uint32_t unused; uint32_t padding; uint64_t lock_owner; };
struct fuse_release_in { uint64_t fh; uint32_t flags; uint32_t release_flags; uint64_t lock_owner; };
struct fuse_kstatfs { uint64_t blocks; uint64_t bfree; uint64_t bavail; uint64_t files; uint64_t ffree; uint32_t bsize; uint32_t namelen; uint32_t frsize; uint32_t padding; uint32_t spare[6]; }; struct fuse_statfs_out { struct fuse_kstatfs st; };
Le système de fichiers FUSE est spécifique à Linux.
Les messages suivants ne sont pas encore documentés dans cette page de manuel :
FUSE_BATCH_FORGET FUSE_BMAP FUSE_CREATE FUSE_DESTROY FUSE_FALLOCATE FUSE_FORGET FUSE_FSYNC FUSE_FSYNCDIR FUSE_GETLK FUSE_GETXATTR FUSE_IOCTL FUSE_LINK FUSE_LISTXATTR FUSE_LSEEK FUSE_MKDIR FUSE_MKNOD FUSE_NOTIFY_REPLY FUSE_POLL FUSE_READDIRPLUS FUSE_READLINK FUSE_REMOVEXATTR FUSE_RENAME FUSE_RENAME2 FUSE_RMDIR FUSE_SETATTR FUSE_SETLK FUSE_SETLKW FUSE_SYMLINK FUSE_UNLINK FUSE_WRITE
fusermount(1), mount.fuse(8)
La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr>
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org.
5 février 2023 | Pages du manuel de Linux 6.03 |