深入理解 FUSE:从 Hello World 到文件系统实现原理-01
FUSE archlinuxcn wiki 用户空间中的文件系统 (Filesystem in Userspace) (FUSE) 是一种用于类 Unix 操作系统的机制,它使非特权用户可以创建自己的文件系统而无需编辑内核代码。这是通过在用户空间中运行文件系统代码来实现的,而 FUSE 内核模块仅提供了到实际内核接口的“桥梁”。
FUSE 是一个允许在用户空间实现文件系统的框架。这意味着你可以使用任何编程语言(虽然 C/C++ 是最常见的选择,因为 FUSE 库是用 C 编写的)来创建自己的文件系统,而无需深入内核编程的复杂性。这为各种有趣的应用场景打开了大门。
- 将网络协议挂载为本地文件系统(如 SSHFS, NFS)。
- 将数据库或云存储服务挂载为文件系统。(为了学习 JuiceFS 😢)
本文将从一个最简单的 FUSE 示例出发,深入剖析 FUSE 的工作原理、架构设计及其在现代操作系统中的应用,帮助读者不仅理解如何使用 FUSE,更能洞悉文件系统的本质。(这是第一篇,如果反响好就继续出)

结构设计
核心组件分析
创建了一个虚拟文件系统,其中只有一个名为 hello.txt 的只读文件,文件内容固定为"Hello World!\n"。这是一个教学用的最小 FUSE 实现,展示了 FUSE 的基本工作原理。
1. 文件系统结构
- 根目录
/
- 一个文件
/hello.txt
,内容为"Hello World!\n"
2. 实现的文件系统操作
hello_getattr
函数
获取文件属性(类似于stat
命令的功能):
- 对于根目录
/
:设置为目录类型,权限 755 - 对于
/hello.txt
:设置为普通文件,权限 444(只读),大小为字符串长度 - 对于其他路径:返回"无此文件或目录"错误
hello_readdir
函数
读取目录内容(当用户执行ls
命令时调用):
- 只处理根目录
/
- 在目录中添加三项:
.
(当前目录),..
(父目录)和hello.txt
文件 - 使用
filler
回调函数将目录项填充到 FUSE 提供的缓冲区中
hello_open
函数
打开文件操作:
- 只允许打开
/hello.txt
- 只允许以只读模式打开(O_RDONLY),其他模式返回访问错误(EACCES)
hello_read
函数
读取文件内容:
- 根据提供的偏移量(offset)和大小(size)读取
hello_str
字符串 - 处理边界情况,确保不会读取超过字符串长度的内容
- 返回实际读取的字节数
3. 操作函数表和主函数
fuse_operations
结构体定义了文件系统支持的操作集合,本例中只实现了四个基本操作。
main
函数调用fuse_main
启动 FUSE 文件系统,传入命令行参数和操作函数表。
实践
- 操作系统: Ubuntu 22.04
- CC: gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
- CMAKE: cmake version 3.30.8
文件结构
|
|
|
|
|
|
|
|
编译后使用
|
|
