файловая система FUSE

Вопросы программного кода и архитектуры Linux

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 13503
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

файловая система FUSE

Непрочитанное сообщение Olej » 11 мар 2015, 10:03

FUSE - файловая система в пространстве пользователя.
Одна из важнейших особенностей, что для монтирования устройств FUSE н6е требуются root права.

Очень много новых устройств (фотоаппараты, диктофоны и др.) в последнее время используют FUSE.

Страница описания FUSE в документации ядра.
FUSE is a userspace filesystem framework. It consists of a kernel
module (fuse.ko), a userspace library (libfuse.*) and a mount utility
(fusermount).

One of the most important features of FUSE is allowing secure,
non-privileged mounts. This opens up new possibilities for the use of
filesystems. A good example is sshfs: a secure network filesystem
using the sftp protocol.
Страница FUSE Filesystem in Userspace с исходниками, документацией и примерами.
How does it work?

Аватара пользователя
Olej
Писатель
Сообщения: 13503
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: файловая система FUSE

Непрочитанное сообщение Olej » 11 мар 2015, 10:40

Olej писал(а): Страница FUSE Filesystem in Userspace с исходниками, документацией и примерами.
How does it work?
Их пример реализации элементарной ФС в менее 100 операторов в юзерспейс...

Код: Выделить всё

[Olej@modules fuse]$ make
gcc -Wall hello.c `pkg-config fuse --cflags --libs` -o hello
Package fuse was not found in the pkg-config search path.
Perhaps you should add the directory containing `fuse.pc'
to the PKG_CONFIG_PATH environment variable
No package 'fuse' found
hello.c:13:18: фатальная ошибка: fuse.h: Нет такого файла или каталога
 #include <fuse.h>
                  ^
компиляция прервана.
make: *** [all] Ошибка 1
Что и следовало ожидать: сама FUSE сейчас везде установлена, а вот средства разработки (*.h и т.д.) - нет, как и для большинства пакетов.
Нужно доустановить что-то типа такого:

Код: Выделить всё

[Olej@modules include]$ sudo yum install fuse-devel
...
Выполнено!
New leaves:
  fuse-devel.x86_64
Вот так это выглядит в работе: с монитрованием-размонтированием и т.д.:

Код: Выделить всё

[Olej@modules fuse]$ make
gcc -Wall hello.c `pkg-config fuse --cflags --libs` -o hello

[Olej@modules fuse]$ mkdir ./fuse

[Olej@modules fuse]$ ./hello fuse

[Olej@modules fuse]$ ls -l fuse
итого 0
-r--r--r--. 1 root root 13 янв  1  1970 hello

[Olej@modules fuse]$ cat fuse/hello
Hello World!

[Olej@modules fuse]$ fusermount -u fuse

[Olej@modules fuse]$ ls -l fuse
итого 0

[Olej@modules fuse]$ rmdir fuse
Вложения
fuse.tgz
(8.4 КБ) 339 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 13503
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: файловая система FUSE

Непрочитанное сообщение Olej » 11 мар 2015, 10:58

Linux 2.6.14 and up have FUSE support included in the official kernel.

т.е. FUSE уже весьма давно в составе официального ядра.

Аватара пользователя
Olej
Писатель
Сообщения: 13503
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: файловая система FUSE

Непрочитанное сообщение Olej » 11 мар 2015, 17:41

В новый каталог теперь накидано больше примеров.
Там же файл журнала fuse.hist, который показывает как эти примеры исполняются.
P.S. это я поспешил дополнить, поскольку вижу уже скачивания, а архив ещё далёк от своего окончательного вида.

В принципе, это и вправду очень простой способ написания собственной файловой системы, для какого-то специфического обслуживания, только вам ведомого, при этом ничего не нужно писать для ядра и в режиме ядра - всё в юзерспейс.

Не зря FUSE так полюбили производители всяких железных гаджетов! ;-)

How FUSE works
1. The fuse library.
When your user mode program calls fuse_main() (lib/helper.c),
fuse_main() parses the arguments passed to your user mode program,
then calls fuse_mount() (lib/mount.c).
fuse_mount() creates a UNIX domain socket pair, then forks and execs
fusermount (util/fusermount.c) passing it one end of the socket in the
FUSE_COMMFD_ENV environment variable.
fusermount (util/fusermount.c) makes sure that the fuse module is
loaded. fusermount then open /dev/fuse and send the file handle over a
UNIX domain socket back to fuse_mount().
fuse_mount() returns the filehandle for /dev/fuse to fuse_main().
fuse_main() calls fuse_new() (lib/fuse.c) which allocates the struct
fuse datastructure that stores and maintains a cached image of the
filesystem data.
Lastly, fuse_main() calls either fuse_loop() (lib/fuse.c) or
fuse_loop_mt() (lib/fuse_mt.c) which both start to read the filesystem
system calls from the /dev/fuse, call the usermode functions
stored in struct fuse_operations datastructure before calling
fuse_main(). The results of those calls are then written back to the
/dev/fuse file where they can be forwarded back to the system
calls.
2. The kernel module.
The kernel module consists of two parts. First the proc filesystem
component in kernel/dev.c -and second the filesystem system calls
kernel/file.c, kernel/inode.c, and kernel/dir.c
All the system calls in kernel/file.c, kernel/inode.c, and
kernel/dir.c make calls to either request_send(),
request_send_noreply(), or request_send_nonblock(). Most of the calls
(all but 2) are to request_send(). request_send() adds the request to,
"list of requests" structure (fc->pending), then waits for a response.
request_send_noreply() and request_send_nonblock() are both similar in
function to request_send() except that one is non-blocking, and the
other does not respond with a reply.
The proc filesystem component in kernel/dev.c responds to file io
requests to the file /dev/fuse. fuse_dev_read() handles the
file reads and returns commands from the "list of requests" structure
to the calling program. fuse_dev_write() handles file writes and takes
the data written and places them into the req->out datastructure where
they can be returned to the system call through the "list of requests"
structure and request_send().
В общем, "на пальцах", это должно быть понятно, и для своей файловой системы достаточно:
- определяем структуру таблицы файловых операций, своих реализующих функций, типа:

Код: Выделить всё

static struct fuse_operations oper = {
    .getattr    = ... ,
    .readdir    = ... ,
    .open       = ... ,
    .read       = ... ,
    ...
};  

- и вызываем:

Код: Выделить всё

fuse_main( argc, argv, &oper, NULL );
- и всё ... ваша файловая система закрутилась ;-)
Вложения
fuse.tgz
(18.37 КБ) 332 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 13503
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: файловая система FUSE

Непрочитанное сообщение Olej » 11 мар 2015, 18:02

Olej писал(а): В принципе, это и вправду очень простой способ написания собственной файловой системы, для какого-то специфического обслуживания, только вам ведомого, при этом ничего не нужно писать для ядра и в режиме ядра - всё в юзерспейс.

Не зря FUSE так полюбили производители всяких железных гаджетов! ;-)
Здесь вот: Filesystem in Userspace - для примера названы десятка 3 или 4 файловых систем всякого специального назначения. Думаю, что далеко не все ... из-за простоты таких упражнений. ;-)

Аватара пользователя
Olej
Писатель
Сообщения: 13503
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: файловая система FUSE

Непрочитанное сообщение Olej » 21 дек 2016, 15:40

Очень актуальный перевод в тему: Code Ninja: Создание файловой системы с помощью FUSE.
Это достаточное описание для создания своей собственной файловой системы на базе FUSE, используя язык Python (!).
Технология файловых систем в пространстве пользователя не предназначена для создания исключительно "игрушечных" файловых систем. Она на самом деле очень полезна, так как снижает барьер вхождения в процесс разработки и позволяет создавать свои собственные новые файловые системы даже не-разработчикам ядра Linux. Она также значительно упрощает распространение программных компонентов для поддержки новых файловых систем, так как разработчикам больше не приходится компилировать их в виде модулей ядра операционной системы.

Аватара пользователя
Olej
Писатель
Сообщения: 13503
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: файловая система FUSE

Непрочитанное сообщение Olej » 18 янв 2017, 10:58

Olej писал(а): Очень много новых устройств (фотоаппараты, диктофоны и др.) в последнее время используют FUSE.
Особенно это прямо просится для USB устройств, уже предлагаемых во множестве производителями, так и ваших собственных:
- для реализации собственно файловых операций в пространстве пользователя используются таблицы FUSE ...
- а для физических операций с самим устройством используете инструментарий libusb - тоже транзит операций в ядро из пространства пользователя...
- таким образом вся реализация ФС полностью делается в пространстве пользователя
- а скорость обработки, из-за передач ядро-пользователь и наоборот, для таких устройств не принципиально важно - это не такие быстрые устройства!

Аватара пользователя
Olej
Писатель
Сообщения: 13503
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: файловая система FUSE

Непрочитанное сообщение Olej » 14 ноя 2019, 17:14

Olej писал(а):
11 мар 2015, 18:02
Здесь вот: Filesystem in Userspace - для примера названы десятка 3 или 4 файловых систем всякого специального назначения. Думаю, что далеко не все ... из-за простоты таких упражнений. ;-)
Через FUSE в Linux (в стандартных репозиториях) реализована с 2015г. поддержка файловой системы exFAT Microsoft: ExFAT:

Код: Выделить всё

olej@ACER:~$ aptitude search exfat
i A exfat-fuse                                                             - read and write exFAT driver for FUSE                                            
i A exfat-utils                                                            - utilities to create, check, label and dump exFAT filesystem                     

Код: Выделить всё

olej@ACER:~$ aptitude show exfat-fuse
Пакет: exfat-fuse                                
Версия: 1.3.0-1
Состояние: установлен
Установлен автоматически: да
Приоритет: необязательный
Раздел: otherosfs
Сопровождающий: Sven Hoexter <hoexter@debian.org>
Архитектура: amd64
Размер в распакованном виде: 73,7 k
Зависит: libc6 (>= 2.14), libfuse2 (>= 2.6), fuse
Рекомендует: exfat-utils
Описание: read and write exFAT driver for FUSE
 fuse-exfat is a read and write driver implementing the extended file allocation table as a filesystem in userspace. A mounthelper is provided unter the name
 mount.exfat-fuse.
Домашняя страница: https://github.com/relan/exfat

Код: Выделить всё

olej@ACER:~$ ls /sbin/mount.exfat-fuse
/sbin/mount.exfat-fuse

Код: Выделить всё

olej@ACER:~$ /sbin/mount.exfat-fuse --help
FUSE exfat 1.3.0
/sbin/mount.exfat-fuse: invalid option -- '-'
Usage: /sbin/mount.exfat-fuse [-d] [-o options] [-V] <device> <dir>

Аватара пользователя
Olej
Писатель
Сообщения: 13503
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: файловая система FUSE

Непрочитанное сообщение Olej » 14 ноя 2019, 21:01

Olej писал(а):
14 ноя 2019, 17:14
Через FUSE в Linux (в стандартных репозиториях) реализована с 2015г. поддержка файловой системы exFAT Microsoft:
Чтобы не возвращаться к вопросу exFAT:
КАК ПРИМОНТИРОВАТЬ И ИСПОЛЬЗОВАТЬ EXFAT ДИСКИ В LINUX
ДЕКАБРЬ 19, 2015
ExFAT — это файловая система которая идеально подходит для флеш-накопителей и SD карт. Это как бы подобия FAT32, но без 4 ГБ ограничения на размер файла. Вы можете использовать ExFAT диски или же флеш накопители в Linux с полной поддержкой чтения и записи, но прежде всего вам нужно будет установить несколько пакетов которые добавят поддержку файловой системы ExFAT.
Как это делается:

Код: Выделить всё

sudo mkdir /media/exfat
sudo mount -t exfat /dev/sdc1 /media/exfat

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость