Skip to content

new-vfs 文件系统 #289

@Josen-B

Description

@Josen-B

一、问题描述

当前 Axvisor 的文件系统仅支持单一文件系统格式(例如仅支持 ext4 或 vfat),无法根据不同磁盘分区自动识别并挂载对应文件系统。
这在需要同时访问多种文件系统(如一个分区为 FAT32,用于引导;另一个为 EXT4,用于系统文件)的场景中存在限制

二、设计目标

为了支持多分区和多文件系统,Axvisor 需要实现以下功能:

  1. 读取整个磁盘的分区表(MBR 或 GPT);
  2. 识别各分区的文件系统格式(ext4、vfat、others);
  3. 为每个分区选择并加载对应的文件系统驱动;
  4. 统一通过 VFS(虚拟文件系统)接口进行访问;
  5. 尽量复用 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的数量及多层依赖,保证文件系统的完整性

Sub-issues

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions