备注
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
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 withFSMAKER
by implementingMountableFileSystem trait
and using theregister_mountable_fs!
macro.Users request to mount a file system via the
sys_mount
system call.sys_mount
calls theproduce_fs
function, passing the file system type, raw mount data, and source path.produce_fs
traverses the globalFSMAKER
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’smake_mount_data
method) to process the raw data and generate an optionalmount_data
object.Next, it calls
maker.build
(which internally invokes the specific file system’smake_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 includevda1
andvdb1
. The device names of disks in DragonOS are automatically assigned based on the order in which images are loaded inrun-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.