Android之FUSE文件系统

一、FUSE简介

fuse是什么?

FUSE(Filesystem in Userspace),是一种用户空间文件系统。用户可以通过FUSE文件系统操作内卡。FUSE主要实现代码位于用户空间中,而不需要重新编译到内核,用户空间开发者可以通过FUSE的接口直接访问内核空间,不需要了解文件系统的内幕和内核模块编程的知识,这给用户空间开发者带来了众多便利。简单讲,用户可通过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.log

3)调用系统调用

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向管道发送完成消息从而唤醒之前加入等待队列的进程A

9)进程A得到创建成功的消息,系统调用结束,/mnt/fuse/my.log文件创建成功

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值