axfs_vfs
路径:
components/axfs_crates/axfs_vfs类型:库 crate 分层:组件层 / 可复用基础组件 版本:0.1.2文档依据:Cargo.toml、README.md、src/lib.rs、src/structs.rs、src/path.rs
axfs_vfs 是旧文件系统栈 使用的 VFS trait 契约。它提供的不是完整的挂载与名字空间对象模型,而是一组足够让 ax-fs、axfs_ramfs、axfs_devfs 和格式适配层对接起来的最小接口集合。
架构设计
设计定位
axfs_vfs 的设计非常克制:
- 它只定义文件系统与节点的基础操作接口。
- 它把“当前目录”“挂载点选择”“跨文件系统路径路由”等更高层逻辑留给
ax-fs去做。 - 它更像一个稳定的旧栈 ABI,而不是一个带运行时对象图的 VFS 内核框架。
因此,理解 axfs_vfs 的最好方式不是把它看成 Linux VFS 的缩影,而是把它看成“旧栈统一节点能力的 trait 合同”。
1.2 核心模块
src/lib.rs:定义VfsOps、VfsNodeOps、VfsNodeRef以及默认错误语义。src/structs.rs:定义VfsNodeAttr、VfsNodePerm、VfsNodeType、VfsDirEntry、FileSystemInfo。src/path.rs:提供字符串级路径规范化工具canonicalize()。src/macros.rs:提供impl_vfs_dir_default!、impl_vfs_non_dir_default!两个宏,用于快速补齐“不适用操作返回错误”的默认实现。
1.3 核心对象与限制
VfsOps
用于表达“一个文件系统实例”,核心接口只有:
mount()umount()format()statfs()root_dir()
其中 mount()/umount() 只是回调钩子,并不负责全局挂载图管理。
VfsNodeOps
用于表达文件与目录节点。它既承担文件读写接口,也承担目录遍历和创建删除接口,因此实现者通常会结合 impl_vfs_dir_default! 或 impl_vfs_non_dir_default! 来屏蔽不适用的方法。
属性模型
VfsNodeAttr 只记录:
- 权限位
- 节点类型
- 字节大小
- 512B block 数
它没有 uid/gid、时间戳、设备号、链接数等更完整的 Unix 元数据。
名字长度限制
VfsDirEntry 内部使用固定的 63 字节缓冲区存名字,超长名字只会报警告。这是旧栈接口级别的硬限制之一。
1.4 与 axfs-ng-vfs 的差异澄清
axfs_vfs没有Mountpoint、Location、MetadataUpdate、NodeFlags、Pollable、user_data。axfs_vfs的FileSystemInfo目前几乎是空壳结构;新栈的StatFs才是真正可用的统计结构。axfs_vfs不负责跨设备重命名/硬链接规则;旧ax-fs只能在自己那层做有限约束。
核心功能
功能概览
- 为旧栈文件系统定义统一 trait。
- 为目录项、节点属性和权限位定义统一结构。
- 提供路径规范化工具。
- 提供用于区分目录/非目录节点的默认实现宏。
2.2 真实实现语义
lookup(self: Arc<Self>, path: &str)把Arc<Self>直接暴露给实现者,这意味着目录实现通常自行维护Arc/Weak父子关系。create()/remove()/rename()都是字符串路径风格接口,路径拆分和递归路由由具体文件系统自己决定。path::canonicalize()只做纯字符串归一化,不查询文件系统,也不会强制转成绝对路径。
使用方式
在当前仓库里,它的直接消费者主要有三类:
ax-fs:系统级聚合层。axfs_ramfs:内存文件系统。axfs_devfs:设备文件系统。
也就是说,它服务的是一整套旧栈组件,而不是面向最终业务逻辑直接暴露。
依赖关系
直接依赖
ax-errno:错误码来源。bitflags:权限位实现。log:长目录项名警告等辅助日志。
主要消费者
ax-fs:通过它抽象 FAT/ext4/ramfs/devfs 节点。axfs_ramfs:用它定义纯内存文件与目录。axfs_devfs:用它定义设备目录树与字符设备节点。
3.3 与相邻 crate 的关系
axfs_vfs在旧栈里处于“接口层”。axfs_ramfs、axfs_devfs是它之上的具体实现层。ax-fs则是再上一层的系统装配层。
开发指南
接入方式
[dependencies]
ax-fs-vfs = { workspace = true }
4.2 实现约束
- 目录实现通常需要自己维护
parent()的Arc/Weak关系,因为 trait 本身不替你管理节点图。 get_attr()必须准确返回节点类型与权限位,高层很多行为都靠它判定。- 如果你实现的是目录节点,请优先使用
impl_vfs_dir_default!补齐无意义的文件操作。 - 如果你实现的是文件节点,请优先使用
impl_vfs_non_dir_default!补齐无意义的目录操作。
4.3 扩展建议
- 如果你的目标是完整 Unix 语义、挂载图、轮询和节点级扩展点,继续扩展
axfs_vfs的收益不高,优先考虑axfs-ng-vfs。 - 如果只是给旧
ax-fs增加一种简单叶子文件系统,实现VfsOps/VfsNodeOps仍然是最低成本路径。 - 写
rename()时要明确是否支持跨目录或跨挂载点;旧 trait 不会替你兜底。