Как мне реализовать драйвер драйвера файловой системы в Linux? [закрыто]

14

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

Как бы я реализовал этот драйвер файловой системы, это делается с помощью модуля ядра?

И как драйвер файловой системы может получить доступ к жесткому диску, должен ли драйвер файловой системы содержать код для доступа к жесткому диску, или в Linux есть драйвер устройства для доступа к жесткому диску, который используется всеми драйверами файловой системы?

user343344
источник

Ответы:

24

Да, файловые системы в Linux могут быть реализованы как модули ядра. Но есть также интерфейс FUSE (Файловая система в USErspace), который позволяет обычному процессу пользовательского пространства выступать в роли драйвера файловой системы. Если вы создаете прототип новой файловой системы, ее реализация вначале с использованием интерфейса FUSE может упростить тестирование и разработку. Как только внутренняя часть файловой системы будет разработана в форме FUSE, вы можете приступить к реализации оптимизированной по производительности версии модуля ядра.

Вот некоторая базовая информация о реализации файловой системы в пространстве ядра. Он довольно старый (с 1996 года!), Но это должно, по крайней мере, дать вам базовое представление о том, что вам нужно делать.

Если вы решите пойти по маршруту FUSE, вот libfuse, эталонная реализация пользовательской части интерфейса FUSE.

Драйвер файловой системы как модуль ядра

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

Когда файловая система монтируется, и либо тип файловой системы задается в соответствии с вашим драйвером, либо выполняется автоматическое определение типа файловой системы, слой Virtual FileSystem ядра (для краткости VFS) будет вызывать эту функцию. Он в основном говорит: «Вот указатель на представление уровня ядра стандартного блочного устройства Linux. Посмотрите на него, посмотрите, справится ли это с чем-то, а затем скажите мне, что вы можете с ним сделать».

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

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

Уровень VFS ожидает, что драйвер файловой системы сделает ряд стандартных функций доступными для уровня VFS; некоторые из них являются обязательными для того, чтобы слой VFS делал что-либо значимое с файловой системой, другие являются необязательными, и вы можете просто вернуть NULL вместо указателя на такую ​​дополнительную функцию.

Телком
источник
1
Это довольно хороший ответ, хотя, чтобы полностью ответить на вопрос, как указано, вам также нужно немного рассказать о функциональности, которую обеспечивает уровень блочных устройств для уровня файловой системы.
Касперд
Я как бы намекал на это с битом «вот указатель на стандартное блочное устройство», но это хороший момент; Я расширил это.
TelcoM
Этот ответ, а именно описание того, что происходит в каком порядке, является божественным. Есть ли какая-нибудь книга / веб-сайт, который я мог бы прочитать, у которого есть подобные описания для всего того, «как работает Linux»?
Адам Барнс
Возможно, вас заинтересуют внутренние компоненты ядра Linux или драйверы устройств Linux, 3-е издание . И, конечно же, есть возможность чтения самого исходного кода.
Телеком
5

Да, драйвер ядра может управлять файловой системой.

Лучшее решение для создания прототипа файловой системы - использование FUSE. И после вы можете подумать о преобразовании его в драйвер ядра.

Википедия => https://en.wikipedia.org/wiki/Filesystem_in_Userspace

Источник => https://github.com/libfuse/libfuse

учебник => https://developer.ibm.com/articles/l-fuse/

EchoMike444
источник
0

Да, это обычно делается с использованием драйвера ядра, который может быть загружен как модуль ядра или скомпилирован в ядро.

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

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

Erik
источник
0

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

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

И да, в ядре уже есть драйверы для аппаратного обеспечения, вы их не реализуете заново.

Ctrl-Alt-Делор
источник
У FUSE есть и большие недостатки, кроме производительности: его трудно использовать для корневой файловой системы. (Возможно, это возможно с помощью initrd, но двоичный файл FUSE не может быть освобожден после загрузки, поскольку он все еще будет выполняться с
Питер Кордес
1
@PeterCordes Он не может быть освобожден , но это не значит, что его нельзя связать. Если на него все еще есть ссылка, она будет сохранена в памяти независимо от того, оставили ли вы initramfs и удалили базовый двоичный файл.
лес
@forest: правильно, поэтому вы не можете размонтировать initrd после pivot_root, потому что в initramfs все еще заняты inode.
Питер Кордес
Нормальный /initзапуск с initramfs будет (я думаю) /initвыполнится после pivot_root, чтобы передать управление настоящим корневым FS /init. Но двоичный файл FUSE не может заменить себя execve, если доступ к корневой FS зависел от процесса FUSE, отвечающего ядру. Ну, может быть, сначала загрузив кеш страниц, но это не звучит надежно.
Питер Кордес