use*_*344 18 linux filesystems drivers
假设我发明了一个新的文件系统,现在我想为它创建一个文件系统驱动程序。
我将如何实现这个文件系统驱动程序,这是使用内核模块完成的吗?
文件系统驱动程序如何访问硬盘,文件系统驱动程序应该包含访问硬盘的代码,还是Linux包含所有文件系统驱动程序使用的访问硬盘的设备驱动程序?
tel*_*coM 26
是的,Linux 中的文件系统可以实现为内核模块。但是还有 FUSE(用户空间中的文件系统)接口,它可以允许常规用户空间进程充当文件系统驱动程序。如果您正在对新文件系统进行原型设计,首先使用 FUSE 接口实现它可以使测试和开发更容易。一旦您以 FUSE 形式解决了文件系统的内部结构,您就可以开始实施性能优化的内核模块版本。
这里有一些关于在内核空间内实现文件系统的基本信息。它相当古老(从 1996 年开始!),但这至少应该让您对需要做的事情有一个基本的了解。
如果选择走 FUSE 路线,这里是 libfuse,FUSE 接口的用户空间端的参考实现。
基本上,文件系统驱动程序模块的初始化函数只需要调用一个register_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/