Тип файловой системы fuse что это

Обновлено: 07.07.2024

Содержание

История

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

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

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

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

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

Достоинства

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

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

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

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

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

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

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

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

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

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

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

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

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() не окажет никакого влияния.

Разработчикам часто приходится иметь дело с файлами, представляющими из себя древовидную структуру: XML, JSON, YAML, всякого рода языки разметки вроде Markdown или Org-mode. Облегчая в общем и целом нашу жизнь, такие файлы имеют склонность к бесконтрольному росту, в какой-то момент из решения превращаясь в проблему.

Стандартное решение этой проблемы — разбиение на меньшие файлы. Это, конечно, работает, но не всегда удобно.

Но существует и альтернатива, о которой — ниже.

Пожалуй, стоит сначала изложить мою проблему. Я использую Емакс и — как многие пользователи Емакса — для написания почти всех моих документов, заметок, рабочего дневника и списков задач использую язык разметки org-mode. Выглядит документ в этой разметке примерно следующим образом:

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

И тогда мне в голову пришло, что было бы здорово ходить по моему файлу как по директориям, при помощи, скажем, стандартных в Юниксах cd headline1 или cd .. , ls -l и cat section .

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

Конечно, писать полноценную файловую систему для Линукса — дело долгое, неблагодарное и уж точно не стоит оно того в такого рода редких случаях.

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

С помощью FUSE было написано множество самых разных файловых систем, от игрушечных ФС, монтирующих, например, статьи с Википедии, до вполне серьезных частей современных Линуксов вроде того же Gnome. Таким образом, FUSE стал обязательным элементом популярных дистрибутивов.

Еще приятней работу с FUSE делает тот факт, что в наши дни доступны совсем уж тривиальные в использовании обертки на высокоуровневых языках вроде Python, Ruby, Java и многих других, т.е. собственную файловую систему можно сделать буквально за два-три часа.

Конкретно на Питоне оберток вокруг libfuse (клиентской части FUSE) даже несколько, но больше всего мне понравился проект fusepy: код проекта очень простой и понятный, кроме примеров на Гитхабе и исходного кода мне так ничего и не понадобилось.

Файловая система на базе fusepy сводится к переопределению методов класса fuse.Operations , каждый из которых соответствует какому-либо системному вызову.

Для непереопределенных системных вызовов есть либо разумное поведение по умолчанию, либо стандартная ошибка.

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

Дерево разбора (parse tree) файла разметки дальше преобразуется в другое дерево, отражающее файлы и директории, которые будет видеть пользователь файловой системы.

Чтобы работать с последним деревом было достаточно реализовать четыре системных вызовов ( open , read , readdir , getattr ), каждый из которых занимал буквально несколько строк кода на Питоне:

Итоговый скрипт работает примерно следующим образом:

Все это чудо занимает порядка двух сотен строк или 3-4 часа моей ленивой вечерней работы, с моей маленькой задачей справляется замечательно.

Инструкции по установке и код, как водится, можно найти Github.

Если кому интересно преращение прототипа во что-то удобоваримое, с возможностью редактирования файлов и поддержкой большего количества форматов — буду рад пообщаться.

FUSE (файловая система в пользовательском пространстве) — это простой интерфейс для программ пользовательского пространства для экспорта виртуальной файловой системы в ядро Linux. FUSE также стремится обеспечить безопасный метод для непривилегированных пользователей для создания и монтирования собственных реализаций файловой системы.

fusermount — это программа для монтирования и размонтирования файловых систем FUSE.

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

  • автоматическое монтирование флешек и внешних дисков при подключении к Linux
  • монтирование файловой системы Android при подключении к Linux
  • монтирование сетевой файловой системы SSHFS — обеспечивает доступ к файлам на удалённом компьютере по SSH

То есть FUSE позволяет выполнять монтирование без прав root.

Безопасность FUSE

В программе fusermount3 set-user-gid установлено на fuse. Это сделано для того, чтобы пользователи из группы fuse могли монтировать свои собственные реализации файловой системы. Однако должны быть некоторые ограничения, чтобы злоумышленник не делал неприятных вещей. В настоящее время эти ограничения:

  1. Пользователь может подключиться только к точке монтирования, для которой у него есть разрешение на запись.
  2. Точка монтирования не является sticky каталогом, который не принадлежит пользователю (как, например, /tmp).
  3. Никакой другой пользователь (включая root) не может получить доступ к содержимому смонтированной файловой системы.

Что такое файловая система fuseblk

При проверке файловых систем смонтированных дисков

вы можете обнаружить файловую систему с именем «fuseblk».


