跳到主要内容

文件系统测试与验证

文件系统验证按“纯算法 → VFS 状态机 → 格式镜像 → OS API → StarryOS Linux ABI → 真实块 IRQ”分层。低层测试给出确定性失败定位,高层测试确认 namespace、syscall、rootfs 和驱动组合;任何一层都不能替代其他层。

1. Host crate 测试

1.1 虚拟文件系统

fs/axfs-ng-vfs 的单元测试覆盖路径、dentry、mount topology 和 propagation;tests/std.rshost-test feature 下从 crate 外验证 public API。

重点契约包括:

测试域必须保持的行为
path双向 component、file name、非法/超长 entry name
dentry cachemutation generation、rename 后 parent 引用、hard-link user data
mount callbackfilesystem callback 在 topology guard 外执行
namespace clonesource/flags 保留、mount identity 独立、relation 重建
bind/pivotsubtree 范围、absolute path 重定位、旧根 reparent
propagationpeer 对称、slave transitive delivery、visited 去环
unmountnormal busy、lazy child-first、传播多目标原子性、stale plan revalidation

定向运行:

cargo test -p axfs-ng-vfs --features host-test

1.2 文件访问层

ax-fs-ng 的 host tests 使用 test page provider 和 mock rdif-block controller/queue,不需要 QEMU 即可验证:

  • page allocation/deallocation 和 virtual-to-physical capability;
  • readahead 4→8→…→32 页及随机读重置;
  • EOF 尾页清零、cached read/write、dirty generation;
  • writeback callback 锁外调用;
  • resize 成功与 backing rollback 失败;
  • reclaim 在 registry spin lock 外取得 file lock;
  • GPT、MBR primary、EBR logical、raw fallback 和越界拒绝;
  • root selector、只读 transient mountpoint、逆序 shutdown;
  • block runtime publication、batching、flush barrier、teardown 和资源 rollback。

常用命令:

cargo test -p ax-fs-ng --features host-test,vfs,ext4,fat
cargo test -p ax-fs-ng --test root_selector --features host-test,vfs,ext4,fat

具体 feature 组合应以 workspace/CI 当前定义为准;若完整组合因外部格式库 host feature 不兼容,应分别运行最小 ext4、FAT 和 VFS 组合,不能直接跳过对应域。

2. 系统行为

格式测试、ArceOS 系统测试和 StarryOS ABI 测试逐步扩大观察范围。rsext4 验证磁盘格式,ArceOS 验证公共 API 与真实 rootfs,StarryOS 则验证 Linux fd、namespace 和 syscall 语义。

2.1 Ext4 格式

fs/rsext4/tests/ 包含 public API、文件/目录操作、metadata 生命周期、checksum、cache coherence、Linux image repro 和错误处理。它们直接对确定性 ext4 image 操作,适合定位 VFS adapter 之下的格式错误。

测试文件覆盖点
file_operations.rscreate/read/write/truncate/unlink
directory_operations.rslookup、mkdir、rename、目录项
metadata_lifecycle.rsinode/link/时间和释放
crc_integrity.rssuperblock、bitmap、inode、journal checksum
cache_coherence_repro.rsmetadata/data cache 一致性回归
linux_image_repro.rsLinux 工具生成 image 的兼容场景
error_handling.rsI/O 和损坏 metadata 的 typed error

这些测试需要观察 image 操作后的 metadata 或重新 mount 结果,不能只断言内存 API 返回成功。持久化行为还应保持与 Linux e2fsck 和读取侧的格式兼容。

cargo test -p rsext4

2.2 ArceOS 系统

ArceOS 文件系统用例位于 test-suit/arceos/rust/src/fs/,通过真实 rootfs 和 ax-std/API 入口覆盖 create、read/write、directory 和 metadata。使用 xtask 保持 feature、架构、磁盘参数和 success regex 一致:

cargo xtask arceos test qemu --arch x86_64 --test-group rust

如果当前 xtask 的具体子命令或配置名变化,应先查询 cargo xtask --helptest-suit/arceos 配置,不要用 raw Cargo/QEMU 猜等价参数。

2.3 StarryOS ABI

StarryOS system 分组从用户态调用 Linux syscall,覆盖公共 VFS 无法观察的 fd、errno、credentials、namespace 和结构体布局。文件系统相关场景至少包括:

