Provided by: manpages-fr_4.26.0-1_all 

NOM
fuse — périphérique FUSE (Filesystem in Userspace)
SYNOPSIS
#include <linux/fuse.h>
DESCRIPTION
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).
Protocole de base
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.
Messages échangées
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.
FUSE_INIT
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 */
};
C’est la première requête envoyée par le noyau au démon. Elle est utilisée pour négocier la
version de protocole et les autres paramètres de système de fichiers. Il est à remarquer que la
version de protocole peut affecter la disposition de n’importe quelle structure dans le protocole
(y compris celle-ci). Le démon doit par conséquent se souvenir de la version négociée et des
drapeaux de chaque session. Au moment de l’écriture de cette page de manuel, la version de
protocole la plus récente prise en charge par le noyau est la version 7.26.
Les utilisateurs doivent faire attention à ce que les descriptions dans cette page de manuel
peuvent être incorrectes ou incomplètes pour les versions de protocole plus anciennes ou plus
récentes.
La réponse à cette requête est du format suivant :
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];
};
Si la version majeure prise en charge par le noyau est supérieure à celle prise en charge par le
démon, la réponse sera constituée de seulement uint32_t major (suivi par l’en-tête habituel),
indiquant la version majeure la plus élevée prise en charge par le démon. Le noyau produira alors
une nouvelle requête FUSE_INIT se conformant à l’ancienne version. Dans le cas contraire, le démon
reviendra silencieusement à la version majeure du noyau.
La version mineure négociée est considérée comme la version mineure minimale fournie par le démon
et le noyau, et les deux parties doivent utiliser le protocole correspondant pour ladite version
mineure.
FUSE_GETATTR
struct fuse_getattr_in {
uint32_t getattr_flags;
uint32_t dummy;
uint64_t fh; /* Défini seulement si
(getattr_flags & FUSE_GETATTR_FH)
};
L’opération requise est de déterminer les attributs que stat(2) doit renvoyer et les opérations
similaires pour l’objet indiqué de système de fichiers. L’objet pour lequel les attributs doivent
être déterminés est indiqué soit par header->nodeid ou, si le drapeau FUSE_GETATTR_FH est défini,
par le gestionnaire de fichier fh. Le dernier cas d’opération est analogue à fstat(2).
Pour des raisons de performance, ces attributs peuvent être mis en cache dans le noyau pendant une
durée indiquée. Tant que la temporisation du cache n'est pas dépassée, les attributs seront servis
à partir du cache et ne provoqueront pas de requêtes FUSE_GETATTR supplémentaires.
Les attributs calculés et la temporisation de cache demandée doivent alors être renvoyés dans la
structure suivante :
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;
};
FUSE_ACCESS
struct fuse_access_in {
uint32_t mask;
uint32_t padding;
};
Si l’option default_permissions de montage n’est pas utilisée, cette requête peut être utilisée
pour la vérification des permissions. Aucunes données de réponse ne sont attendues, mais les
erreurs peuvent être indiquées comme d’habitude en réglant le champ error dans l’en-tête de
réponse (en particulier, les erreurs de refus d’accès peuvent être indiquées en renvoyant
-EACCES).
FUSE_OPEN et FUSE_OPENDIR
struct fuse_open_in {
uint32_t flags; /* Les drapeaux qui étaient passés
à open(2) */
uint32_t unused;
};
L’opération demandée est d’ouvrir le nœud indiqué par header->nodeid. Les sémantiques exactes de
ce que cela signifie dépendent du système de fichiers mis en œuvre. Cependant, à tout le moins, le
système de fichiers doit valider que les drapeaux demandés sont valables pour la ressource
indiquée et alors envoyer une réponse de format suivant :
struct fuse_open_out {
uint64_t fh;
uint32_t open_flags;
uint32_t padding;
};
Le champ fh est un identifiant opaque que le noyau utilise pour référer à cette ressource. Le
champ open_flags est un masque de bits de n’importe quel nombre de drapeaux qui indiquent les
propriétés de ce gestionnaire de fichier au noyau :
FOPEN_DIRECT_IO Contournement de ce cache de pages pour ce fichier ouvert.
FOPEN_KEEP_CACHE Ne pas invalider le cache de données lors de l’ouverture.
FOPEN_NONSEEKABLE Ce fichier ne peut être parcouru.
FUSE_READ et FUSE_READDIR
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;
};
L’action demandée est de lire jusqu’à size d’octets du fichier ou du répertoire, en commençant à
offset. Les octets sont renvoyés directement en suivant l’en-tête de réponse habituel.
FUSE_INTERRUPT
struct fuse_interrupt_in {
uint64_t unique;
};
L’action demandée est d’annuler l’opération en attente indiquée par unique. Cette requête ne
demande aucune réponse. Cependant, la réception de ce message n’annule pas par lui-même
l’opération indiquée. Le noyau attendra toujours une réponse à ladite opération (par exemple, une
erreur EINTR ou une lecture courte). Au plus une requête FUSE_INTERRUPT sera faite pour une
opération donnée. Après l’émission de ladite opération, le noyau attendra de façon ininterrompue
pour l’achèvement de la requête indiquée.
FUSE_LOOKUP
Directement à la suite de l’en-tête est un nom de fichier à rechercher dans le répertoire indiqué
par header->nodeid. La réponse attendue est de la forme :
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;
};
La combinaison de nodeid et generation doit être unique pour toute la durée de vie du système de
fichiers.
L’interprétation des temporisations et de attr est comme pour FUSE_GETATTR.
FUSE_FLUSH
struct fuse_flush_in {
uint64_t fh;
uint32_t unused;
uint32_t padding;
uint64_t lock_owner;
};
L’action demandée est de vider toute modification en attente dans le gestionnaire de fichiers
indiqué. Aucune donnée de réponse n’est attendue. Cependant, un message de réponse vide doit
toujours être émis une fois que l’opération de vidage est terminée.
FUSE_RELEASE et FUSE_RELEASEDIR
struct fuse_release_in {
uint64_t fh;
uint32_t flags;
uint32_t release_flags;
uint64_t lock_owner;
};
Ce sont les opposés de FUSE_OPEN et FUSE_OPENDIR respectivement. Le démon peut désormais libérer
toute ressource associée avec le gestionnaire de fichier fh, car le noyau ne se référera plus à
celui-ci. Il n’y a aucune donnée de réponse associée à la requête, mais une réponse doit toujours
être fournie une fois que la requête a été complètement traitée.
FUSE_STATFS
L’opération met en œuvre statfs(2) pour ce système de fichiers. Il n’y a aucune donnée d’entrée
associée à cette requête. Les données de réponse attendues ont la structure suivante :
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;
};
Pour l’interprétation de ces champs, consulter statfs(2).
ERREURS
E2BIG Renvoyé par les opérations read(2) quand la requête du noyau est trop grande pour le tampon fourni
et que la requête était FUSE_SETXATTR.
EINVAL Renvoyé par write(2) si la validation de la réponse échoue. Toutes les erreurs dans les réponses
ne seront pas capturées par cette validation. Cependant les fautes basiques, telles que les
réponses courtes ou une valeur unique incorrecte, sont détectées.
EIO Renvoyé par les opérations read(2) quand la requête du noyau est trop grande pour le tampon
fourni.
Remarque : il existe diverses façons par lesquelles l’utilisation incorrecte de ces interfaces
peut faire que les opérations sur les fichiers et les répertoires indiqués du système de fichiers
échouent avec EIO. Parmi les utilisations incorrectes possibles :
- la modification de mode & S_IFMT pour un inœud ayant été rapportée auparavant au noyau ;
- la fourniture de réponses au noyau plus courtes que ce que le noyau attendait.
ENODEV Renvoyé par read(2) et write(2) si le système de fichiers FUSE a été démonté.
EPERM Renvoyé par les opérations sur un descripteur de fichier /dev/fuse n’ayant pas été monté.
STANDARDS
Linux.
NOTES
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
VOIR AUSSI
fusermount(1), mount.fuse(8)
TRADUCTION
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.
Pages du manuel de Linux 6.9.1 2 mai 2024 fuse(4)