rsext4 技术文档
路径:
components/rsext4类型:库 + 演示二进制 crate 分层:组件层 / 可复用基础组件 版本:0.1.0文档依据:Cargo.toml、README.md、src/lib.rs、src/ext4_backend/ext4.rs、src/ext4_backend/api.rs、src/ext4_backend/blockdev.rs、src/ext4_backend/jbd2/jbd2.rs、src/ext4_backend/datablock_cache.rs、src/ext4_backend/inodetable_cache.rs、src/ext4_backend/bitmap_cache.rs、src/testfs/test_example.rs、src/main.rs、os/arceos/modules/axfs/src/fs/ext4fs.rs
rsext4 是当前仓库里的独立 ext4 引擎。它自己定义块设备接口、挂载与卸载流程、目录/文件 API、JBD2 日志代理、多级缓存和若干 host 侧验证程序;在这棵代码树里,它主要作为旧 ax-fs 的 ext4 叶子后端被消费,而不是作为系统的 VFS 层或名字空间层存在。
1. 架构设计分析
1.1 设计定位
rsext4 的边界非常靠下:
- 它直接面向 ext4 语义和块设备,而不是面向统一 VFS trait。
- 它对外导出的接口既有高层 API(
mount、open、read_at、mkdir等),也有大量后端内部模块,属于“引擎 + 宽导出 API”的风格。 - 在当前仓库里,旧
ax_fs::fs::ext4fs通过适配层把它包装成ax_fs_vfs::VfsOps;新ax-fs-ng的 ext4 路径则改用了lwext4_rust,不再依赖它。
1.2 内部模块划分
src/ext4_backend/blockdev.rs:定义BlockDevicetrait、BlockDev缓冲封装以及Jbd2Dev。src/ext4_backend/ext4.rs:文件系统核心对象Ext4FileSystem,包含超级块、块组描述符、分配器和三层缓存。src/ext4_backend/api.rs:高层调用入口,如fs_mount、fs_umount、open、read_at、write_at。src/ext4_backend/file.rs、dir.rs:文件/目录操作,包括创建、删除、rename、link、symlink、truncate 等。src/ext4_backend/jbd2/*:ordered 模式元数据日志提交与回放。src/ext4_backend/datablock_cache.rs、inodetable_cache.rs、bitmap_cache.rs:三类缓存,各自维护 BTreeMap + LRU 访问计数。src/main.rs、src/testfs/*:host 文件镜像驱动的演示和回归脚手架。
1.3 核心对象与数据路径
rsext4 并不是单层 API,而是一条较完整的 ext4 数据通路:
1.4 关键机制
固定 4 KiB ext4 block
config.rs 把 ext4 block size 固定为 4096,而 BlockDevice::block_size() 默认值是 512。因此像旧 ax_fs::fs::ext4fs 这种外层适配器必须负责把 512B block 设备转换成 rsext4 眼中的 4 KiB block 设备。
多级缓存
默认 feature USE_MULTILEVEL_CACHE 开启时:
- 数据块缓存
- inode 表缓存
- 位图缓存
都会延迟写回。只有在显式 flush_all() / sync_filesystem() / umount() 或缓存淘汰时,脏数据才会真正落盘。
JBD2 代理
Jbd2Dev 的日志模型是:
- 只对元数据走 journal。
_mode == 0表示 ordered 模式。- commit queue 达到阈值时会触发事务提交。
- 重放逻辑从 journal superblock 状态出发,尽量顺序回放完整事务。
也就是说,它更像“为 ext4 核心补上元数据日志持久化”的块设备代理,而不是完整实现 Linux 内核同等级的 JBD2 子系统。
1.5 与相邻 crate 的边界
rsext4在ax-fs之下,只负责 ext4 格式语义,不负责根目录、当前目录或挂载名字空间。rsext4和axfs-ng-vfs处于完全不同层级:前者是格式引擎,后者是 VFS 对象模型。- 当前仓库里的 StarryOS 和
ax-fs-ng新栈不直接使用它。