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

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

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

  • 用于创建文件系统映像的目标的根文件系统没有版本控制(我认为我们甚至没有原始的rootfs).
  • 手动 Select 进入更新的rootfs文件(而不是diff)
  • 更新不断增长,这成为一个pita.现在,在升级包含更大的rootfs更改的情况下,在更新/升级之间存在一个分割.
  • 我的印象是,更新中的一致性判断如果真的实现了,就相当脆弱.

要求如下:

  • 应用程序更新包不应太大,并且必须能够在进行修改的情况下更改根文件系统.
  • 升级可以大得多,只包含进入根文件系统的内容(如新库、内核等).更新可能需要安装升级
  • 创建更新/升级包应该尽可能自动.

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

我已经研究过Subversion,因为我们在源代码中使用它,但这不适合Linux根文件系统(文件权限、特殊文件等).

我现在已经创建了一些shell脚本,可以给我一些类似于svn diff的东西,但我真的很想知道是否已经有一个工作和测试的解决方案.

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

你对此有什么 idea 和 idea ?你将如何实施这样一个系统?我更喜欢一个可以在不太长时间内实现的简单解决方案.

推荐答案

我相信你在这个问题上是错误的-任何非原子的更新(例如DD文件系统映像,替换目录中的文件)都被设计打破了——如果在更新的过程中断电,系统是一块砖块,对于嵌入式系统来说,在升级的过程中,电源可能会脱落.

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

[1] 本·约瑟夫,吉拉德."构建与墨菲兼容的嵌入式Linux系统."Linux Symposium. 2005.

Linux相关问答推荐

在同一目录中未检测到G++预编译头

在查找命令中使用 printf

如何使用 sed 和 date 命令替换和格式化字符串中的日期?

将所有列乘以一个常数

用于替换 struct 文档中文本的 Bash 脚本

Bash 更新 yaml 文件中的图像值

如何重新安装最新的 cmake 版本?

Git为每次推送输入长密码

使用 RPATH 但不使用 RUNPATH?

如何在 Linux 中命名线程?

C.UTF-8 和 en_US.UTF-8 语言环境有什么区别?

crontab 命令单独一行

在 Emacs 中匹配括号的命令是什么?

try 使用 sudo 将文件附加到根拥有的文件时权限被拒绝

如何运行时调试共享库?

解压tar tar.bz2 文件报错

如何让 cron 每N分钟运行一次,其中 n % 5 == 1?

如何通过命令提示符判断 Linux 中的 BIOS 版本或名称?

.NET Core 中的跨平台文件名处理

更改 /etc/profile 后,我需要做什么来重置我的 shell?