测试类别代表位置/名称主要契约
mount namespacetest-unshare-fsclone/unshare 后 topology visibility
synctest-syncfssyscall-test-syncfspage cache + filesystem flush 和错误传播
overlaysyscall-test-overlayfs多层 lookup/copy-up/mount 行为
mount/umountsystem mount casesbusy、flags、bind/move/lazy detach、mountinfo
path/openopenat2、symlink、chroot/pivot casesno-follow/beneath/root boundary
file I/Oread/write/truncate/mmap/fsync casescache、EOF、MAP_SHARED 一致性
metadatastat/xattr/link/rename casesLinux-visible inode、mode、link count、errno

基础运行入口:

cargo xtask starry test qemu --arch riscv64 -c qemu-smp1/system

mount、page cache 和 block runtime 都涉及 SMP,相关变更不能只跑单核。至少补充一个多 vCPU 配置;涉及架构/设备差异时按 CI 支持覆盖 x86_64、riscv64、aarch64 或 loongarch64 对应目标。

3. 运行时验证

块设备运行时和文档构建分别验证设备状态机与架构说明的可执行性。前者使用 deterministic mock 固定 request/IRQ owner,后者由 Docusaurus 检查 Markdown、链接和 Mermaid。

3.1 块设备运行时

块 runtime 的 deterministic mock tests 位于:

fs/ax-fs-ng/src/block/runtime/hctx/tests/
fs/ax-fs-ng/src/block/runtime/lifecycle/tests/
fs/ax-fs-ng/src/block/runtime/irq.rs tests

应按变更类型选择:

变更必测事实
admission/channelfull/closed/NOWAIT 返回完整 request owner
batchingqueue limit、commit 次数、完成顺序
flush所有 data drain 后提交,后续 data 被阻塞,错误后 gate 恢复
publicationREADY 前 caller 不可见,queue/IRQ 失败不部分发布
IRQspurious、empty ack、shared fan-out、deferred control/rearm
teardowndisable+synchronize、worker join、DMA/request 恰好回收一次
SMP onlineCPU channel mapping 和 queue epoch 更新

真实硬件或 QEMU 测试负责确认 driver endpoint 的 mask/ack/rearm 和 DMA coherency,mock 不能证明这些硬件事实。板端写测前后应遵守项目的 rootfs fsck/boot 检查流程。

3.2 文档构建

本目录使用 Docusaurus/MDX 和 Mermaid。修改后至少执行:

cd docs
npm run build

构建会发现 frontmatter、相对链接、Mermaid 语法和 MDX 特殊字符错误。还应检查:

rg -n '\]\([^)]*\.md\)' docs/docs/architecture/fs
rg -n 'TODO|FIXME|旧路径|ax-fs/' docs/docs/architecture/fs

文档中的源码路径应对应当前文件,不固定易漂移的行号。接口名、常量和 feature 必须从代码核对;设计文档中已经删除的历史模型不能写成当前实现。

4. 验证范围

不同文件系统改动需要覆盖不同最低层测试和系统场景。验证矩阵用于保持行为层级完整,质量检查则保证同一变更中的 Rust 与 Markdown 都符合仓库工具链要求。

4.1 分层矩阵

下表把改动域映射到最低 host 验证和系统验证。host test 用于确定性定位,系统测试用于观察 namespace、rootfs、ABI 和真实设备组合。

改动域最低 host 验证系统验证
path/dentryaxfs-ng-vfs testsStarry path/open/rename cases
mount/namespaceVFS mount testsStarry unshare/mount/umount/mountinfo
file handle/cacheax-fs-ng cache testsArceOS fs + Starry mmap/fsync/truncate
ext4rsext4 + ax-fs-ng ext4 adapterext4 rootfs boot/write/sync;必要时 e2fsck
FATax-fs-ng FAT/disk testsFAT root或附加卷读写/flush
volume/rootvolume + root_selector多盘/分区配置启动
block runtimehctx/lifecycle/IRQ mock tests对应 QEMU/board block driver,多核 I/O + sync
OS capability gluetargeted clippy/buildArceOS 启动 + 一个上层系统

4.2 质量检查

本目录本身仅是 Markdown;纯文档修改不要求 Rust clippy 或 rustfmt。若同一变更修改 Rust 逻辑,按项目要求执行:

cargo fmt
cargo xtask clippy --package axfs-ng-vfs
cargo xtask clippy --package ax-fs-ng

bug 修复必须先加入能在旧实现上确定失败的回归测试,记录失败,再实现修复并验证同一测试通过。放宽 success regex、跳过同步或降低 image 检查不能替代根因测试。