| fuse(4) | Device Drivers Manual | fuse(4) |
fuse - dispozitiv cu sistem de fișiere în spațiul utilizatorului („Filesystem in Userspace”: FUSE)
#include <linux/fuse.h>
Acest dispozitiv este interfața principală dintre controlorul sistemului de fișiere FUSE și un proces din spațiul utilizatorului care dorește să furnizeze sistemul de fișiere (denumit în restul acestei pagini de manual demon de sistem de fișiere). Această pagină de manual este destinată celor interesați să înțeleagă interfața nucleului în sine. Cei care implementează un sistem de fișiere FUSE pot dori să utilizeze o bibliotecă din spațiul utilizatorului, cum ar fi libfuse, care abstractizează interfața de nivel scăzut.
În esența sa, FUSE este un protocol client-server simplu, în care nucleul Linux este clientul, iar demonul este serverul. După obținerea unui descriptor de fișier pentru acest dispozitiv, demonul poate read(2) cereri de la acel descriptor de fișier și se așteaptă să write(2) înapoi răspunsurile sale. Este important de reținut că un descriptor de fișier este asociat cu un sistem de fișiere FUSE unic. În special, deschiderea unei a doua copii a acestui dispozitiv, nu va permite accesul la resursele create prin intermediul primului descriptor de fișier (și viceversa).
Fiecare mesaj citit de daemon începe cu un antet descris de următoarea structură:
struct fuse_in_header {
uint32_t len; /* Lungimea totală a datelor,
inclusiv acest antet */
uint32_t opcode; /* Tipul de operație (a se vedea mai jos) */
uint64_t unique; /* Un identificator unic pentru această cerere */
uint64_t nodeid; /* ID-ul obiectului sistemului de fișiere
asupra căruia se operează */
uint32_t uid; /* UID-ul procesului solicitant */
uint32_t gid; /* GID-ul procesului solicitant */
uint32_t pid; /* PID-ul procesului solicitant */
uint32_t padding;
};
Antetul este urmat de o porțiune de date de lungime variabilă (care poate fi goală) specifică operației solicitate (operația solicitată este indicată prin opcode).
Demonul ar trebui apoi să proceseze cererea și, dacă este cazul, să trimită un răspuns (aproape toate operațiile necesită un răspuns; dacă nu, acest lucru este documentat mai jos), prin efectuarea unui write(2) către descriptorul de fișier. Toate răspunsurile trebuie să înceapă cu următorul antet:
struct fuse_out_header {
uint32_t len; /* Lungimea totală a datelor scrise
în descriptorul de fișier */
int32_t error; /* Orice eroare apărută (0 dacă nu există) */
uint64_t unique; /* Valoarea din cererea
corespondentă */
};
Acest antet este urmat, de asemenea, de date de dimensiune variabilă (potențial goale) în funcție de cererea executată. Cu toate acestea, dacă răspunsul este un răspuns de eroare (și anume, error este configurată), atunci nu trebuie trimise alte date utile, independent de cerere.
Această secțiune ar trebui să conțină documentația pentru fiecare dintre mesajele din protocol. Această pagină de manual este în prezent incompletă, astfel încât nu toate mesajele sunt documentate. Pentru fiecare mesaj, este prezentată mai întâi structura trimisă de nucleu, urmată de o descriere a semanticii mesajului.
struct fuse_init_in {
uint32_t major;
uint32_t minor;
uint32_t max_readahead; /* Începând cu protocolul v7.6 */
uint32_t flags; /* Începând cu protocolul v7.6 */
};
struct fuse_init_out {
uint32_t major;
uint32_t minor;
uint32_t max_readahead; /* Începând cu v7.6 */
uint32_t flags; /* Începând cu v7.6; unii biți de
fanioane au fost introduși târziu */
uint16_t max_background; /* Începând cu v7.13 */
uint16_t congestion_threshold; /* Începând cu v7.13 */
uint32_t max_write; /* Începând cu v7.5 */
uint32_t time_gran; /* Începând cu v7.6 */
uint32_t unused[9];
};
struct fuse_getattr_in {
uint32_t getattr_flags;
uint32_t dummy;
uint64_t fh; /* Definit doar dacă
(getattr_flags & FUSE_GETATTR_FH)
};
struct fuse_attr_out {
/* Durata cache-ului de atribute (secunde + nanosecunde) */
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; /* Fanioanele care au fost transmise
către 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-ul nodului-i */
uint64_t generation; /* Generarea nodului-i */
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;
};
Linux.
Următoarele mesaje nu sunt încă documentate în această pagină de manual:
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
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>
Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.
Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.
| 2 mai 2024 | Pagini de manual de Linux 6.9.1 |