首页 文章

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

提问于
浏览
48

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

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

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

  • 用于创建文件系统映像的目标的根文件系统未进行版本控制(我认为我们甚至没有原始rootfs) .

  • 手动选择进入更新的rootfs文件(而不是diff)

  • 更新不断增长,成为皮塔饼 . 现在,更新/升级之间存在拆分,其中升级包含更大的rootfs更改 .

  • 我的印象是,如果完全实现,更新中的一致性检查相当脆弱 .

要求是:

  • 应用程序更新包不应太大,并且必须能够在已进行修改的情况下更改根文件系统 .

  • 升级可以更大,只包含进入根文件系统的内容(如新库,内核等) . 更新可能需要安装升级 .
    升级是否可以包含整个根文件系统,只需在目标的闪存驱动器上执行 dd

  • 创建更新/升级包应尽可能自动化 .

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

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

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

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

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

5 回答

  • 2

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

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

    [1] Ben-Yossef,Gilad . "Building Murphy-compatible embedded Linux systems." Linux研讨会 . 2005年 .

  • 31

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

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

    斯特凡诺

  • 0

    目前,有不少开源嵌入式Linux更新工具在不断发展,每个工具都有不同的侧重点 .

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

    通常,您可以在Yocto Project Wiki页面上找到有关系统更新的当前更新解决方案的良好概述和比较:

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

  • 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感兴趣 - 我正在开发的开源项目 . 它由客户端和服务器组成,目标是制作将更新程序集成到现有环境中更快更容易;无需重新设计太多或花时间在自定义/自行开发的编码上 . 它还允许您使用服务器集中管理更新 .

  • 9

    您可以记录更新并将更新闪存划分为两个插槽 . 电源故障始终会使您返回当前正在执行的插槽 . 最后一步是修改日记帐值 . 非原子,没有办法使它砖 . 即使它在写日记标志的那一刻失败了 . 没有原子更新这样的东西 . 永远 . 在我的生活中从未见过它 . Iphone,adroid,我的网络交换机 - 它们都不是原子的 . 如果您没有足够的空间来进行这种设计,那么请修改设计 .

相关问题