环境
- 开发板:PanGU Board stm32mp157
- boot:uboot
- kernel:linux
- rootfs:debian
制作img脚本
利用loop设备,可将分区表及分区的文件写入到img文件中;编写了一个制作img的脚本,如下
#!/bin/bash
set -e
#镜像名
IMG_FILE_NAME=stm32mp157.img
#源文件
BOOT_SPL_FILE_PATH=../uboot/u-boot-st/spl/u-boot-spl.stm32
BOOT_FILE_PATH=../uboot/u-boot-st/u-boot.img
KERNEL_FILE_PATH=../linux/linux-st/arch/arm/boot/uImage
DTB_FILE_PATH=../linux/linux-st/arch/arm/boot/dts/stm32mp157a-panguboard-hdmi-giantaxe.dtb
ROOTFS_DIR_PATH=../rootfs/debian/binary
###############################################################
#制作IMG
#删除之前的文件
if [ -d rootfs ]
then
rm -rf rootfs
fi
if [ -d boot ]
then
rm -rf boot
fi
if [ -f $IMG_FILE_NAME ]
then
rm -rf $IMG_FILE_NAME
fi
#检查文件是否存在
if [ -f $BOOT_SPL_FILE_PATH \
-a -f $BOOT_FILE_PATH \
-a -f $KERNEL_FILE_PATH \
-a -f $DTB_FILE_PATH \
-a -d $ROOTFS_DIR_PATH ]
then
echo "检测到源文件"
else
echo "源文件不存在"
exit
fi
#制作IMG文件
echo "填充0,生成空的镜像文件..."
dd if=/dev/zero of=$IMG_FILE_NAME bs=8M count=256
echo "填充完成"
#获取一个loop设备
LOOP_DEV_PATH=$(losetup -f)
LOOP_DEV_NAME=$(echo $LOOP_DEV_PATH | awk -F"/dev/" '{print $2}')
#关联loop设备与img
losetup $LOOP_DEV_PATH $IMG_FILE_NAME
echo "获取LOOP设备=${LOOP_DEV_PATH},关联到${IMG_FILE_NAME}"
#分区
echo "创建分区:"
sgdisk --resize-table=128 -a 1 \
-n 1:34:545 -c 1:fsbl1 \
-n 2:546:1057 -c 2:fsbl2 \
-n 3:1058:5153 -c 3:ssbl \
-n 4:5154:136225 -c 4:bootfs \
-n 5:136226: -c 5:rootfs \
-A 4:set:2 \
-p $LOOP_DEV_PATH -g
#使用kpartx将分区表映射到loopx
echo "将分区表映射到${LOOP_DEV_PATH}"
kpartx -av $LOOP_DEV_PATH
#格式化
echo "格式化分区"
mkfs.fat /dev/mapper/${LOOP_DEV_NAME}p4
mkfs.ext4 /dev/mapper/${LOOP_DEV_NAME}p5
#挂载
echo "挂载分区"
mkdir rootfs
mkdir boot
mount /dev/mapper/${LOOP_DEV_NAME}p4 boot
mount /dev/mapper/${LOOP_DEV_NAME}p5 rootfs
#写入
echo "写入数据到${IMG_FILE_NAME}..."
dd if=$BOOT_SPL_FILE_PATH of=/dev/mapper/${LOOP_DEV_NAME}p1 conv=fdatasync
dd if=$BOOT_SPL_FILE_PATH of=/dev/mapper/${LOOP_DEV_NAME}p2 conv=fdatasync
dd if=$BOOT_FILE_PATH of=/dev/mapper/${LOOP_DEV_NAME}p3 conv=fdatasync
cp $KERNEL_FILE_PATH boot
cp $DTB_FILE_PATH boot
cp -r ${ROOTFS_DIR_PATH}/* rootfs/
sync
echo "写入完成"
#卸载
echo "卸载分区"
umount boot
umount rootfs
#删除分区表映射
echo "删除分区表映射"
kpartx -dv $LOOP_DEV_PATH
#分离loop设备与img
echo "分离${LOOP_DEV_NAME} 和 ${IMG_FILE_NAME}"
losetup -d $LOOP_DEV_PATH
#删除临时文件
echo "删除临时文件"
rm -rf rootfs
rm -rf boot
echo "制作镜像(${IMG_FILE_NAME})完成! ^-^"
关注博主公众号,优质文章不断更新