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