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/ext4.rs
rsext4 是当前仓库里的独立 ext4 引擎。它自己定义块设备接口、挂载与卸载流程、目录/文件 API、JBD2 日志代理、多级缓存和若干 host 侧验证程序;在这棵代码树里,它主要作为旧 ax-fs 的 ext4 叶子后端被消费,而不是作为系统的 VFS 层或名字空间层存在。
架构设计
设计定位
rsext4 的边界非常靠下:
- 它直接面向 ext4 语义和块设备,而不是面向统一 VFS trait。
- 它对外导出的接口既有高层 API(
mount、open、read_at、mkdir等),也有大量后端内部模块,属于“引擎 + 宽导出 API”的风格。 - 在当前仓库里,旧
ax_fs::fs::ext4通过适配层把它包装成ax_fs_vfs::VfsOps;新ax-fs-ng的 ext4 路径则改用了lwext4_rust,不再依赖它。
模块结构
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::ext4 这种外层适配器必须负责把 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新栈不直接使用它。
核心功能
功能概览
mkfs、mount、umount。open/lseek/read_at/write_at。mkdir/mkfile/delete_file/delete_dir。link/unlink/create_symbol_link/rename/mv。truncate、extent 解析、洞区读零。
2.2 关键实现细节
文件句柄
OpenFile 持有:
inode_numpathinodeoffset
读取和写入都会基于该 offset 推进,并在必要时刷新 inode 状态。
extent 读取
api.rs::read_at() 在 ext4 extent 模式下会先解析逻辑块到物理块映射,再逐块读取;如果遇到洞区,则直接用 0 填充返回结果。
全量同步
Ext4FileSystem::sync_filesystem() 会依次:
- 刷新数据块缓存
- 刷新 inode 表缓存
- 刷新位图缓存
- 写回块组描述符
- 写回超级块
- 刷新底层块设备
这条顺序在默认多级缓存打开时尤其 重要。
2.3 真实限制与注意事项
- README 已明确说明:默认启用多级缓存时,写操作不会立即落盘,关键持久化时机必须显式同步。
- 当前 journal 主要围绕 metadata ordered 模式组织,不是多模式通用实现。
src/lib.rs直接pub use大量后端模块,说明这个 crate 对上层暴露的是“偏底层引擎接口”,而不是收敛后的极简 facade。- crate 级别启用了
#![deny(warnings)],任何小的告警都会导致构建失败。
依赖关系
直接依赖
bitflags:位图与标志位表达。lazy_static:no_std 下的静态对象辅助。log:调试与事务日志输出。
主要消费者
- 旧
ax_fs::fs::ext4:当前仓库里的主要生产消费者。 src/main.rs:host 侧文件镜像驱动的演示与回归程序。
3.3 与相邻 crate 的关系
rsext4只解决 ext4,不解决统一文件系统接口。ax_fs::fs::ext4负责把它翻译成旧axfs_vfs所需的节点语义。- 新
ax-fs-ngext4 路径已转向lwext4_rust。
开发指南
接入方式
[dependencies]
rsext4 = { workspace = true }
如果你是在旧 ax-fs 栈中接入,一般不会直接暴露 rsext4 给上层,而是通过 ext4 适配层消费。