Expand description
Inode 抽象层 - VFS 存储层接口
该模块定义了文件系统的底层存储接口,提供无状态的文件和目录访问能力。
§组件
Inodetrait:文件/目录的核心操作接口InodeMetadata:文件元数据(大小、权限、时间戳等)InodeType:文件类型枚举(普通文件、目录、符号链接等)FileMode:POSIX 兼容的权限位DirEntry:轻量级目录项(用于 readdir)
§与 File trait 的关系
| 方面 | File (会话层) | Inode (存储层) |
|---|---|---|
| 状态 | 有状态 (offset、flags) | 无状态 |
| 方法 | read(buf) | read_at(offset, buf) |
| 实例 | 每次 open 创建新实例 | 多个 File 可共享同一 Inode |
| 职责 | 维护会话状态 | 提供存储访问 |
§为什么 Inode 是无状态的?
无状态设计使得:
- 同一文件可被多次打开,各自维护独立的 offset
- 硬链接可以共享同一个 Inode
- 多线程读写时无需锁定 Inode(offset 由 File 管理)
File { offset: 0 } ──┐
├──> Inode { data: [...] }
File { offset: 100 }──┘§设计要点
§随机访问
所有读写方法都携带 offset 参数,支持真正的随机访问:
// 可以乱序访问,不影响彼此
inode.read_at(100, &mut buf1)?; // 读取位置 100
inode.read_at(0, &mut buf2)?; // 读取位置 0§幂等性
读取操作应该是幂等的(多次调用返回相同结果):
let n1 = inode.read_at(0, &mut buf)?;
let n2 = inode.read_at(0, &mut buf)?;
assert_eq!(n1, n2); // 相同的读取结果§目录操作
Inode 不仅支持文件读写,还支持目录操作:
lookup(name)- 查找子项create(name)- 创建文件mkdir(name)- 创建目录unlink(name)- 删除文件readdir()- 列出目录内容
§使用示例
use vfs::{Inode, FileMode};
// 1. 读写文件
let mut buf = [0u8; 512];
let n = inode.read_at(0, &mut buf)?;
inode.write_at(512, b"hello")?;
// 2. 目录操作
let child_inode = parent_inode.lookup("file.txt")?;
parent_inode.create("new.txt", FileMode::S_IFREG | FileMode::S_IRUSR)?;
// 3. 获取元数据
let metadata = inode.metadata()?;
println!("大小: {}, 类型: {:?}", metadata.size, metadata.inode_type);Structs§
- DirEntry
- 轻量级目录项(readdir 返回)
- File
Mode - 文件权限和类型(与 POSIX 兼容)
- Inode
Metadata - 文件元数据
Enums§
- Inode
Type - 文件类型
Traits§
- Inode
- 文件系统底层存储接口