FUSE (File System in Userspace)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 16:39, 19 июля 2016.
FUSE
Полное название Filesystem in Userspace
Стабильная версия 2.9.2 / 16 October 2012; 3 years ago
Написанная C
Тип File system driver
Лицензия GPL for kernel part, LGPL for Libfuse, Simplified BSD on FreeBSD, ISC license on OpenBSD
Другие
Операционная система Unix-like
Веб-сайт github.com/libfuse/libfuse

FUSE (англ. Filesystem in Userspace - Файловая система в пользовательском пространстве) — это модуль для ядер UNIX-подобных операционных систем, с открытым исходным кодом и относящийся к свободному программному обеспечению.
Проект FUSE состоит из двух компонентов: предохранитель модуля ядра (поддерживается в обычных хранилищах ядра) и libfuse библиотеки (поддерживается пользовательское приложение в этом хранилище). libfuse обеспечивает эталонную реализацию для связи с модулем FUSE ядра.

История

Система FUSE была частью проекта A Virtual Filesystem (AVFS), но потом AVFS выделилась в собственный проект на SourceForge.net. FUSE был первоначально выпущен в соответствии с условиями GNU General Public License и GNU Lesser General Public License , а позже переписан как часть FreeBSD base system и выпущен в соответствии с условиями Simplified BSD license.

FUSE была официально включена в главное дерево кода Linux в версии 2.6.14[1]

Использование

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

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

Примеры использования

  • Wuala: представляет собой социальную распределенную файловую систему хранения информации в Интернете, которая позволяет пользователям Windows, Linux и Mac хранить файлы в Интернете.
  • WebDrive: представляет собой мощный и простой в использовании FTP-клиент, поддерживающий FTP, HTTP, WebDAV, SFTP, Amazon S3, SSL и SSH, а также позволяет вручную настраивать прокси-сервер, создавать временные файлы в указанной папке и многое другое.
  • Transmit: коммерческий FTP -клиент, который также добавляет возможность монтированная WebDAV, SFTP, FTP и Amazon S3.
  • ExpanDrive: коммерческая файловая система реализации SFTP / FTP / S3 / Swift с помощью FUSE.
  • GlusterFS: предоставляет доступ к удаленной файловой системе через SSH.
  • FTPFS: поддерживают доступ к протоколу передачи файлов сервер (FTP) через стандартные файловой системы интерфейсов прикладного программирования (API).
  • GmailFS: файловая система , которая хранит данные как почта в Gmail.
  • GVfs: виртуальная файловая система для рабочего стола GNOME.
  • EncFS: зашифрованная виртуальная файловая система.
  • NTFS-3G и Captive NTFS предоставляют доступ к файловой системе NTFS.
  • WikipediaFS: просмотр и редактирование статей Википедии , как если бы они были реальными файлами.
  • Sun Microsystems's Lustre: кластерная файловая система .
  • archivemount: файловая система основанная на FUSE для работы с любыми архивами (например, tar, tar.gz, tar.bz2) как с обычным каталогом.
  • Sector File System: распределенная файловая система, предназначенная для большого количества товарных компьютеров . Sector использует FUSE , чтобы обеспечить монтируемый локальный интерфейс файловой системы.
  • CloudStore: поддерживает инкрементную масштабируемость, репликацию, вычисление для целостности данных, на стороне клиента от сбоев и доступ из C ++, Java и Python.
  • MooseFS: распределенная отказоустойчивая файловая система с открытым исходным кодом.
  • GDFS: файловая система , которая позволяет монтировать свой ​​аккаунт Google Drive на Linux .

Достоинства

  1. Простой API;
  2. Простая установка (не требует патчить или перекомпилировать ядро);
  3. Безопасная реализация;
  4. Очень эффективный интерфейс Userspace — kernel;
  5. Для использования не требует привилегий root'а;
  6. Работает с ядрами Linux 2.4.X и 2.6.X;
  7. Развивается давно; обладает высокой стабильностью.

FAQ

Как я могу демонтировать файловую систему?

FUSE может быть демонтирована либо:

umount mountpoint

либо

fusermount -u mountpoint

В более поздних версиях не нужны корневые права доступа, если файловая система была установлена ​​пользователем, делающим размонтирование.

Почему система называется FUSE? Есть эмулятор ZX Spectrum под таким же названием Fuse.

Во время крещения системы, автор FUSE ( файловой системы) не слышал о Fuse (the Speccy emulator) . Автор FUSE (в файловой системе) также создал эмулятор Speccy под названием Spectemu .

Имя должно было быть умной аббревиатурой " Filesystem в USErspace" , но выбор оказался неудачный. С тех пор автор поклялся никогда не назвать проект от общего термина.

Можно ли установить FUSE c fstab?

Да, начиная с версии 2.4.0 это возможно. Файловая система должна придерживаться некоторых правил о параметрах командной строки, чтобы иметь возможность работать таким образом. Ниже приведен пример монтажа в SSHFS:

sshfs#user@host:/    /mnt/host    fuse    defaults    0 0

Монтаж осуществляется с помощью /sbin/mount.fuse вспомогательного скрипта.

Почему другие пользователи не имеют доступ к установленной файловой системе?

FUSE накладывает это ограничение в целях защиты процессов других пользователей от блуждающих в FUSE. Чтобы снять это ограничение для всех пользователей или только для корня, устанавливайте файловую систему с -oallow_other или -oallow_root. Некорневые пользователи могут только использовать эти опции монтирования , если user_allow_other указан в /etc/fuse.conf .

Какой метод вызывается системным вызовом Close() ?

flush() и, возможно, release(). Смотрите также комментарии в fuse_lowlevel.h

Не проще ли было бы если бы был один метод Close ()?

Нет, потому что отношения между Close() и выходным файлом не так просты, как люди, как правило, себе представляют. UNIX позволяет открывать файлы , чтобы приобрести несколько ссылок

  • после fork() два процесса относятся к тому же открытому файлу;
  • dup() и dup2() сделают еще один дескриптор, ссылающийся на один файл;
  • вызов mmap() обеспечивает отображение памяти относящейся к открытому файлу.

Это означает, что на один open(), может быть больше, чем один Close() и, возможно, munmap () вызовы , пока открытый файл не будет окончательно закрыт.

Могу ли я вернуть ошибку от release()?

Нет, это не возможно. Если вам нужно возвращать ошибки при закрытии, вы должны сделать flush() .

Как я узнаю, который flush() является последним перед release()?

Вы не узнаете. Все вызовы flush() должны обрабатываться одинаково. Общее исключение, когда участвует именованный канал. При строительстве именованного канала flush() будет происходить сразу после open().

Почему не открывается FUSE вперед произвольных вызовов ioctl ()?

Потому что это невозможно: данные , передаваемые ioctl() не имеет строго определенную длину и структуру , как read() и write() . Рассмотрите возможность использования getxattr () и setxattr () вместо этого.

Есть ли способ узнать, GID UID или PID процесса, выполняющего операцию?

Да, используйте fuse_get_context () функцию.

Как следует начинать темы?

Разные темы следует начинать с init().

Можно ли хранить указатель на личные данные в структуре fuse_file_info?

Да, fh поле для этой цели. Это поле может быть установлено на open() и create() методах, и доступен во всех других методах , имеющих - структуру fuse_file_info параметра. Обратите внимание, что изменение значения 'fh' в любом другом методе как open(), opendir () или create() не окажет никакого влияния.

Дополнительная информация

Примечания