FUSE简记

时间:2024-03-23 16:13:08

 

FUSE简记 

FUSE简记

 

  1. 什么是FUSE?

    用户空间的文件系统:Filesystem in USErspace。

    在用户空间实现一个文件系统有以下好处:

    • 用户态的开发简单便捷,调试方便。不会导致系统panic。

    • 可以使用任何语言开发,perl/python/...

    • stackable,可以在已有文件系统的基础上实现更多功能(deduplication或compression。。。)

    • 快速验证新想法,prototype

    • 绕开license的限制等,比如把zfs、ntfs移植到其它系统上。

  2. 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得到结果。

  3. 数据结构

- libfuse支持下列的ops:

【CSDN的编辑器太难用了!放弃写这段了!格式全乱了!!!】

/sys/fs/fuse/connections/:这个目录下的文件作用见 linux-4.4/Documentation/filesystems/fuse.txt。 

mount.fuse(8),fusermount(1)

 

  1. FUSE debug工具
  2. 参考资料

https://github.com/libfuse/libfuse/blob/master/doc/kernel.txt

http://libfuse.github.io/doxygen/index.html

https://github.com/libfuse/libfuse/wiki/Protocol-Sketch