FUSE 是什么?

FUSE 文件系统是一个用户空间文件系统框架,它允许开发人员通过编写用户空间程序来创建自定义文件系统。Fuse 文件系统在操作系统内核和文件系统之间提供了一个中间层,使得用户空间程序可以实现自定义的文件系统操作,例如创建、读取、写入和删除文件等。Fuse 文件系统不需要特权级别的内核代码,因此它具有很高的灵活性和可移植性。

FUSE 文件系统的一个主要用途是为用户提供虚拟文件系统,使得他们可以访问远程计算机或云存储中的文件,而不需要直接访问底层文件系统。FUSE文件系统还可以用于实现加密文件系统、压缩文件系统、版本控制文件系统等。

FUSE 文件系统最初是在Linux操作系统上开发的,但现在已经被移植到其他许多操作系统上,例如Mac OS X、FreeBSD和OpenBSD等。

FUSE 中最重要的功能之一是允许安全且非特权的挂载。这为文件系统的使用开辟了新的可能性。一个很好的例子是 sshfs:它是使用 sftp 协议的安全网络文件系统。

一个流程图展示FUSE的工作原理:用户空间发送请求以列出文件(ls -l /tmp/fuse),该请求通过内核通过VFS重定向到FUSE。FUSE然后执行注册的处理程序(./hello),并将请求(ls -l /tmp/fuse)传递给它。处理程序返回一个响应到FUSE,然后重定向到最初发出请求的用户空间程序。

一个流程图展示FUSE的工作原理:用户空间发送请求以列出文件(ls -l /tmp/fuse),该请求通过内核通过VFS重定向到FUSE。FUSE然后执行注册的处理程序(./hello),并将请求(ls -l /tmp/fuse)传递给它。处理程序返回一个响应到FUSE,然后重定向到最初发出请求的用户空间程序。

Fuse的优点和缺点

Fuse是一个用户态的文件系统框架,它允许开发者创建自己的文件系统,而不需要编写内核模块。Fuse的优点和缺点如下:

优点:

  1. 简单易用:Fuse的API简单易用,使得开发者可以快速地创建自己的文件系统。
  2. 跨平台支持:Fuse支持各种不同的操作系统和平台,包括Linux、macOS、FreeBSD等。
  3. 灵活性:Fuse可以被用来创建各种类型的文件系统,包括网络文件系统、加密文件系统等。
  4. 安全性:Fuse运行在用户态,避免了内核模块的安全问题。

缺点:

  1. 性能:Fuse的用户态实现会导致一定的性能损失,特别是对于高负载的文件系统访问场景。
  2. 安全性:由于Fuse运行在用户态,一些恶意程序可以利用它来进行攻击。
  3. 依赖性:Fuse需要安装一些依赖包和库才能正常工作,这可能增加部署和维护的成本。
  4. 复杂性:创建高质量的文件系统需要深入了解Fuse的工作原理和API,这可能会增加开发和调试的难度。

FUSE(用户空间文件系统)是一个接口,用于用户空间程序将文件系统导出到Linux内核。该项目由两个组件组成:fuse内核模块(在常规内核存储库中维护)和libfuse用户空间库(在此存储库中维护)。 libfuse提供了与FUSE内核模块通信的参考实现。

通常,FUSE文件系统实现为与libfuse链接的独立应用程序。 libfuse提供了挂载文件系统、卸载文件系统、从内核读取请求并发送响应的功能。 libfuse提供了两个API:高级同步API和低级异步API。在这两种情况下,来自内核的传入请求都使用回调函数传递给主程序。当使用高级API时,回调可以使用文件名和路径而不是索引节点,并且当回调函数返回时处理请求。当使用低级API时,回调必须使用inode,并且必须使用一组单独的API函数显式地发送响应。

FUSE 宏观调用:

以open为例,整个调用的过程如下:

1- 用户态app调用glibc open接口,触发sys_open系统调用。

2- sys_open 调用fuse中inode节点定义的open方法。

3- inode中open生成一个request消息,并通过/dev/fuse发送request消息到用户态libfuse。

4- Libfuse调用fuse_application用户自定义的open的方法,并将返回值通过/dev/fuse通知给内核。

5- 内核收到request消息的处理完成的唤醒,并将结果放回给VFS系统调用结果。

6- 用户态app收到open的返回结果。

image.png