嵌入式系统USB更新通过opkg



我需要为客户提供一个更新文件,以便通过USB更新嵌入式系统。该系统是使用Yocto构建的。我很好奇,如果我必须实现USB更新的计划是可行的,或者如果我错过了一些应该是显而易见的。

opkg在系统上存在,但是为了使用opkg update,它需要有一个repo来提取。由于我没有网络功能,我需要将整个回购放在USB驱动器上。由于我需要向客户提供单个文件,因此repo将需要是tar文件。

程序
  1. 插入u盘
  2. udev规则调用脚本并将其推送到后台,因为这将是一个漫长的过程(参见此)
  3. 卸载repo更新文件
  4. opkg update
  5. 通知用户他们可以删除USB驱动器

至少从高级别的角度来看,这听起来像是通过USB更新嵌入式系统的好方法吗?可能存在哪些陷阱?

您的用例由SWUpdate覆盖-也许值得看看我的项目(github.com/sbabic/swupdate)。使用单个映像文件从USB升级是用例之一,您可以使用meta-swupdate(在openenembedded上列出)生成具有所有工件的单个映像。

关于可能存在的陷阱,最大的陷阱之一可能是过程中的停电。在这种情况下你如何恢复?(答案可能取决于你制作的嵌入式设备类型)。(就个人而言,我更倾向于基于完整映像的升级,而不是基于软件包的升级)。

关于你的tarball的场景,你的设备上有足够的空间来解压吗?与opkg存储库一起分发tarball可能更明智,例如分发存储库的ext2或压缩映像。这将允许您使用环回设备从USB驱动器挂载它。

除此之外,只要你有一个与用户沟通的好方法,你的方法就应该有效。主要问题是在升级过程中断的情况下你该怎么做。这是你需要提前考虑的事情。

在决定更新格式和设计时,有几件事需要考虑;包括你想要更新的内容(例如内核,应用程序,引导加载程序);这里有一篇关于最流行设计的论文:https://mender.io/user/pages/04.resources/_white-papers/Software%20Updates.pdf

在您的情况下(没有网络,USB上有大量可用的存储空间),最简单的方法可能是完全更新rootfs。我参与了一个开源项目Mender。它做了双a/B rootfs更新,并与Yocto项目集成,使其轻松,快速地启用设备上的更新,而无需自定义底层编码。

最新更新