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