Answers:
是的,Linux中的文件系统可以实现为内核模块。但是,还有FUSE(USErspace中的文件系统)接口,该接口可以允许常规的用户空间进程充当文件系统驱动程序。如果要对新文件系统进行原型制作,则首先使用FUSE接口对其进行实施可以使测试和开发更加容易。一旦以FUSE形式解决了文件系统的内部问题,然后就可以开始实现其性能优化的内核模块版本。
这是有关在内核空间中实现文件系统的一些基本信息。它已经很老了(从1996年开始!),但这至少应该使您对需要做的事情有一个基本的了解。
如果您选择进入保险丝路线, 这里为libfuse,它是FUSE接口的用户空间端的参考实现。
基本上,文件系统驱动程序模块的初始化函数只需要调用一个register_filesystem()
函数,并将其作为参数提供一个结构,该结构包含一个函数指针,该指针标识文件系统驱动程序中的函数,这将用作标识文件系统的第一步。键入并安装。在此阶段没有任何事情发生。
挂载文件系统时,或者指定文件系统类型以匹配您的驱动程序,或者正在执行文件系统类型自动检测时,内核的虚拟文件系统(简称VFS)层将调用该函数。它基本上说:“这里是一个指向标准Linux块设备的内核级表示的指针。请看一下它,看看它是否可以处理,然后告诉我可以使用它做什么。”
到那时,您的驱动程序应该读取所需的内容以验证它是文件系统的正确驱动程序,然后返回一个结构,该结构包含指向该驱动程序可以对该特定文件系统执行的其他功能的指针。或者,如果文件系统驱动程序无法识别磁盘上的数据,则应该返回适当的错误结果,然后VFS将向用户空间报告故障,或者-如果正在执行文件系统类型自动检测-将会询问另一个文件系统司机试试。
内核中的其他驱动程序将提供标准的块设备接口,因此文件系统驱动程序将不必实现硬件支持。基本上,文件系统驱动程序可以使用标准的内核级功能以及为其指定的设备指针来读写磁盘块。
VFS层希望文件系统驱动程序为VFS层提供许多标准功能。为了使VFS层对文件系统做任何有意义的事情,其中一些是必需的,其他则是可选的,您可以仅返回NULL来代替指向此类可选功能的指针。
是的,内核驱动程序可以管理文件系统。
模拟文件系统原型的最佳解决方案是使用FUSE。然后您可以考虑将其转换为内核驱动程序。
Wikipedia => https://zh.wikipedia.org/wiki/Filesystem_in_Userspace
您可以使用保险丝来制作用户级文件系统或编写内核模块。由于可以选择多种语言,因此使用保险丝比较容易,并且不会使内核(因此也不会导致整个系统)崩溃。
内核模块可以更快,但是优化的第一条规则是:在测试了工作代码之前不要这样做。第二个是这样的:不要做它,直到有证据证明它太慢为止。第三:除非有证据表明它会使速度更快/更小,否则不要保留它。
是的,内核已经具有用于硬件的驱动程序,您无需重新实现它们。
pivot_root
,因为initramfs中仍然有繁忙的inode。
/init
从initramfs开始的法线(在我看来)将/init
在ivot_root之后执行,以将控制权转移到真正的根FS /init
。但是,如果对根FS的访问取决于响应内核的FUSE进程,则FUSE二进制文件无法用execve代替自身。好吧,也许可以先启动页面缓存,但这听起来并不可靠。