swupdate实例
平台:imx8mm
系统:linux 4.4
如果需要系统了解swupdate,请参考文章:嵌入式系统更新swupdate分类
一.制作升级包
emmcsetup.lua用来描述update执行前的preinst()和执行后的postinst()
这里主要是preinst(),如果没有mmcblk1p2分区就创建一个。
sw-description主要描述升级包的情况
software =
{
version = "1.0.0.1"; //升级包版本号
imx8mmevk = {
hardware-compatibility: ["1.0"]; //匹配硬件
stable = {
copy1 : { //copy1的情况
images: (
{
filename = "fsl-image-validation-imx-imx8mmevk.ext4.gz"; //升级包rootfs的名字,需要是gz的格式
sha256 = "730ca9afd4cba2360f685ff4b6e8f5d00fa44001770d38e8505e3ec5a98bfd13"; //校验码
type = "raw";
compressed = true;
device = "/dev/mmcblk1p2"; //刷机的分区
}
);
scripts: (
{
filename = "emmcsetup.lua"; //lua脚本
type = "lua";
sha256 = "9351c163162a680131607fd03e26e8dfb8a9afbed0ab463884d24aa8eaa93a93" //校验码
}
);
};
copy2 : {
images: (
{
filename = "fsl-image-validation-imx-imx8mmevk.ext4.gz";
sha256 = "730ca9afd4cba2360f685ff4b6e8f5d00fa44001770d38e8505e3ec5a98bfd13";
type = "raw";
compressed = true;
device = "/dev/mmcblk1p3";
}
);
scripts: (
{
filename = "emmcsetup.lua";
type = "lua";
sha256 = "9351c163162a680131607fd03e26e8dfb8a9afbed0ab463884d24aa8eaa93a93"
}
);
};
}
}
}
校验码由sha256sum生成
示例:sha256sum fsl-image-validation-imx-imx8mmevk.ext4.gz > fsl-image-validation-imx-imx8mmevk.ext4.gz.sha256sum
cpio-package.sh打包升级包脚本
MODE="RSA"
CONTAINER_VER="1.0.0.1"
PRODUCT_NAME="adu-update-image-imx8mm"
//打包的所有文件的名字
FILES="sw-description sw-description.sig fsl-image-validation-imx-imx8mmevk.ext4.gz emmcsetup.lua"
#if you use RSA
if [ x"$MODE" == "xRSA" ]; then
openssl dgst -sha256 -sign openssl/priv.pem sw-description > sw-description.sig //生成校验文件
else
openssl cms -sign -in sw-description -out sw-description.sig -signer mycert.cert.pem \
-inkey mycert.key.pem -outform DER -nosmimecap -binary
fi
for i in $FILES;do
echo $i;done | cpio -ov -H crc > ${PRODUCT_NAME}_${CONTAINER_VER}.swu //用cpio打包
最后生成adu-update-image-imx8mm_1.0.0.1.swu升级包,拷贝到机器上。
生成私钥和公钥
首先,需要生成私钥
openssl genrsa -aes256 -out priv.pem
这里需要一个密码。可以从文件中去获取这个密码 - 当然,
这个密码文件必须保护好,防止被入侵。
openssl genrsa -aes256 -passout file:passout -out priv.pem
使用如下命令,从私钥导出公钥:
openssl rsa -in priv.pem -out public.pem -outform PEM -pubout
"public.pem" 包含了适用于swupdate的格式的密钥。
该文件可以通过-k参数在命令行传递给swupdate。
二.板子上进行升级
使用fw_printenv设置启动参数
升级
adu-update-image-imx8mm_1.0.0.1.swu是升级包,public.pem是公钥, swupdate.log升级过程的log
swupdate -v -i adu-update-image-imx8mm_1.0.0.1.swu -k /adukey/public.pem -e "stable,copy2" &>> /aduc-logs/swupdate.log
切换启动分区
fw_setenv mmcroot /dev/mmcblk1p3 //切换成mmcblk1p3 这个root分区启动,然后reboot