- 什么是FUSE?
用户空间的文件系统:Filesystem in USErspace。
在用户空间实现一个文件系统有以下好处:
-
用户态的开发简单便捷,调试方便。不会导致系统panic。
-
可以使用任何语言开发,perl/python/...
-
stackable,可以在已有文件系统的基础上实现更多功能(deduplication或compression。。。)
-
快速验证新想法,prototype
-
绕开license的限制等,比如把zfs、ntfs移植到其它系统上。
-
- FUSE的工作原理和组成
-
组成:内核FUSE模块;FUSE library;用户空间FS。
-
基本原理:
-
一个新文件系统的基本逻辑都是在用户空间实现的;
-
内核空间FUSE模块实现了fuse/fusblk 文件系统和fuse character driver。fuse FS实现了VFS的接口,应用程序可以像访问任何一个文件系统一样访问fuse的文件。但是,fuse更像是一个proxy文件系统。应用程序对文件的操作都被fuse转发给了userspace FS。
-
kernel fuse和fuse library之间在文件系统mount时就建立起了通信用的channel,并且创建daemon。kernel和daemon通过FUSE的通信协议交换数据。
-
本质上,FUSE是一种client/server模型。Userspace daemon是server,而kernel fuse模块是client。kernel fuse将文件的操作请求转发给daemon,daemon会调用userspace FS对应处理函数,完成后再把结果返回给kernel。这里,daemon 读取request、写回response都是通过/dev/fuse node。
-
-
一个新的FUSE文件系统可以是建立在block device上的,也可以是虚拟的或stackable,即对另一个文件系统进行封装,实现特定的功能。如果mount时指定了blkdev参数,就使用block device,见fuse(8)。
-
从下面的两幅图可以看到,每一个文件操作都需要多次的系统调用(这应该是userspace FS性能变差的一个主要原因),例如:user ==> sys_read ==> FUSE 接收到这个操作请求,转发给fuse_dev ==> FS daemon syscall(read)返回,拿到request、处理、生成结果,通过syscall(write)把结果返回给fuse_dev ==> FUSE得到结果 ==> user的sys_read得到结果。
-
- 数据结构
- libfuse支持下列的ops:
【CSDN的编辑器太难用了!放弃写这段了!格式全乱了!!!】
/sys/fs/fuse/connections/:这个目录下的文件作用见 linux-4.4/Documentation/filesystems/fuse.txt。
mount.fuse(8),fusermount(1)
- FUSE debug工具
- 参考资料
https://github.com/libfuse/libfuse/blob/master/doc/kernel.txt