5分钟搞懂用户空间文件系统FUSE工作原理(用户空间和内核空间)

2023-03-10 21:34:16

 

fuse是什么?FUSE,implementing filesystems in user space,在用户空间实现文件系统简单讲,用户可通过fuse在用户空间来定制实现自己的文件系统为什么要有fuse?。

现存文件系统难以满足用户的特别需求,内核下定制开发文件系统难度较高,在用户空间可定制实现文件系统是有需求的并且,用户空间下调试工具丰富,出问题不会导致系统崩溃,开发难度相对较低,开发周期较短fuse工作原理。

完整的fuse功能包括a)用户态customize文件系统b)用户态fuse库(libfuse)c)内核支持(fs/fuse/*),共3层结构协作完成。

接下来,我会站在fuse文件系统使用者的角度,在encounter/solve模式下解释fuse的工作原理,假设开发者发布的基于fuse开发的文件系统名字为ZFUSE现在,/mnt/fuse目录已经挂载了ZFUSE。

作为使用者,准备在/mnt/fuse目录下创建第一个文件my.log

open系统调用进入kernel space,vfs层根据挂载点文件的操作函数对应到fuse_create_open问题1,既然在用户态实现文件系统,那么create代码怎么能在内核空间呢?fuse_create_open只是为了对接vfs,真正的处理代码仍然在用户空间实现。

问题2,目前已在内核空间,如何在用户空间处理?简单讲,在fuse_create_open内会创建一个包含FUSE_CREATE操作数的消息,将消息通过管道文件发送给管道另一端的用户态接收进程问题3,用户态接收进程?。

是的,该进程在ZFUSE挂载时由libfuse库代码中创建,作用是读取管道文件消息并根据消息的操作数来执行对应操作,在这里解析到的是FUSE_CREATE操作数,对应libfuse库中的fuse_lib_create函数。

问题4,目前ZFUSE做了什么?libfuse只是将操作接口与内核VFS做到一一对接,而真正完成操作的还是ZFUSE,在fuse_lib_create中会调用ZFUSE内定义的create函数问题5,为什么需要libfuse的接口?。

解耦合,简化ZFUSE开发假设ZFUSE不需要lseek操作,那么就不需要实现lseek操作,而我们无法控制用户的行为,这里用户是指ZFUSE文件系统的使用者假设用户在使用ZFUSE时进行了lseek操作,那么会先由libfuse提供的fuse_lib_lseek接口处理,libfuse发现ZFUSE没有实现lseek,就直接返回不支持此操作。

假设libfuse没有实现这层接口,那么ZFUSE就必须实现一个lseek接口,并且将里面的逻辑操作设置为直接返回不支持,这在设计上明显笨拙到这里,结合下图把过程再串一遍1)ZFUSE挂载到/mnt/fuse,libfuse会fork出后台进程,用于读取管道文件消息。

2)用户使用ZFUSE文件系统,创建文件my.log3)调用系统调用4)经VFS交由fuse处理5)fuse下的create处理,向管道发送带创建操作(FUSE_CREATE)的消息,当前进程A加入等待队列

6)libfuse下创建的后台进程读取到消息,解析操作数为FUSE_CREATE,对应到fuse_lib_create,即low level层接口7)fuse_lib_create中调用ZFUSE的上层接口zfuse.create,由ZFUSE来实现创建操作。

8)完成创建后,通过libfuse中的fuse_reply_create向管道发送完成消息从而唤醒之前加入等待队列的进程A9)进程A得到创建成功的消息,系统调用结束,/mnt/fuse/my.log文件创建成功


以上就是关于《5分钟搞懂用户空间文件系统FUSE工作原理(用户空间和内核空间)》的全部内容,本文网址:https://www.7ca.cn/baike/3523.shtml,如对您有帮助可以分享给好友,谢谢。
标签:
声明

排行榜