FUSE是什么?
FUSE(filesystem in userspace)是一个用户态文件系统框架。由内核模块(fuse.ko)、用户态库(libfuse.*)和挂载工具组成(fusermount)
fuse最重要的特性是fuse可以允许安全、非特权挂载
名词解释
- 用户态文件系统:由普通用户态进程提供数据和元数据的文件系统。该文件系统能被内核接口正常访问
- 文件系统daemon:提供文件系统数据和元数据的进程
- 文件系统连接:在文件系统daemon和内核之间的连接。该连接将会一直存在,直到daemon终止或者文件系统取消挂载。(detaching不会打破这样的连接,会知道最后一个引用被释放)
为什么需要FUSE?
文件系统通常工作在内核态,而fuse允许文件系统在用户态实现,这使得文件系统实现更加灵活
- 普通用户可以加载和挂载文件系统。比如用于网络访问,用于浏览存档文件,用于移动媒体
- FUSE崩溃不会影响内核
- 更快编程
- 部署更快。因为不需要管理员干预来安装它们,也因为它们可以轻松地在支持的操作系统之间移植
- 没有与与内核静态链接相关的许可问题
但内核态文件系统还是有很多优点
- 可以用于引导介质(实现FUSE文件系统的程序必须从某处加载)。
- 更健壮,因为不会因为进程崩溃或被错误终止而消失。
- 稍微快一些。
怎么工作的呢?
对于挂载hello程序实现的fuse在/tmp/fuse,执行ls -l /tmp/fuse
会发生以下过程
- IO请求经过VFS传递给内核FUSE文件系统模块
- FUSE将请求转发给用户态的hello程序进行处理。处理完毕后,响应沿原路返回
其中内核fuse.ko用于承接vfs下来的IO请求,封装成FUSE数据包转发给用户态中libfuse进行解析转给hello程序。
Ref
- https://www.kernel.org/doc/html/latest/filesystems/fuse.html
- https://unix.stackexchange.com/questions/4146/what-are-the-benefits-and-downsides-to-use-fusefs-filesystems
- https://en.wikipedia.org/wiki/Filesystem_in_Userspace
- https://xie.infoq.cn/article/655c0893ed150ff65f2b7a16f
- https://www.a-programmer.top/2021/10/05/FUSE%E4%BB%8B%E7%BB%8D/