Rating@Mail.ru

Форум сайта "Виртуальная энциклопедия "Linux по-русски"


Текущее время: 26 май 2017, 06:51

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: файловая система FUSE
Непрочитанное сообщениеДобавлено: 11 мар 2015, 10:03 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 9454
Откуда: Харьков
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?
Изображение


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: файловая система FUSE
Непрочитанное сообщениеДобавлено: 11 мар 2015, 10:40 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 9454
Откуда: Харьков
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 КБ]
Скачиваний: 264
Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: файловая система FUSE
Непрочитанное сообщениеДобавлено: 11 мар 2015, 10:58 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 9454
Откуда: Харьков
Linux 2.6.14 and up have FUSE support included in the official kernel.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: файловая система FUSE
Непрочитанное сообщениеДобавлено: 11 мар 2015, 17:41 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 9454
Откуда: Харьков
В новый каталог теперь накидано больше примеров.
Там же файл журнала 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 КБ]
Скачиваний: 267
Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: файловая система FUSE
Непрочитанное сообщениеДобавлено: 11 мар 2015, 18:02 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 9454
Откуда: Харьков
Olej писал(а):
В принципе, это и вправду очень простой способ написания собственной файловой системы, для какого-то специфического обслуживания, только вам ведомого, при этом ничего не нужно писать для ядра и в режиме ядра - всё в юзерспейс.

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


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


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: файловая система FUSE
Непрочитанное сообщениеДобавлено: 21 дек 2016, 15:40 
Не в сети
Писатель
Аватара пользователя

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


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: файловая система FUSE
Непрочитанное сообщениеДобавлено: 18 янв 2017, 10:58 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 9454
Откуда: Харьков
Olej писал(а):
Очень много новых устройств (фотоаппараты, диктофоны и др.) в последнее время используют FUSE.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB
[ Time : 0.035s | 17 Queries | GZIP : On ]