Да, файловые системы в Linux могут быть реализованы как модули ядра. Но есть также интерфейс FUSE (Файловая система в USErspace), который позволяет обычному процессу пользовательского пространства выступать в роли драйвера файловой системы. Если вы создаете прототип новой файловой системы, ее реализация вначале с использованием интерфейса FUSE может упростить тестирование и разработку. Как только внутренняя часть файловой системы будет разработана в форме FUSE, вы можете приступить к реализации оптимизированной по производительности версии модуля ядра.
Вот некоторая базовая информация о реализации файловой системы в пространстве ядра. Он довольно старый (с 1996 года!), Но это должно, по крайней мере, дать вам базовое представление о том, что вам нужно делать.
Если вы решите пойти по маршруту FUSE, вот libfuse, эталонная реализация пользовательской части интерфейса FUSE.
Драйвер файловой системы как модуль ядра
По сути, функция инициализации модуля драйвера вашей файловой системы должна просто вызвать register_filesystem()
функцию и дать ей в качестве параметра структуру, включающую указатель функции, который идентифицирует функцию в драйвере вашей файловой системы, которая будет использоваться в качестве первого шага при идентификации вашей файловой системы. введите и установите его. На этом этапе больше ничего не происходит.
Когда файловая система монтируется, и либо тип файловой системы задается в соответствии с вашим драйвером, либо выполняется автоматическое определение типа файловой системы, слой Virtual FileSystem ядра (для краткости VFS) будет вызывать эту функцию. Он в основном говорит: «Вот указатель на представление уровня ядра стандартного блочного устройства Linux. Посмотрите на него, посмотрите, справится ли это с чем-то, а затем скажите мне, что вы можете с ним сделать».
В этот момент ваш драйвер должен прочитать все, что ему нужно, чтобы убедиться, что это правильный драйвер для файловой системы, а затем вернуть структуру, содержащую указатели для дополнительных функций, которые ваш драйвер может выполнять с этой конкретной файловой системой. Или, если драйвер файловой системы не распознает данные на диске, он должен вернуть соответствующий результат ошибки, а затем VFS либо сообщит о сбое в пространство пользователя, либо - если выполняется автоматическое определение типа файловой системы - запросит другую файловую систему. Драйвер попробовать.
Другие драйверы в ядре будут обеспечивать стандартный интерфейс блочного устройства, поэтому драйверу файловой системы не потребуется реализовывать аппаратную поддержку. По сути, драйвер файловой системы может читать и записывать дисковые блоки, используя стандартные функции уровня ядра, с указанием указателя устройства.
Уровень VFS ожидает, что драйвер файловой системы сделает ряд стандартных функций доступными для уровня VFS; некоторые из них являются обязательными для того, чтобы слой VFS делал что-либо значимое с файловой системой, другие являются необязательными, и вы можете просто вернуть NULL вместо указателя на такую дополнительную функцию.
Да, драйвер ядра может управлять файловой системой.
Лучшее решение для создания прототипа файловой системы - использование FUSE. И после вы можете подумать о преобразовании его в драйвер ядра.
Википедия => https://en.wikipedia.org/wiki/Filesystem_in_Userspace
Источник => https://github.com/libfuse/libfuse
учебник => https://developer.ibm.com/articles/l-fuse/
источник
Да, это обычно делается с использованием драйвера ядра, который может быть загружен как модуль ядра или скомпилирован в ядро.
Вы можете проверить похожие драйверы файловой системы и узнать, как они работают здесь .
Эти драйверы, вероятно, используют внутренние функции ядра для доступа к устройствам хранения в виде блоков байтов, но вы также можете использовать блочные устройства, представленные драйверами в папках блочных устройств и символьных устройств .
источник
Вы можете использовать fuse, чтобы создать пользовательскую файловую систему или написать модуль ядра. Это проще сделать с помощью fuse, так как у вас есть выбор языков, и вы не будете разбивать ядро (и, следовательно, всю систему).
Модули ядра могут быть быстрее, но первое правило оптимизации таково: не делайте этого, пока не протестируете рабочий код. Второе похоже на это: не делайте этого, пока у вас нет доказательств того, что это слишком медленно. И третье: не храните его, если у вас нет доказательств того, что оно делает его быстрее / меньше.
И да, в ядре уже есть драйверы для аппаратного обеспечения, вы их не реализуете заново.
источник
pivot_root
, потому что в initramfs все еще заняты inode./init
запуск с initramfs будет (я думаю)/init
выполнится после pivot_root, чтобы передать управление настоящим корневым FS/init
. Но двоичный файл FUSE не может заменить себя execve, если доступ к корневой FS зависел от процесса FUSE, отвечающего ядру. Ну, может быть, сначала загрузив кеш страниц, но это не звучит надежно.