# Design — DragonOS dev 文档

备注

AI Translation Notice

This document was automatically translated by `hunyuan-turbos-latest` model, for reference only.

- Source document: kernel/filesystem/vfs/mountable_fs.md

- Translation time: 2025-06-29 09:58:15

- Translation model: `hunyuan-turbos-latest`

Please report issues via Community Channel

备注

Author: Zhuang Kaiye

Email: sparkhhhhhhhhhh@outlook.com

# Design

        graph TD
        subgraph 用户层 / 系统调用
            A[sys_mount] --> B[produce_fs!]
        end

        subgraph 文件系统注册与创建
            B --> C{查找 FSMAKER}
            C -- 找到匹配 --> D[FileSystemMaker::builder && FileSystemMaker::maker]
            D --> G[FileSystem 实例]
            G --> H[挂载成功]
            C -- 未找到 --> I[错误: EINVAL]
        end

        subgraph 文件系统实现者
            J[RamFS / 其他文件系统] --> K[实现 MountableFileSystem trait]
            K --> L[make_mount_data]
            K --> M[make_fs]
            L --> N[register_mountable_fs!宏]
            M --> N
        end

        N --> O[分布式切片 FSMAKER ]
        O --> C

        click J "#" "RamFS - 文件系统示例"
        click B "#" "produce_fs 函数"
        click O "#" "FSMAKER - 文件系统工厂数组"

## Process Description:

- A specific file system (e.g., `RamFS`) registers its creation logic with `FSMAKER` by implementing `MountableFileSystem trait` and using the `register_mountable_fs!` macro.

- Users request to mount a file system via the `sys_mount` system call.

- `sys_mount` calls the `produce_fs` function, passing the file system type, raw mount data, and source path.

- `produce_fs` traverses the global `FSMAKER` array to find a FileSystemMaker matching the requested file system type name.

- If found, it first calls `maker.builder` (which internally invokes the specific file system’s `make_mount_data` method) to process the raw data and generate an optional `mount_data` object.

- Next, it calls `maker.build` (which internally invokes the specific file system’s `make_fs` method), passing the mount_data generated in the previous step, thereby creating the file system instance.

- The successfully created file system instance (`Arc<dyn FileSystem>`) is returned and used for subsequent mount operations.

- If no matching file system type is found, an error is returned.

## Additional Notes

Currently, DragonOS supports mounting the following file systems: `ramfs`, `ext4`, and `vfat`. When mounting disk files in DragonOS, note the following:

- Since the system cannot directly determine the file system type of a disk, the target partition’s file system type must be explicitly known before mounting.

- The mount operation requires specifying the corresponding disk device name (located under /dev).

- These disk device files are generated by modifying the `tools/run-qemu.sh` startup script to load the prepared disk image files into the system. Examples of virtio disk device naming include `vda1` and `vdb1`. The device names of disks in DragonOS are automatically assigned based on the order in which images are loaded in `run-qemu.sh` (a, b, c, etc.), with numbers indicating partition numbers.

Therefore, to mount a disk currently, you can modify the `test-mount-ext4` executable to mount the specified disk file with the corresponding file system format. Below is an example of the mount operation:

    use core::ffi::{c_char, c_void};
    use libc::{mount, MS_BIND};
    use std::fs;
    use std::path::Path;

    fn main() {
        let ext4_path = Path::new("mnt/ext4");
        let dir = fs::create_dir_all(ext4_path);
        if dir.is_err() {
            panic!("mkdir /mnt/ext4 fail.");
        }

        // 硬盘名称，由传入顺序决定
        let source = b"/dev/vdb1\0".as_ptr() as *const c_char;
        let target = b"/mnt/ext4\0".as_ptr() as *const c_char;
        // 文件系统类型
        let fstype = b"ext4\0".as_ptr() as *const c_char;
        let flags = MS_BIND;
        let data = std::ptr::null() as *const c_void;
        let _ = unsafe { mount(source, target, fstype, flags, data) };

        println!("Mount successfully!");
    }

As for disk image creation, you can run `sudo bash tools/make_fs_image.sh` to simultaneously create disk images for `ext4` and `fat`. After entering the system, two additional disk files (`vdb1` and `vdc1`) will appear in the dev directory. You can then execute the `test-mount-ext4` and `test-mount-fat` test programs to verify the setup.

Other Versions v: V0.3.0

Tags
  V0.1.0
  V0.1.1
  V0.1.10
  V0.1.2
  V0.1.3
  V0.1.4
  V0.1.5
  V0.1.6
  V0.1.7
  V0.1.8
  V0.1.9
  V0.2.0
  V0.3.0
  V0.4.0

Branches
  master