53

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

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

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

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

要求是:

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

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

我已经研究过 Subversion,因为我们将它用于我们的源代码,但这不适用于 Linux 根文件系统(文件权限、特殊文件等)。

我现在已经创建了一些 shell 脚本,它们可以给我类似于 an 的东西,svn diff但我真的很想知道是否已经存在一个有效且经过测试的解决方案。

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

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

4

5 回答 5

34

我相信您对问题的看法是错误的-任何非原子更新(例如,dd文件系统映像,替换目录中的文件)都被设计破坏了-如果在更新过程中断电,则系统是对于嵌入式系统,电源可能会在升级过程中关闭。

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

[1] 本-优素福,吉拉德。“构建与墨菲兼容的嵌入式 Linux 系统。” Linux 研讨会。2005 年。

于 2011-08-04T11:26:49.253 回答
11

我绝对同意更新必须是原子的——我最近开始了一个开源项目,目标是为软件管理提供一种安全灵活的方式,包括本地和远程更新。我知道我的回答来得太晚了,但它可能会在下一个项目中帮助你。

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

斯特凡诺

于 2013-12-30T08:55:51.013 回答
2

原子性对于嵌入式设备至关重要,其中一个突出的原因是功率损耗;但可能还有其他硬件/网络问题。

原子性可能有点被误解了。这是我在更新程序上下文中使用的定义:

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

具有双 A/B 分区布局的完整映像更新是实现这一目标的最简单和最成熟的方法。

对于嵌入式 Linux,您可能需要更新多个软件组件以及可供选择的不同设计;这里有一篇更新的论文:https ://mender.io/resources/Software%20Updates.pdf

文件移至:https ://mender.io/resources/guides-and-whitepapers/_resources/Software%2520Updates.pdf

如果您正在使用 Yocto 项目,您可能会对Mender.io感兴趣——我正在从事的开源项目。它由客户端和服务器组成,目标是更快、更轻松地将更新程序集成到现有环境中;无需重新设计太多或花时间在自定义/本土编码上。它还将允许您使用服务器集中管理更新。

于 2016-08-04T22:35:57.523 回答
2

目前,有不少开源嵌入式 Linux 更新工具在成长,各有侧重。

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

一般来说,您可以在 Yocto Project Wiki 页面上找到有关系统更新的当前更新解决方案的一个很好的概述和比较:

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

于 2017-03-27T15:04:29.287 回答
0

您可以记录更新并将更新闪存分成两个插槽。电源故障总是将您返回到当前正在执行的插槽。最后一步是修改日志值。非原子的,没有办法让它变砖。即使在写入日志标志时失败。没有原子更新之类的东西。曾经。在我的生活中从未见过它。Iphone、adroid、我的网络交换机——它们都不是原子的。如果你没有足够的空间来做那种设计,那就修复设计。

于 2012-08-14T18:02:49.327 回答