xref: /DragonOS/tools/create_hdd_image.sh (revision c75089286e9d49cef8d039446bf570c1bd4d2550)
17f439c5dSYJwu2023########################################################################
27f439c5dSYJwu2023# 这是一个用于创建磁盘镜像的脚本
37f439c5dSYJwu2023# 用法:./create_hdd_image.sh -P MBR/GPT
4*c7508928SLoGin# 要创建一个MBR分区表的磁盘镜像,请这样运行它: ARCH=x86_64 bash create_hdd_image.sh -P MBR
5*c7508928SLoGin# 要创建一个GPT分区表的磁盘镜像,请这样运行它: ARCH=x86_64 bash create_hdd_image.sh -P GPT
67f439c5dSYJwu2023# 请注意,这个脚本需要root权限
77f439c5dSYJwu2023# 请注意,运行这个脚本之前,需要在您的计算机上安装qemu-img和fdisk,以及parted
87f439c5dSYJwu2023#
9*c7508928SLoGin# 这个脚本会在当前目录下创建一个名为disk-${ARCH}.img的文件,这个文件就是磁盘镜像,
107f439c5dSYJwu2023#       在完成后,会将这个文件移动到bin目录下
117f439c5dSYJwu2023########################################################################
12ac50ebebSzhujikuan
13*c7508928SLoGinecho "create_hdd_image.sh: Creating virtual disk image... arch=${ARCH}"
14*c7508928SLoGin
15*c7508928SLoGin# 给变量赋默认值
16*c7508928SLoGinexport ARCH=${ARCH:=x86_64}
17*c7508928SLoGin
18*c7508928SLoGinDISK_NAME=disk-${ARCH}.img
19*c7508928SLoGin
207f439c5dSYJwu2023format_as_mbr() {
217f439c5dSYJwu2023    echo "Formatting as MBR..."
22d395ce89Sfslongjin   # 使用fdisk把disk.img的分区表设置为MBR格式(下方的空行请勿删除)
23*c7508928SLoGinfdisk ${DISK_NAME} << EOF
24ac50ebebSzhujikuano
25ac50ebebSzhujikuann
26ac50ebebSzhujikuan
27ac50ebebSzhujikuan
28ac50ebebSzhujikuan
29ac50ebebSzhujikuan
305ed4cd46Sguanjinquana
31d395ce89Sfslongjinw
32ac50ebebSzhujikuanEOF
33621e65feSfslongjin
347f439c5dSYJwu2023}
357f439c5dSYJwu2023
367f439c5dSYJwu2023format_as_gpt() {
377f439c5dSYJwu2023    echo "Formatting as GPT..."
38*c7508928SLoGinsudo parted ${DISK_NAME}  << EOF
397f439c5dSYJwu2023mklabel gpt
407f439c5dSYJwu2023y
417f439c5dSYJwu2023mkpart
427f439c5dSYJwu2023p1
437f439c5dSYJwu2023FAT32
447f439c5dSYJwu20230
457f439c5dSYJwu2023-1
467f439c5dSYJwu2023I
477f439c5dSYJwu2023set
487f439c5dSYJwu20231
497f439c5dSYJwu2023boot
507f439c5dSYJwu2023on
517f439c5dSYJwu2023print
527f439c5dSYJwu2023q
537f439c5dSYJwu2023EOF
547f439c5dSYJwu2023}
557f439c5dSYJwu2023
567f439c5dSYJwu2023echo "Creating virtual disk image..."
577f439c5dSYJwu2023ARGS=`getopt -o P: -- "$@"`
582f6f547aSGnoCiYeH# 创建一至少为256MB磁盘镜像(类型选择raw)
59*c7508928SLoGinqemu-img create -f raw ${DISK_NAME} 2048M
607f439c5dSYJwu2023#将规范化后的命令行参数分配至位置参数($1,$2,...)
617f439c5dSYJwu2023eval set -- "${ARGS}"
627f439c5dSYJwu2023#echo formatted parameters=[$@]
637f439c5dSYJwu2023#根据传入参数进行MBR/GPT分区
647f439c5dSYJwu2023case "$1" in
657f439c5dSYJwu2023    -P)
667f439c5dSYJwu2023        if [ $2 == "MBR" ];
677f439c5dSYJwu2023        then
687f439c5dSYJwu2023            format_as_mbr
697f439c5dSYJwu2023        elif [ $2 == "GPT" ];
707f439c5dSYJwu2023        then
717f439c5dSYJwu2023            format_as_gpt
727f439c5dSYJwu2023        else
737f439c5dSYJwu2023            echo "Invalid partition type: $2"
747f439c5dSYJwu2023            exit 1
757f439c5dSYJwu2023        fi
767f439c5dSYJwu2023        ;;
777f439c5dSYJwu2023    --)
787f439c5dSYJwu2023        # 如果没有传入参数-P,则默认为MBR分区
797f439c5dSYJwu2023        format_as_mbr
807f439c5dSYJwu2023        ;;
817f439c5dSYJwu2023    *)
827f439c5dSYJwu2023        echo "Invalid option: $1"
837f439c5dSYJwu2023        exit 1
847f439c5dSYJwu2023        ;;
857f439c5dSYJwu2023esac
867f439c5dSYJwu2023
87*c7508928SLoGin
88*c7508928SLoGinLOOP_DEVICE=$(sudo losetup -f --show -P ${DISK_NAME}) \
89900f1865Sfslongjin    || exit 1
90900f1865Sfslongjinecho ${LOOP_DEVICE}p1
91900f1865Sfslongjinsudo mkfs.vfat -F 32 ${LOOP_DEVICE}p1
92900f1865Sfslongjinsudo losetup -d ${LOOP_DEVICE}
93900f1865Sfslongjin
94900f1865Sfslongjinecho "Successfully created disk image."
95900f1865Sfslongjinmkdir -p ../bin
96*c7508928SLoGinchmod 777 ${DISK_NAME}
97*c7508928SLoGinmv ./${DISK_NAME} ../bin/
98