我有一个在嵌入式 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/