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

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

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

现在,目前的方法有几个问题,我正在寻找方法来改善这种情况:

  • 用于创build文件系统映像的目标的根文件系统没有版本化(我认为我们甚至没有原始的rootfs)。
  • 进入更新的rootfs文件是手动select的(而不是diff)
  • 更新不断增长,并成为皮塔饼。 升级包含更大的rootfs更改的升级/升级之间现在是分开的。
  • 我有这样的印象,即一旦更新的一致性检查是相当脆弱的,如果在所有的实施。

要求是:

  • 应用程序更新程序包不应太大,并且必须能够在修改已完成的情况下更改根文件系统。
  • 升级可能会更大,只包含进入根文件系统的内容(如新库,内核等)。 更新可能需要升级才能安装。
    升级包含整个根文件系统,只需在目标的闪存驱动器上做一个dd
  • 创build更新/升级包应尽可能自动。

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

我已经看过Subversion,因为我们使用它来源代码,但是这对Linux根文件系统(文件权限,特殊文件等)是不合适的。

我现在创build了一些shell脚本,可以给我一些类似于svn diff shell脚本,但是我真的很想知道是否已经存在一个工作和testing的解决scheme。

使用这样的diff ,我想升级将成为一个包含基于已知根文件系统状态的增量更新的包。

你对此有什么想法和想法? 你将如何实施这样一个系统? 我更喜欢一个简单的解决scheme,可以在不太多的时间内实现。

我相信你看这个问题是错误的 – 任何更新是非primefaces的(例如dd文件系统映像,replace目录中的文件)被devise破坏 – 如果在更新过程中断电,系统是而对于embedded式系统而言,电源在升级过程中可能会消失。

我已经写了一篇关于如何在embedded式Linux系统上正确地升级/更新的白皮书[1]。 它在OLS上呈现。 你可以在这里find这篇论文: https : //www.kernel.org/doc/ols/2005/ols2005v1-pages-21-36.pdf

Ben-Yossef,吉拉德。 “build立Murphy兼容的embedded式Linux系统” Linux研讨会 。 2005年。

我绝对同意,更新必须是primefaces – 最近我开始了一个开源项目,目标是为软件pipe理提供一个安全和灵活的方式,同时进行本地和远程更新。 我知道我的答案来得很晚,但也许可以帮助你下一个项目。

您可以在github.com/sbabic/swupdatefind“swupdate”(项目名称)的github.com/sbabic/swupdate

斯特凡诺

目前,有不less开源embedded式Linux更新工具在不断增长,各有不同的重点。

另一个值得一提的是RAUC ,它着重于处理目标上已签名更新包的安全和primefaces安装,同时在适应您的应用程序和环境方面非常灵活。 来源在GitHub上: https : //github.com/rauc/rauc

总的来说,您可以在Yocto Project Wiki页面上find关于系统更新的最新更新解决scheme的概述和比较:

https://wiki.yoctoproject.org/wiki/System_Update

primefaces性对于embedded式设备是至关重要的,原因之一就是功率损耗; 但也可能有其他硬件/networking问题。

primefaces性可能有点误解, 这是我在更新程序中使用的定义:

  • 更新总是要么完全完成,要么完全不完成
  • 除了更新程序之外,没有任何软件组件会看到安装更新的一半

使用双A / B分区布局进行完整映像更新是实现此目的最简单和最经validation的方式。

对于embedded式Linux,有几个软件组件可能需要更新,有不同的devise可供select; 这里有一个更新的文件: https : //mender.io/resources/Software%20Updates.pdf

如果您正在使用Yocto项目,您可能对Mender.io感兴趣 – 我正在开发的开源项目。 它由客户端和服务器组成,目标是使更新程序集成到现有环境中更快更容易。 而不需要重新devise太多或花费时间在自定义/本土编码上。 它也将允许您与服务器集中pipe理更新。

您可以logging更新并将更新闪存分为两个插槽。 电源故障总是使您返回到当前正在执行的插槽。 最后一步是修改日记账的价值。 非primefaces,没有办法使它砖。 即使它在写日志标记的时刻也是失败的。 没有像primefaces更新这样的东西。 永远。 从来没有在我的生活中看到它。 Iphone,adroid,我的networking交换机 – 它们都不是primefaces的。 如果你没有足够的空间做这样的devise,那么修复devise。

    Interesting Posts