fuse(4) | Device Drivers Manual | fuse(4) |
fuse - устройство файловой системы в пользовательском пространстве (FUSE)
#include <linux/fuse.h>
Это устройство является основным интерфейсом между драйвером файловой системы FUSE и процессом в пользовательском пространстве, который будет предоставлять файловую систему (далее здесь называется службой файловой системы (filesystem daemon)). Данная справочная страница предназначена тому, кто заинтересован в понимании интерфейса самого ядра. Тем, кто реализует файловую систему FUSE, важнее описание библиотеки пользовательского пространства такой как libfuse, которая скрывает низкоуровневый интерфейс.
В основе FUSE лежит простой клиент-серверный протокол, в котором ядро Linux является клиентом, а служба — сервером. После получения файлового дескриптора этого устройства, служба может читать запросы с помощью read(2) из этого файлового дескриптора и писать ответы с помощью write(2). Важно отметить, что данный файловый дескриптор, связанный с файловой системой FUSE, является индивидуальным. В частности, открытие второй копии этого устройства не даст доступ к ресурсам, созданным через первый файловый дескриптор (и наоборот).
Каждое сообщение, читаемое службой, начинается с заголовка следующей структуры:
struct fuse_in_header {
uint32_t len; /* общая длина данных,
включая этот заголовок */
uint32_t opcode; /* тип операции (смотрите ниже) */
uint64_t unique; /* уникальный идентификатор этого запроса */
uint64_t nodeid; /* ID объекта файловой системы, с
которым выполняется действие */
uint32_t uid; /* UID запрашивающего процесса */
uint32_t gid; /* GID запрашивающего процесса */
uint32_t pid; /* PID запрашивающего процесса */
uint32_t padding; };
После заголовка располагаются данные произвольной длины (их может и не быть), используемые вместе с запрашиваемой операцией (запрашиваемая операция указывается в opcode).
Служба обрабатывает запрос и, если нужен ответ (почти все операции требуют ответа; если нет, то это описано далее), выполняет запись с помощью write(2) в файловый дескриптор. Все ответы должны начинаться со следующего заголовка:
struct fuse_out_header {
uint32_t len; /* общая длина данных, записываемых
в файловый дескриптор */
int32_t error; /* возникшая ошибка (0, если нет) */
uint64_t unique; /* значение из
соответствующего запроса */ };
После этого заголовка также располагаются данные произвольной длины (возможно их отсутствие), в зависимости от запроса. Однако, если ответ является ответом, содержащим ошибку, (т. е., error не равно нулю), то дополнительных данных посылаться не должно, независимо от запроса.
В этом разделе должна быть документация по каждому сообщению протокола. Данная справочная страница не закончена, поэтому описаны не все сообщения. Для каждого сообщения сначала приводится структура, посылаемая ядром, после чего описывается семантика сообщения.
struct fuse_init_in {
uint32_t major;
uint32_t minor;
uint32_t max_readahead; /* начиная с протокола v7.6 */
uint32_t flags; /* начиная с протокола v7.6 */ };
struct fuse_init_out {
uint32_t major;
uint32_t minor;
uint32_t max_readahead; /* Начиная с v7.6 */
uint32_t flags; /* Начиная с v7.6; некоторые биты флагов были введены позднее */
uint16_t max_background; /* Начиная с v7.13 */
uint16_t congestion_threshold; /* Начиная с v7.13 */
uint32_t max_write; /* Начиная с v7.5 */
uint32_t time_gran; /* Начиная с v7.6 */
uint32_t unused[9]; };
struct fuse_getattr_in {
uint32_t getattr_flags;
uint32_t dummy;
uint64_t fh; /* задаётся, только если
(getattr_flags & FUSE_GETATTR_FH) };
struct fuse_attr_out {
/* срок хранения атрибута в кэше (секунды + наносекунды) */
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; /* флаги, передаваемые
в 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; /* идентификатор inode */
uint64_t generation; /* поколение inode */
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; };
Файловая система FUSE есть только в Linux.
Следующие сообщения пока не документированы в этой справочной странице:
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
Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
5 февраля 2023 г. | Linux man-pages 6.03 |