为嵌入式Linux设备实现更新/升级系统

tre*_*nki 49 linux software-update embedded-linux

我有一个在嵌入式Linux设备上运行的应用程序,并且偶尔会对软件进行更改,有时也会对根文件系统甚至已安装的内核进行更改.

在当前的更新系统中,只删除旧应用程序目录的内容,并在其上复制新文件.当对根文件系统进行更改时,新文件将作为更新的一部分传递,并简单地复制到旧文件上.

现在,目前的方法存在一些问题,我正在寻找改善这种情况的方法:

  • 用于创建文件系统映像的目标的根文件系统未进行版本控制(我认为我们甚至没有原始rootfs).
  • 手动选择进入更新的rootfs文件(而不是diff)
  • 更新不断增长,成为一个皮塔饼.现在,更新/升级之间存在拆分,其中升级包含更大的rootfs更改.
  • 我的印象是,如果完全实现,更新中的一致性检查相当脆弱.

要求是:

  • 应用程序更新包不应太大,并且必须能够在已进行修改的情况下更改根文件系统.
  • 升级可以更大,只包含进入根文件系统的内容(如新库,内核等).更新可能需要安装升级.
    升级是否可以包含整个根文件系统,只需dd在目标的闪存驱动器上执行操作?
  • 创建更新/升级包应尽可能自动化.

我绝对需要一些方法来对根文件系统进行版本控制.这必须以某种方式完成,我可以从中计算某种diff可用于更新目标设备的rootfs的方法.

我已经查看了Subversion,因为我们将它用于源代码,但这对Linux根文件系统(文件权限,特殊文件等)不合适.

我现在已经创建了一些shell脚本,可以给我类似的东西,svn diff但我真的想知道是否已经存在一个可行的,经过测试的解决方案.

使用这样diff的我认为升级将简单地成为包含基于已知根文件系统状态的增量更新的包.

你对此有何看法和想法?你会如何实现这样的系统?我更喜欢一个简单的解决方案,可以在不太长的时间内实现.

gby*_*gby 32

我相信你在这个问题上看错了 - 任何非原子的更新(例如dd文件系统映像,替换目录中的文件)都会被设计破坏 - 如果电源在更新过程中断电,系统就是砖和嵌入式系统,电源可以在升级过程中熄灭.

我写了一篇关于如何在嵌入式Linux系统上正确升级/更新的白皮书[1].它在OLS上发布.你可以在这里找到论文:https://www.kernel.org/doc/ols/2005/ols2005v1-pages-21-36.pdf

[1] Ben-Yossef,Gilad."构建与Murphy兼容的嵌入式Linux系统." Linux研讨会.2005年.

  • 如果您的答案可以涵盖论文的基本要点,以防链接被破坏或难以获得,那将会很棒. (4认同)
  • 尽管来自浏览器的证书警告,链接仍然不会被破坏. (2认同)

小智 9

我完全同意更新必须是原子的 - 我最近开始了一个开源项目,其目标是为本地和远程更新提供安全,灵活的软件管理方式.我知道我的答案来得很晚,但它可能会帮助你完成下一个项目.

您可以在以下位置找到"swupdate"(项目名称)的来源github.com/sbabic/swupdate.

斯特凡诺