我有一个在嵌入式 Linux 设备上运行的应用程序,并且时不时地对软件进行更改,有时还会对根文件系统甚至安装的内核进行更改。
在当前的更新系统中,只需删除旧应用程序目录的内容,然后将新文件复制到其上。当对根文件系统进行更改时,新文件将作为更新的一部分提供,并简单地复制到旧文件上。
现在,当前的方法存在几个问题,我正在寻找改善这种情况的方法:
- 用于创建文件系统映像的目标的根文件系统没有版本控制(我认为我们甚至没有原始的 rootfs)。
- 进入更新的 rootfs 文件是手动选择的(而不是 diff)
- 更新不断增长,这就变成了皮塔饼。现在更新/升级之间存在分歧,其中升级包含更大的 rootfs 更改。
- 我的印象是,更新中的一致性检查如果真的实施的话,也是相当脆弱的。
要求是:
- 应用程序更新包不宜太大,并且还必须能够在发生修改的情况下更改根文件系统。
- 升级可能会更大,并且只包含进入根文件系统的内容(例如新库、内核等)。更新可能需要安装升级。
升级是否可以包含整个根文件系统并简单地执行dd
在目标的闪存驱动器上?
- 创建更新/升级包应尽可能自动进行。
我绝对需要某种方法来对根文件系统进行版本控制。这必须以某种方式完成,我可以计算某种diff
其中可用于更新目标设备的 rootfs。
我已经研究过 Subversion,因为我们将其用于源代码,但这对于 Linux 根文件系统(文件权限、特殊文件等)不合适。
我现在创建了一些 shell 脚本,可以给我类似的东西svn diff
但我真的很想知道是否已经存在一个有效且经过测试的解决方案。
使用这样的diff
我想升级将简单地成为一个包含基于已知根文件系统状态的增量更新的包。
您对此有何想法和想法?您将如何实施这样的系统?我更喜欢一个可以在短时间内实施的简单解决方案。
我相信您对这个问题的看法是错误的 - 任何非原子更新(例如 dd 文件系统映像、替换目录中的文件)都会被设计破坏 - 如果在更新过程中断电,则系统是一个对于砖块和嵌入式系统,电源可能会在升级过程中断电。
我写了一篇关于如何在嵌入式 Linux 系统上正确进行升级/更新的白皮书 [1]。它在 OLS 上发表。您可以在这里找到该论文:https://www.kernel.org/doc/ols/2005/ols2005v1-pages-21-36.pdf https://www.kernel.org/doc/ols/2005/ols2005v1-pages-21-36.pdf
[1] 本-尤瑟夫,吉拉德。 “构建 Murphy 兼容的嵌入式 Linux 系统。”Linux研讨会. 2005.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)