我正在考虑开发针对嵌入式Linux项目(工业应用程序)的Yocto项目,对于那些具有嵌入式Linux经验的人,我有几个问题 - Yocto体验奖金。只需要了解固件更新中常用的内容。
我有一些要求,即身份验证,安全通信协议,如果更新失败,某种类型的回滚。此外,如果有一种方法可以逐步在整个设备上发布补丁,那么这也很有意思,因为我想避免使用现场的砖块设备。
如何在今天为现场设备部署更新/补丁 - 以及开发它需要多长时间?我还缺少其他考虑因素吗?
答案 0 :(得分:15)
虽然您当然可以使用rpm,deb或ipk进行升级,但我的首选方式(至少对于小到合理大小的图像)是将两个图像存储在闪存上,并且只更新完整的rootfs图像。
今天如果我开始使用OpenEmbedded / Yocto Project开始使用嵌入式Linux,我可能会看看meta-swupdate。
我自己和多个客户使用的内容更像是:
使用在升级文件中执行实际升级的脚本的好处是,您可以在一个步骤中执行将来需要的任何操作。我已经制作了特殊的升级映像,可以升级附加调制解调器的FW,或者提取一些额外的诊断信息,而不是执行实际的升级。这种灵活性将在未来得到回报。
为了使系统更加可靠,引导加载程序使用一个名为bootcount的功能,该功能可以启动尝试次数,如果此数字超过阈值,例如3,则引导加载程序选择引导另一个映像(如配置为启动的映像被认为是错误的)。这可确保图像完全损坏,另一个存储的图像将自动启动。
此方案的主要风险是您升级到图像,其升级机制已损坏。通常,我们还在引导加载程序中实现某种恢复机制,这样引导加载程序可以重新刷新一个全新的系统;虽然这种救援机制通常意味着数据分区(用于存储配置,数据库等)也将被删除。这部分是为了安全(不泄漏信息),部分是为了确保在此救援行动之后,我们将完全了解系统状态。 (当这是由远方缺乏经验的技术人员执行时,这是一个很大的好处)。
答案 1 :(得分:1)
如果您有足够的闪存存储,则可以执行以下操作。制作两个相同的分区,一个用于实时系统,另一个用于更新。让系统通过安全方法提取更新的映像,并将其直接写入另一个分区。它可以像插入闪存驱动器一样简单,USB插槽位于锁定板后面(物理安全性),或者使用带有适当主机和用户密钥的ssh / scp。使用sfdisk
交换分区,或者如果正确下载并正确写入图像,则仅编辑引导加载程序 的设置。如果没有,那么没有任何反应,旧固件继续存在,您可以稍后重试。如果需要逐步发布,请让客户端根据其MAC地址的最后一个字节选择一个映像。所有这些都可以在几个小时内通过一些简单的shellcript实现。或者实际测试它的几天:)
答案 2 :(得分:1)
关于您需要开发完整/强大/稳定解决方案的时间并不是一个简单的问题,但请注意应用程序的关键点,它会影响您的应用程序的市场感觉。特别是在第一次部署的早期/月份,通常发送更新以修复小/大青年错误。