如何在Linux中实现文件系统驱动程序驱动程序?

如何在Linux中实现文件系统驱动程序驱动程序?

假设我发明了一个新的文件系统,现在我想为其创建一个文件系统驱动程序。

我将如何实现这个文件系统驱动程序,这是使用内核模块完成的吗?

文件系统驱动程序如何访问硬盘,文件系统驱动程序是否应该包含访问硬盘的代码,或者Linux是否包含一个设备驱动程序来访问所有文件系统驱动程序都使用的硬盘?

答案1

是的,Linux 中的文件系统可以作为内核模块来实现。但还有 FUSE(USERspace 中的文件系统)接口,它可以允许常规用户空间进程充当文件系统驱动程序。如果您正在设计一个新的文件系统原型,首先使用 FUSE 接口实现它可以使测试和开发变得更容易。一旦您以 FUSE 形式解决了文件系统的内部问题,您就可以开始实现其性能优化的内核模块版本。

以下是有关在内核空间中实现文件系统的一些基本信息。它相当旧(从 1996 年开始!),但这至少应该让您对需要做的事情有一个基本的了解。

如果您选择走FUSE路线,这是 libfuse,FUSE 接口的用户空间端的参考实现。

作为内核模块的文件系统驱动程序

基本上,文件系统驱动程序模块的初始化函数只需要调用一个register_filesystem()函数,并为其提供一个结构作为参数,该结构包含一个函数指针,该指针标识文件系统驱动程序中的函数,该函数将用作识别文件系统的第一步键入并安装它。在此阶段不会再发生任何事情。

当安装文件系统时,或者指定文件系统类型以匹配您的驱动程序,或者正在执行文件系统类型自动检测时,内核的虚拟文件系统(简称 VFS)层将调用该函数。它基本上是说“这是一个指向标准 Linux 块设备的内核级表示的指针。看一下它,看看它是否是您可以处理的东西,然后告诉我您可以用它做什么。”

此时,您的驱动程序应该读取所​​需的任何内容,以验证它是文件系统的正确驱动程序,然后返回一个结构,其中包含指向您的驱动程序可以对该特定文件系统执行的进一步功能的指针。或者,如果文件系统驱动程序无法识别磁盘上的数据,则应该返回适​​当的错误结果,然后 VFS 将向用户空间报告故障,或者 - 如果正在执行文件系统类型自动检测 - 将询问另一个文件系统司机尝试一下。

内核中的其他驱动程序将提供标准块设备接口,因此文件系统驱动程序无需实现硬件支持。基本上,文件系统驱动程序可以使用标准内核级函数和提供给它的设备指针来读取和写入磁盘块。

VFS层期望文件系统驱动程序为VFS层提供许多标准功能;其中一些是强制性的,以便 VFS 层对文件系统执行任何有意义的操作,其他是可选的,您可以返回 NULL 来代替指向此类可选函数的指针。

答案2

是的,内核驱动程序可以管理文件系统。

模拟、原型化文件系统的最佳解决方案是使用 FUSE。然后就可以考虑将其改造为内核驱动程序。

维基百科=> https://en.wikipedia.org/wiki/Filesystem_in_Userspace

来源=>https://github.com/libfuse/libfuse

教程 =>https://developer.ibm.com/articles/l-fuse/

答案3

是的,这通常是使用内核驱动程序来完成的,该驱动程序可以作为内核模块加载或编译到内核中。

您可以查看类似的文件系统驱动程序及其工作原理这里

这些驱动程序可能使用内部内核函数以字节块的形式访问存储设备,但您也可以使用驱动程序中公开的块设备块设备字符设备文件夹。

答案4

您可以使用熔断器来创建用户态文件系统,或编写内核模块。使用熔断器更容易做到,因为您可以选择语言,并且不会使内核(以及整个系统)崩溃。

内核模块可以更快,但优化的首要规则是:在测试了工作代码之前不要这样做。第二个是这样的:在有证据表明它太慢之前不要这样做。第三:不要保留它,除非你有证据表明它可以使它更快/更小。

是的,内核已经有硬件的驱动程序,你不需要重新实现它们。

相关内容