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

标签 linux embedded-linux software-update

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

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

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

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

要求是:

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

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

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

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

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

您对此有何想法和想法?您将如何实现这样的系统?我更喜欢可以在短时间内实现的简单解决方案。

最佳答案

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

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

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

关于linux - 为嵌入式 Linux 设备实现更新/升级系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6937592/

相关文章:

linux - 当套接字没有指定源IP地址时,Linux如何选择IP地址?

java - 为什么我可以在 Docker 中运行 svn?

xcode - 工作副本需要比 Xcode 支持的更新版本的 Subversion

linux - Foresight linux repo 需要重建

linux - 只读取 linux 文件中特定模式前的两个字符

linux-kernel - 如何从 ARM v7 上的 Linux 内核空间刷新 L1 和 L2 缓存中的地址范围?

java - IntelliJ 终端 - 更新且不再能够从终端运行脚本

c - 为什么我的小C循环不能正确打印到帧缓冲区,但是展开的版本可以打印?

c++ - Jetson TK1 - 嵌入式 Linux - 如何定期中断