-
Notifications
You must be signed in to change notification settings - Fork 50
Open
0 / 40 of 4 issues completedDescription
一、问题描述
当前 Axvisor 的文件系统仅支持单一文件系统格式(例如仅支持 ext4 或 vfat),无法根据不同磁盘分区自动识别并挂载对应文件系统。
这在需要同时访问多种文件系统(如一个分区为 FAT32,用于引导;另一个为 EXT4,用于系统文件)的场景中存在限制
二、设计目标
为了支持多分区和多文件系统,Axvisor 需要实现以下功能:
- 读取整个磁盘的分区表(MBR 或 GPT);
- 识别各分区的文件系统格式(ext4、vfat、others);
- 为每个分区选择并加载对应的文件系统驱动;
- 统一通过 VFS(虚拟文件系统)接口进行访问;
- 尽量复用 StarryOS 的 VFS 实现,减少重复开发。
StarryOS 的文件系统模块为 axfs-ng,其架构设计可在 Axvisor 中复用与扩展。
- axfs-ng-vfs:提供文件系统抽象与基础操作接口。
- axfs-ng:包含路径解析、线程本地当前路径管理以及具体文件系统实现(如 ext4、vfat)。
三、总体架构
+-------------------------------------------------------------+
| 用户进程 / 应用层 |
+-------------------------------------------------------------+
| VFS 层 (axfs-ng-vfs) |
| - 文件系统抽象接口:open/read/write/mount/unmount... |
| - 路径解析与挂载点管理 |
| - 当前工作目录管理(thread-local) |
+-------------------------------------------------------------+
| 文件系统实现层 (axfs-ng) |
| - ext4、vfat 等具体文件系统驱动实现 |
| - 注册到 VFS 层统一调度 |
| - 实现 block、inode、dentry 层抽象 |
+-------------------------------------------------------------+
| 块设备与分区管理层 (blockdev) |
| - 磁盘访问抽象:读写、缓存、同步 |
| - 分区解析(MBR/GPT) |
| - 为每个分区创建独立 block_device 实例 |
+-------------------------------------------------------------+
| 设备驱动层 |
| - 硬件访问接口(SATA / NVMe / SD 等) |
+-------------------------------------------------------------+
四、模块划分与职责
1. axfs-ng-vfs:虚拟文件系统层
提供统一文件系统接口:
/// Trait for filesystem operations
pub trait FilesystemOps: Send + Sync {
/// Gets the name of the filesystem
fn name(&self) -> &str;
/// Gets the root directory entry of the filesystem
fn root_dir(&self) -> DirEntry;
/// Returns statistics about the filesystem
fn stat(&self) -> VfsResult<StatFs>;
/// Flushes the filesystem, ensuring all data is written to disk
fn flush(&self) -> VfsResult<()> {
Ok(())
}
}
-
管理挂载点表,支持多文件系统挂载;
-
提供路径解析和文件句柄管理;
-
支持线程本地的当前工作目录。
-
该层接口基本可直接复用 StarryOS 的现有 VFS 框架。
2. axfs-ng:文件系统实现层
-
各具体文件系统的实现(如 ext4、vfat);
-
提供标准接口并注册到 VFS;
-
实现基础元数据操作(blocks、inode、mode、nlink)。
示例文件系统结构:
pub struct FatFilesystem {
inner: Mutex<FatFilesystemInner>,
root_dir: Mutex<Option<DirEntry>>,
}
pub struct FatFilesystemInner {
pub inner: ff::FileSystem,
inode_allocator: Slab<()>,
_pinned: PhantomPinned,
}
3. 分区识别与文件系统探测
Axvisor 启动或检测到新磁盘时:
-
扫描整个磁盘;
-
解析分区表(支持 MBR / GPT);
对每个分区:
-
读取前若干扇区;
-
调用已注册文件系统的 detect() 接口;
-
根据识别结果匹配对应文件系统驱动;
-
调用该文件系统的 mount() 接口完成挂载。
探测机制
每种文件系统实现一个 detect() 接口,用于判断设备块是否属于该类型。
pub trait FilesystemDetect {
fn detect(bdev: &BlockDevice) -> bool;
}
系统启动流程:
for part in disk.partitions() {
if let Some(fs) = detect_fs(&part) {
vfs_mount(&part, fs)?;
} else {
log::warn!("Unknown filesystem on partition {}", part.id);
}
}
4. VFS 与文件系统的交互流程
以文件打开流程为例:
用户进程 open("/mnt/data/file.txt")
↓
axfs-ng-vfs 解析路径
↓
找到挂载点对应文件系统驱动(如 ext4)
↓
调用 ext4 的 open() 接口
↓
ext4 访问底层块设备
↓
读取 inode / dentry,返回文件描述符
确保了不同文件系统在用户视角下透明统一,且通过 VFS 实现了高层解耦
axvisor 中 fs 的结构
TODO( )
减少features的数量及多层依赖,保证文件系统的完整性
AsakuraMizu
Sub-issues
Metadata
Metadata
Assignees
Labels
No labels