我正在考虑在 Yocto 项目上开发一个嵌入式 Linux 项目(工业应用程序),我有几个问题想问那些有嵌入式 Linux 经验的人——Yocto 经验是加分项。我只需要了解一下固件更新中通常做什么。
我有几个要求,即身份验证、安全通信协议、更新失败时的某种回滚。此外,如果有办法逐步在所有设备上发布补丁,那也会很有趣,因为我想避免现场设备变砖。
您目前如何将更新/补丁部署到现场设备?开发它需要多长时间?我还遗漏了其他考虑因素吗?
答案1
您可以查看 Yocto 的 Wiki,其中有一个关于更新的部分:
答案2
在考虑安全通信渠道和回滚机制之前,我认为您应该花一些时间研究以下主题,从长远来看,这将更为重要:
版本控制:随着时间的推移,您的嵌入式平台将出现不同的版本,并非所有版本都具有相同的功能。您的设备需要能够检查其收到的升级是否兼容并且可以应用。
规划升级路径:您不知道 5 年后系统会变成什么样子,但您希望当前的系统能够容纳您即将开发的固件。此类升级可能需要多个步骤,这些步骤应记录在案。
不要忘记降级:有时你会引入一些更改,导致无法降级。你想如何处理它们?
以下是一些有关技术细节的想法:
身份验证和安全通信通道:只要您的设备具有验证已收到升级的机制,通信通道的确切属性就变得不那么重要了。该验证需要检查数据是否持续的和兼容的。
回滚:可以使用两个长度相等的分区来保存整个操作系统,从而实现一种简单的机制。最好将操作系统设置为只读模式,并将可能更改的数据放在单独的分区上。
引导加载程序需要一个引导标志来告诉它要引导哪个分区。它将始终尝试首先从该分区引导,如果失败则返回到其他分区。该引导标志可以存储在引导加载程序可以访问的任何位置。
要升级设备,您需要将新系统(一旦验证)复制到当前非活动分区,更改启动标志并重新启动。在系统的 init 脚本中,您可以检查它是否从预期分区启动。如果没有,则出现问题,您可以采取适当的措施。