На скриншоте вы можете видеть, что у диска /dev/sdb4 тип файловой системы обозначен как «fuseblk». Но на самом деле это внешней диск с операционной системой Windows, то есть файловая система обозначена неточно. Дело в том, что данный диск смонтирован автоматически при подключении к Linux. Для монтирования использовалась FUSE и поэтому в качестве типа файловой системы указана fuseblk.

Как определить настоящую файловую систему если указана fuseblk

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


Теперь мы можем убедиться, что для раздела /dev/sdb4 настоящей файловой системой является «ntfs».

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


Как перемонтировать файловую систему fuseblk

Если вы хотите смонтировать диск самостоятельно, то с нужными вам опциями монтирования, то вам вначале необходимо отмонтировать его. Кстати, вы можете поменять поведение вашего дистрибутива и запретить ему автоматически монтировать диски. В современных дистрибутивах за автоматическое монтирование обычно отвечает графическое пользовательское окружение рабочего стола, то есть Cinnamon, GNOME, Xfce и так далее. Чтобы выполнить их настройку обратитесь к статье «Как отключить автоматическое открытие файлового менеджера после монтирования. Как отключить автоматическое монтирование дисков».

Для размонтирования диска, монтированного с помощью FUSE, можно использовать команду вида:

К примеру, у меня диск автоматически смонтирован в папку /run/media/mial/CA966DBC966DA9A1, тогда команда следующая:

Обратите внимание, что хотя FUSE и должна работать без прав суперпользователя, следующая команда без sudo является неправильной:

Она вызовет ошибку:

То есть размонтирование в любом случае нужно выполнять с sudo. Смотрите также «Что такое sudo».

Для монтирования вручную достаточно выполнить команды вида:

К примеру, создаём директорию /tmp/disk в качестве точки монтирования:

Как запустить программное обеспечение Windows в Linux

Советы и хитрости

Fuseblk — это блочный механизм на основе плавких предохранителей, то есть файловая система, основанная в пользовательском пространстве. Он используется для монтирования доступа пользователей без полномочий root для чтения и записи к разделам NTFS. FUSE — это технология файловой системы для пользовательского пространства. В него включены модуль ядра (fuse.ko), библиотека пользовательского пространства (libfuse. *) И инструменты монтирования (fusermount). Возможность безопасного монтирования без привилегий — одна из наиболее важных функций FUSE. Это расширяет спектр приложений для файловых систем. Sshfs, безопасная сетевая файловая система, основанная на протоколе sftp, является прекрасным примером этого. FUSE особенно полезен при создании виртуальных файловых систем.

Мы открыли оболочку терминала с помощью сочетания клавиш Ctrl + Alt + T. Вы можете открыть его, проверив приложения системы Ubuntu 20.04 Linux. Мы выполнили каждую реализацию и выполнение на терминале.

Это требуется перед обновлением установленных пакетов, поскольку система не может определить, содержит ли репозиторий новую редакцию пакета, пока у нее не будет текущая копия списка пакетов. Используйте команду ниже, чтобы получить обновления вашей системы.

Обновление может занять ваше драгоценное время. Чтобы смонтировать разделы жесткого диска в формате NTFS в системе Ubuntu 20.04 Linux, вам понадобится программный пакет «NTFS-3g». Это работает вместе с «предохранителем», но оба этих пакета почти наверняка установлены на вашем компьютере. Мы попробовали несколько дистрибутивов, и все они получили возможность монтировать тома NTFS из коробки, потому что эти компоненты уже были установлены. Для установки пакета программного обеспечения «ntfs-3g» в системе Ubuntu 20.04 Linux необходимо выполнить приведенную ниже инструкцию.

Установка снова займет несколько минут, в зависимости от скорости интернета в вашей системе. Вы можете использовать приведенные ниже примеры командной строки, чтобы смонтировать раздел в формате NTFS на машине после загрузки ntfs-3g или подтверждения того, что он уже загружен.

В результате вы получите информацию о дисковых устройствах, имеющихся в вашей системе. Теперь вам нужно указать путь, по которому вы хотите смонтировать предоставленный раздел. Для этого вам необходимо запустить приведенную ниже инструкцию в терминале системы Ubuntu 20.04 Linux.

Так может выглядеть самая простая команда монтирования. Ваш раздел NTFS должен быть смонтирован с правами чтения и записи. Большинству пользователей обычно просто нужно использовать эту команду. Теперь запустите приведенную ниже инструкцию в терминале системы Ubuntu 20.04 Linux.

Используйте команду mount, чтобы проверить монтирование и имеющиеся у него привилегии. Кроме того, вы можете использовать команду umount для размонтирования раздела NTFS в любой момент. Теперь выполните обе перечисленные команды для монтирования и размонтирования раздела NTFS.

$ sudo mount | grep ntfs
$ sudo umount /mnt/ntfs

Обязательно укажите тот же путь, который мы создали на предыдущем шаге.

Заключение

Читайте также: