axfs-ng-vfs 技术文档
路径:
components/axfs-ng-vfs类型:库 crate 分层:组件层 / 可复用基础组件 版本:0.1.1文档依据:Cargo.toml、src/lib.rs、src/fs.rs、src/mount.rs、src/node/mod.rs、src/node/dir.rs、src/node/file.rs、src/path.rs、src/types.rs、os/arceos/modules/axfs-ng/src/highlevel/file.rs、os/arceos/modules/axnet-ng/src/unix/mod.rs、os/StarryOS/kernel/src/pseudofs/mod.rs
axfs-ng-vfs 是新文件系统栈真正的核心抽象层。它不是老 axfs_vfs 那种“只有一组 trait 的薄接口”,而是完整拥有 Filesystem、Mountpoint、Location、DirEntry、元数据模型、目录项缓存、挂载图与路径语义的对象模型库。
1. 架构设计分析
1.1 设计定位
axfs-ng-vfs 解决的是新栈里“怎样表达一个可挂载、可缓存、可携带元数据、可跨项目复用的 VFS 对象模型”。
它的定位可以分成三层理解:
- 对具体文件系统实现者:提供
FilesystemOps、DirNodeOps、FileNodeOps三组 trait,作为 ext4、FAT、tmpfs、devfs、procfs 等后端的落点。 - 对高层文件接口:提供
Location、Mountpoint、Metadata、NodeFlags、Path/PathBuf等“有状态对象”,让上层不必自己重新维护挂载树或路径解析。 - 对跨项目消费者:ArceOS 的
ax-fs-ng、ax-net-ng的 Unix socket、StarryOS 的 pseudofs 都可以在同一套节点语义上工作。
1.2 模块划分
src/fs.rs:定义FilesystemOps、Filesystem和StatFs。这是“一个文件系统实例”的外部门面。src/node/mod.rs:定义NodeOps、DirEntry、Reference、TypeMap、NodeFlags等共用对象,是节点对象图的核心。src/node/dir.rs:定义DirNodeOps、目录项缓存、挂载点引用与目录操作。src/node/file.rs:定义FileNodeOps与文件节点统一接口。src/mount.rs:定义Mountpoint、Location、挂载/卸载/跨设备校验,是整套系统最关键的“名字空间层”。src/path.rs:提供 UTF-8 路径对象、组件迭代、规范化逻辑。src/types.rs:定义NodeType、NodePermission、Metadata、MetadataUpdate、DeviceId。
1.3 核心对象关系
axfs-ng-vfs 的对象关系不是树上挂字符串,而是“对象图 + 引用”:
这里最重要的几个点是:
Filesystem只代表“某个文件系统实例”,不包含它挂在全局什么位置。Mountpoint表示“某个文件系统挂载到名字空间后的实例”,同一文件系统理论上可以被挂到多个位置。Location才是上层真正拿来操作的“当前节点 + 当前挂载点”组合对象。DirEntry持有Reference(parent, name),因此能恢复绝对路径、父子关系和缓存 key。
1.4 关键机制
挂载图与覆盖语义
Location::mount() 会在目录节点 的 mountpoint 槽位里挂上新的 Mountpoint。Location::resolve_mountpoint() 则保证一旦走到某个挂载点根目录,就自动切入新的挂载树。Mountpoint::effective_mountpoint() 还能处理“同一路径被再次挂载覆盖”的情况。
目录项缓存
DirNode 内部有 cache: HashMap<String, DirEntry>。如果后端 is_cacheable() 返回 true,重复 lookup() 会优先命中缓存;如果返回 false,每次都会打到后端实现。这正是动态 pseudofs 与稳定磁盘文件系统最重要的行为分界之一。
跨设备约束
Location::link() 和 Location::rename() 都会检查源与目标是否位于同一 Mountpoint。因此“跨挂载点 hard link / rename”会被显式拒绝,而不是悄悄做成复制或半成功状态。
每节点用户数据
DirEntry::user_data()/Location::user_data() 暴露了一个 TypeMap。这不是装饰性接口:
ax_fs_ng::CachedFile会把共享页缓存状态挂在这里。ax-net-ng的 Unix socket 会把BindSlot挂在 socket 节点上。
也就是说,它是新栈跨层协作的重要扩展点。
1.5 与 axfs_vfs 的差异澄清
axfs_vfs只有 trait 和基础属性结构,不维护挂载图、路径上下文或元数据更新语义。axfs-ng-vfs则显式拥有Mountpoint、Location、MetadataUpdate、NodeFlags、Pollable等一整套对象模型。axfs_vfs更像“旧栈的 ABI 契约”,axfs-ng-vfs更像“新栈的 VFS 运行时对象层”。
2. 核心功能说明
2.1 主要功能
- 表达文件系统实例与挂载点。
- 表达目录节点、文件节点和目录项引用。
- 提供跨挂载点路径解析、挂载与卸载。
- 提供完整的 Unix 风格元数据结构。
- 为上层缓存、轮询、socket 路径命名空间等场景预留节点级扩展点。