Building a Linux filesystem module in almost pure Rust
6 hours ago
- ZeroFS 引入了一个原生内核客户端:一个用 Rust 编写的树外 Linux 文件系统模块,其中包含少量用于 netfslib 辅助函数的 C 代码。
- 该内核客户端注册到 VFS,使用 netfslib 进行 I/O,并通过 TCP 或 Unix 套接字直接使用 9P2000.L.Z 协议,消除了基于 FUSE 挂载的用户空间往返。
- 与 Linux v9fs 相比,ZeroFS 内核客户端支持自定义元数据操作、服务器故障转移后的重新连接以及主/备对。
- 该模块利用内核中的 Rust(Linux 6.18+)提供基础基础设施,但 VFS 交互依赖于原始的 C 结构体和 extern "C" 回调;大多数 unsafe 代码仅限于粘合层,而协议实现是安全的。
- netfs/compat_helpers.c 和 vfs/compat_helpers.c 中的大约 250 行 C 代码处理 bindgen 无法处理的静态内联函数。
- Netfslib 处理缓冲 I/O;该模块实现读写请求操作,消息大小可达 10 MiB,并支持缓存策略选项:宽松(1 秒)或严格(服务器重新验证,无缓冲)。
- 每个挂载与服务器有一个单一连接;请求使用 16 位标签进行多路复用,允许多个调用者等待自己的标签而不阻塞其他调用者。
- 对于不支持 Rust 的内核,构建过程将模块编译为 LLVM 位码,内部化 Rust 符号,并使用内核的正常模块工具进行链接,支持 x86-64(GCC/Clang)和小端 arm64。
- 源代码位于 kernel/ 目录中;软件包、安全启动注册和挂载选项在内核客户端文档中有详细说明。