Files
DragonOS/tools/make_fs_image.sh
T
1e574d89fa feat(fs): 补充mount系统调用,增加对硬盘挂载 & ext4文件系统的支持 (#1182)
主要变更:
* 实现完整的mount系统调用,支持从块设备挂载文件系统
* 新增ext4文件系统支持,基于another_ext4库实现
* 引入MountableFileSystem trait和文件系统工厂模式,提升VFS架构
* 完善块设备管理,自动将磁盘和分区注册到devfs(/dev)
* 支持virtio块设备的分区检测和挂载
* 新增umount2系统调用支持文件系统卸载
* 重构symlink相关系统调用,提升代码组织
* 提供硬盘镜像制作脚本和测试程序

技术细节:
- 支持ext4和vfat文件系统的挂载
- 实现MBR分区表解析和GenDisk管理
- 集成页面缓存支持提升文件系统性能
- 完善错误处理和设备号管理
- 新增详细的VFS挂载机制文档

测试验证:
- 新增test-mount-ext4和test-mount-fat测试程序
- 提供make_fs_image.sh脚本创建测试镜像
- 验证挂载、读写、卸载完整流程

Co-authored-by: Samuka007 <samuka007@dragon-os.org>
Co-authored-by: oeasy1412 <oeasy1412@gmail.com>
Co-authored-by: fslongjin <longjin@DragonOS.org>
2025-06-29 17:05:06 +08:00

65 lines
1.7 KiB
Bash
Executable File

#!/bin/bash
set -euo pipefail
# 检查是否以 root 权限运行
if [[ $EUID -ne 0 ]]; then
echo "错误:此脚本必须以 root 权限运行!"
exit 1
fi
# 获取项目根目录(无论从哪里调用脚本)
root_folder="$(cd "$(dirname "$0")/.." && pwd)"
echo "项目根目录:$root_folder"
mkdir -p "$root_folder/bin"
LOOP_DEVICE=""
# 自动清理 trap
cleanup() {
if [[ -n "${LOOP_DEVICE:-}" ]]; then
echo "清理:释放 loop 设备 $LOOP_DEVICE"
losetup -d "$LOOP_DEVICE" || echo "警告:无法释放 $LOOP_DEVICE"
fi
}
trap cleanup EXIT
# 创建 ext4 镜像
EXT4_IMG="ext4.img"
EXT4_SIZE="1G"
echo "创建 ext4 镜像 $EXT4_IMG 大小 $EXT4_SIZE"
dd if=/dev/zero of="$EXT4_IMG" bs=1M count=1024 status=progress
LOOP_DEVICE=$(losetup --find --show "$EXT4_IMG")
echo "loop 设备为 $LOOP_DEVICE"
echo "格式化为 ext4..."
mkfs.ext4 "$LOOP_DEVICE"
losetup -d "$LOOP_DEVICE"
LOOP_DEVICE=""
mv "$EXT4_IMG" "$root_folder/bin/$EXT4_IMG"
echo "ext4 镜像已保存到 $root_folder/bin/$EXT4_IMG"
# 创建 fat 镜像
FAT_IMG="fat.img"
FAT_SIZE="64M"
echo "创建 fat 镜像 $FAT_IMG 大小 $FAT_SIZE"
dd if=/dev/zero of="$FAT_IMG" bs=1M count=64 status=progress
# 创建分区表和分区
parted -s "$FAT_IMG" mklabel msdos
parted -s "$FAT_IMG" mkpart primary fat32 1MiB 100%
LOOP_DEVICE=$(losetup --find --partscan --show "$FAT_IMG")
PARTITION="${LOOP_DEVICE}p1"
echo "loop 设备为 $LOOP_DEVICE,分区为 $PARTITION"
sleep 1 # 等待内核识别分区
echo "格式化为 fat32..."
mkfs.vfat -F 32 "$PARTITION"
losetup -d "$LOOP_DEVICE"
LOOP_DEVICE=""
mv "$FAT_IMG" "$root_folder/bin/$FAT_IMG"
echo "fat 镜像已保存到 $root_folder/bin/$FAT_IMG"