目录
fuse
引入
介绍
机制
远端服务的文件系统挂载到本地
自定义文件系统
调用流程
fuse内核驱动
用户态文件系统
梳理
fuse
引入
因为用户空间的需求多样,而内核提供的功能固定单一,所以为了迎合用户的需求,就需要引入用户空间驱动的概念
- 开发者可以通过编写用户空间驱动来支持需要的特性
介绍
是一种在用户空间实现文件系统的机制,允许开发人员创建自定义文件系统而无需修改内核代码
fuse通过在用户空间中运行文件系统的逻辑来实现文件系统的操作,而不是依赖于内核模块
- fuse是基于用户空间驱动实现的,编写和运行都类似于普通的用户程序
- 而内核驱动是使用了内核中的函数和头文件,以内核模块的形式,编译到内核空间中,然后通过insmod和rmmod手动加载和卸载
- 所以,使用用户空间驱动,可以更灵活地编写和运行底层功能
机制
远端服务的文件系统挂载到本地
如果我们想要让远端的某个服务挂在到本地的文件系统里,想像访问本地文件一样访问远端存储文件
- 我们可以实现一个用户空间的fuse驱动,将远端文件系统挂载到本地某个目录下,
- 就可以在该目录里,访问远端文件了
自定义文件系统
也可以自主实现一个fuse用户空间驱动,来满足业务上的需求
- 这种自定义文件系统可以根据业务需求实现各种特定功能,如加密、压缩、版本控制等。
- 这个fuse驱动程序可以通过与用户态应用程序的交互,实现对文件系统的各种操作,并将这些操作转换为对底层存储的相应操作
调用流程
- 利用原本内核中的vfs文件系统框架,将针对fuse文件系统的请求发给fuse驱动
- 然后内核驱动发给基于fuse library实现的fuse用户空间驱动(fuse守护进程),该驱动来实际处理用户请求
- 最后将结果通过原路径返回给用户
fuse内核驱动
用户态文件系统
指文件内容和文件属性都是由用户态的进程提供的(守护进程),也就是这里的fuse用户空间驱动
(每个用户空间驱动的实现方式都不同,这里的fuse依赖的是libfuse库)
梳理
普通的访问本地文件系统,步骤很少
- 只需要经历vfs的转发,去访问实际的文件系统类型
- 然后实际的文件系统类型(如EXT4、NTFS等)收到请求后,会执行相应的操作
但如果要访问用户态文件系统,需要经历更多的路径,以及更多的内核态和用户态之间的切换
- 它虽然也同样被vfs转发到fuse的内核驱动中,但它的下一步并不是交给他就行了,而是需要转发给用户态的fuse驱动,它去进行实际的操作
- 而它的操作相当于就是一次访问本地文件系统
- 所以,它多了很多中间步骤
- 虽然增加了文件操作的自由性(因为是由我们去自主定义文件操作)
- 但因此失去的性能也不容小觑: