Man page - fuse(4)

Packages contains this manual

Available languages:

en fr ru ro

Manual

fuse

NOM
SYNOPSIS
DESCRIPTION
Protocole de base
Messages échangées
ERREURS
STANDARDS
NOTES
VOIR AUSSI
TRADUCTION

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 .