升级嵌入式设备的固件通常意味着更新整个系统,而不仅仅是替换文件。完整的系统更新确实有导致系统无法启动的风险,例如,在更新过程中断电。双引导机制(复制系统分区并在未使用的分区上执行更新)确保设备始终能够引导。

双份副本,有后撤

双引导系统的eMMC被重新划分为具有重复的系统分区:linux和rootfs。系统知道哪一对分区是“活动”系统,因此对“非活动”分区执行系统更新。

下面的图像显示了分区设置和更新过程。

ConnectCore 8M纳米开发套件连接

使用双引导机制,即使在断电的情况下,更新也是安全的。不需要恢复内核,因为有两个副本保证可以更新非活动引导分区。成功安装新系统映像后,引导加载程序将加载新映像。一旦引导成功,更新后的映像就被认为是活动系统。

为双启动准备的构建映像

Digi Embedded Yocto默认映像默认不包括双启动支持。要构建具有双启动支持的映像,请编辑项目的镜像conf / bblayers.conf配置文件,并添加meta-digi-dualboot通过添加以下行添加图层:

conf / bblayers.conf
< DEY-INSTALLDIR >/ / meta-digi-dualboot来源

在哪里< DEY-INSTALLDIR >是你的Digi Embedded Yocto安装文件夹。

您构建的映像现在将包括双引导支持。的meta-digi-dualboot层修改不同的脚本和软件更新(SWU)映像以使用双系统分区。

为目标准备双启动

有两种方法可以为双引导准备目标:

自动模式

该方法使用U-Boot中定义的默认分区表,并在A和B分区上首次部署所有系统固件。

  1. 启用U-Boot环境变量dualboot

    =>设置双启动是=>saveenv
  2. 运行一个固件安装脚本,例如:

    • 使用uu编程固件:

      =>fastboot 0

      然后在主机PC上运行安装脚本。看到程序固件使用uu供参考。

    • 使用microSD卡编程固件:

      插入带有固件和SD安装脚本的microSD卡并运行:

      =>运行install_linux_fw_sd

      看到程序固件使用microSD卡供参考。

在两个系统分区(A和B)上部署第一个固件后,引导设备。系统现在可以进行双启动了。

检查执行后续固件更新有关在双引导设备上更新固件的信息。

手动模式

该方法使用手动操作创建分区表,并在两个系统分区上首次部署固件。

创建分区表

  1. 启用U-Boot环境变量dualboot

    =>设置双启动是=>saveenv
  2. 修改双引导分区表。唯一的要求是有四个分区,名称如下:linux_arootfs_alinux_brootfs_b

    你可以创建你的自定义分区表或在U-Boot中运行以下脚本创建用于双引导的预定义分区

    =>运行partition_mmc_linux
  3. 检查新的分区表:

    =>mmc的部分

执行首次固件部署

使用U-Boot执行第一次固件部署,更新系统A和系统B的分区。

看到从U-Boot程序固件有关从U-Boot更新分区的说明。例如,通过TFTP更新:

=>更新linux_a TFTP< boot文件>.boot.vfat=>更新rootfs_a TFTP< rootfs-file >.rootfs.ext4=>更新linux_b TFTP< boot文件>.boot.vfat=>更新rootfs_b TFTP< rootfs-file >.rootfs.ext4

在两个系统分区(A和B)上部署第一个固件后,引导设备。系统现在可以进行双启动了。

检查执行后续固件更新有关在双引导设备上更新固件的信息。

执行后续固件更新

要使用双引导系统,必须从Linux执行后续更新,可以在本地执行,也可以使用Remote Manager远程执行。

使用本地文件更新

  1. 创建软件更新* .swu文件中使用的指令构建软件更新包

  2. 复制软件更新* .swu文件到外部存储设备,如USB盘或microSD卡。如果有足够的空闲空间,还可以将其保存到设备的eMMC中。

  3. 运行firmware-update-dual.sh的脚本* .swu文件作为参数:

    firmware-update-dual.sh< /路径/ your-filename >.swu

该机制更新非活动系统分区上的固件。如果更新过程成功,目标将重新引导到新的系统映像中。

如果目标启动成功,则新映像将成为当前映像活跃的系统。

如果目标引导新系统失败,双引导机制将增加引导尝试计数器,并等待用户(或看门狗)重新引导设备。如果目标器启动失败,则U-Boot变量中设置的启动次数bootlimit(默认为3),双引导机制将切换回引导先前活动的系统。

使用Digi远程管理器更新

使用远程管理器更新固件浏览有关透过远端管理器更新系统的资料。

meta-digi-dualboot图层修改firmware_download_path田野/etc/cc.conf配置文件/home/root作为保存路径.swu远程管理器传输的文件。考虑是否要将此路径更改为外部媒体,如果*swu的大小映像无法装入分区。

启用看门狗

默认情况下,双引导机制不启用看门狗。为了保证更新不会导致系统阻塞(特别是在远程更新时),Digi建议启用看门狗计时器,以便在启动失败时重置设备。

看到监管机构有关启用和使用看门狗的信息。

在典型用例中,用户空间应用程序或服务启动看门狗。但是,如果系统在到达这个点之前挂起,看门狗就不能重置设备。

在本例中,您可以添加恐慌= 10到内核参数,以便在内核panic后10秒(或您选择的任意秒数)强制重新启动。要将此参数添加到内核参数中,在U-Boot上运行以下命令:

=>设置extra_bootargs panic=10=>saveenv

禁用双启动

从双引导系统切换到标准系统:

  1. 禁用U-Boot环境变量dualboot

    =>设置双启动号=>saveenv
  2. 为标准引导修改分区表。

    你可以创建你的自定义分区表或者在U-Boot中运行以下脚本,为标准引导创建预定义分区:

    =>运行partition_mmc_linux
  3. 删除meta-digi-dualboot从你的项目的图层conf / bblayers.conf

  4. 重建你的形象。

执行动态更新

双引导分区布局缺乏在目标机上下载固件文件的存储空间。要在没有足够存储空间的系统上更新映像,请使用Digi Remote Manager实时功能。启用动态模式后,更新进程以块的形式下载软件更新文件(swu),并将它们直接写入分区。

启用即时更新的数字远程管理器

云连接器是一种与Remote Manager通信的服务,Remote Manager是Digi的远程管理设备的平台。在Digi Cloud Connector中,默认情况下不启用即时更新功能。要动态启用,请修改/etc/cc.conf目标上的Cloud Connector配置文件:

/etc/cc.conf
on_the_fly真正的

命令将新固件安装到目标上云连接器应用程序。

动态支持不适用于压缩的根文件系统映像(*.gz)。