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
 
posted @ 2020-11-19 16:38  luoyuna  阅读(3853)  评论(5编辑  收藏  举报