制作stm32mp157 img

本文详细描述了如何使用bash脚本在STM32MP157开发板上制作包含U-Boot、Linux内核和Debianrootfs的img文件,涉及删除旧文件、创建分区、挂载并写入数据,最后卸载和清理过程。
摘要由CSDN通过智能技术生成

环境

  • 开发板: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})完成! ^-^"

关注博主公众号,优质文章不断更新
在这里插入图片描述

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最好有梦想~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值