:::{note} 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
:::
:::{note} Author: Zhuang Kaiye
Email: sparkhhhhhhhhhh@outlook.com :::
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 - 文件系统工厂数组"
RamFS
) registers its creation logic with FSMAKER
by implementing MountableFileSystem trait
and using the register_mountable_fs!
macro.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.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.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.Arc<dyn FileSystem>
) is returned and used for subsequent mount operations.Currently, DragonOS supports mounting the following file systems: ramfs
, ext4
, and vfat
. When mounting disk files in DragonOS, note the following:
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.