embedded式Linux – 部署固件更新的机制?

我正在考虑在Yocto项目中开发一个embedded式Linux项目(一个工业应用程序),对于那些在embedded式Linux方面有经验的人,我有一些问题 – Yocto会有奖金。 只需要了解固件更新中常用的function。

我有一些要求,即身份validation,一个安全的通信协议,如果更新失败的某种types的回滚。 另外,如果有一种方法可以逐渐在整个设备上释放补丁,那么这也是一个有趣的现象,因为我想避免在现场使用设备。

如何将更新/修补程序部署到现场设备 – 开发它需要多长时间? 有什么其他的考虑我缺less?

Solutions Collecting From Web of "embedded式Linux – 部署固件更新的机制?"

虽然你当然可以使用rpm,deb或者ipk来升级,但是我的首选方式是(至少对于小到合理大小的映像),在闪存上保存两张图片,并且只更新完整的rootfs映像。

今天,如果我要使用OpenEmbedded / Yocto Project开始使用嵌入式Linux,可能会考虑meta-swupdate。

我一直在为自己和多个客户使用的东西更像这样:

  • 容器升级文件,是由另一个tarball(以下称为升级文件)组成的tarball,升级文件的md5sum,通常是gpg签名。
  • 存储在正在运行的映像中的更新程序脚本。 此脚本负责解包升级文件的外部容器,使用md5sum验证升级文件的正确性,并经常验证加密签名(通常以gpg为基础)。 如果更新文件通过了这些测试,则更新程序脚本将在更新文件中查找升级脚本,并执行此操作。
  • 更新文件中的升级脚本执行实际升级,即正常重写非运行映像,提取和重写内核,如果这些步骤成功,则指示引导加载程序使用新编写的内核和映像,而不是当前运行的系统。

在升级文件中执行实际升级的脚本的好处是,您可以在一个步骤中做到您将来需要的任何内容。 我制作了升级附加调制解调器固件的特殊升级映像,或者提取了一些额外的诊断信息,而不是执行实际的升级。 这种灵活性将在未来得到回报。

为了使系统更加可靠,引导加载程序用户使用了一个称为bootcount的功能,该功能可以引导尝试的次数,如果该数字超过阈值(例如3),引导加载程序选择引导另一个映像(如配置为映像被启动被认为是有缺陷的)。 这确保了图像完全损坏,另一个存储的图像将自动启动。

此方案的主要风险是您升级到升级机制被破坏的映像。 通常情况下,我们在bootloader中也实现了一些恢复机制,使得bootloader可以刷新一个全新的系统; 尽管这种救援机制通常意味着数据分区(用于存储配置,数据库等)也将被删除。 这部分是为了安全(不泄漏信息),部分是为了确保在这次救援行动之后,我们完全知道系统状态。 (这是由一个没有经验的技术人员在很远的地方进行的)。

@Anders的答案是完整的,非常好的。 我可以添加的唯一的建议是想一些事情:

  • 你的应用程序有一个互联网连接/ USB / SD卡存储一个完整的新的rootfs? 使用Linux嵌入式不像在Cortex M3上写一个128K固件
  • 你的最终用户有能力做更新工作吗?
  • 您的应用程序是否安装在远程控制的可访问区域?

关于开发完整/健壮/稳定的解决方案的时间不是一个简单的问题,而是记录应用程序的关键点,这些应用程序会影响应用程序的市场感受。 特别是在第一次部署的早期/月份,通常发送更新来修复小/大的青少年错误。

如果您有足够的闪存,则可以执行以下操作。 制作两个相同的分区,一个用于实时系统,另一个用于更新。 让系统通过一个安全的方法把更新后的图像拉出来,然后直接写入另一个分区。 它可以像插入闪存驱动器一样简单,USB插槽位于锁定板的后面(物理安全),或者使用带有适当的主机和用户密钥的ssh / scp。 使用sfdisk交换分区,或者只有在下载并正确写入映像的情况下编辑引导加载程序的设置。 如果没有,那么什么也没有发生,旧的固件继续存在,你可以稍后再试。 如果您需要逐步发布,则让客户端根据其MAC地址的最后一个字节选择一个映像。 所有这些都可以在几个小时内用几个简单的shell脚本实现。 或几天实际测试它:)