14

我正在使用 alix 2d13 开发基于 linux 的设备。

我开发了一个脚本,负责创建映像文件、创建分区、安装引导加载程序 (syslinux)、内核和 initrd,并且负责将根文件系统文件放入正确的分区。

配置文件位于 tmpfs 文件系统上,并在系统启动时由软件创建,该软件读取驻留在自己分区上的 XML 文件。

我正在寻找一种更新文件系统的方法,并且我考虑了两种解决方案:

  • 固件更新是一个压缩文件,可以包含内核、initrd 和/或 rootfs 分区,这样,在重新启动时,initrd 会注意将 rootfs 映像添加到正确的分区;
  • 固件更新是一个压缩文件,其中可能包含两个 tar 存档,一个用于引导,一个用于根文件系统。

每个解决方案都有自己的优势: - 文件系统映像可以让我删除任何未使用的文件,但需要大量时间,并且会快速杀死紧凑型闪存;- 存档更小,更新所需的时间更少,但我很快就会在根文件系统上拥有 caos。

另一种解决方案可能是放置一个文件列表并将一个更新前/后更新脚本放入 tar 存档中,因此任何不驻留在文件列表中的文件都将被删除。

你怎么看?

4

3 回答 3

18

我使用了以下方法。它在某种程度上基于此处提供的论文“构建与墨菲兼容的嵌入式 Linux 系统” 。我使用了该论文中描述的 versions.conf 内容,而不是 cfgsh 内容。

  • 使用引导内核,其工作是环回挂载“主”根文件系统。如果您需要较新的内核,则在环回挂载后立即将 kexec 插入该较新的内核。我选择将引导内核的完整初始化连同busybox和kexec(都是静态链接的)一起放在initramfs中,而我的初始化是我编写的一个简单的shell脚本。
  • 一个或多个“主操作系统”根文件系统作为磁盘映像文件存在于“操作系统映像”文件系统上。引导内核根据versions.conf 文件选择其中之一。我只维护两个主要的操作系统映像文件,当前文件和备用文件。如果当前的失败(稍后将详细介绍失败检测),则引导内核引导回退。如果两者都失败或没有回退,则引导内核提供一个 shell。
  • 系统配置位于单独的分区上。这通常不会升级,但没有理由不能升级。
  • 总共有四个分区:启动、操作系统映像、配置和数据。数据分区用于用于频繁写入的用户应用程序内容。引导永远不会以读/写方式安装。操作系统映像仅在升级期间(重新)安装读/写。config 仅在需要更改配置内容时才以读/写方式安装(希望永远不会)。数据始终以读/写方式挂载。
  • 每个磁盘映像文件都包含一个完整的 Linux 系统,包括内核、初始化脚本、用户程序(例如,busybox、产品应用程序)以及在第一次启动时复制到配置分区的默认配置。这些文件的大小可以容纳其中的所有内容。只要我允许足够的增长空间,以便操作系统映像分区总是足够大以容纳三个主要的操作系统映像文件(在升级期间,我不会删除旧的回退直到提取新的回退),我可以允许主操作系统映像根据需要增长。这些图像文件始终(环回)以只读方式安装。使用这些文件还消除了处理升级 rootfs 中单个文件失败的痛苦。
  • 通过将自解压 tarball 传输到 tmpfs 来完成升级。该脚本的开头重新装载操作系统映像读/写,然后将新的主操作系统映像提取到操作系统映像文件系统,然后更新versions.conf 文件(使用“墨菲”论文中描述的重命名方法)。完成后,我触摸一个标记文件,表明升级已经发生,然后重新启动。
  • 引导内核查找此标记文件。如果找到它,它会将其移动到另一个标记文件,然后启动新的主 OS 映像文件。主 OS 映像文件应在成功启动时删除标记文件。如果没有,看门狗将触发重新启动,然后启动内核将看到这一点并检测到故障。
  • 您会注意到在升级过程中有几个可能的故障点:在升级过程中同步versions.conf,以及触摸/删除戳文件(三个实例)。我找不到进一步减少这些并实现我想要的一切的方法。如果有人有更好的建议,我很想听听。写入操作系统映像时也可能发生文件系统错误或电源故障,但我希望 ext3 文件系统能够在这种情况下提供一些生存机会。
于 2013-08-13T21:52:19.440 回答
1

您可以有一个单独的分区用于更新(例如 Side1/Side2)。现有内核,rootfs在Side1,然后把更新放到Side2并切换。通过这种方式,您可以减少磨损均衡并延长使用寿命,但设备会变得更昂贵。

于 2013-08-07T16:27:28.810 回答
0

您可以在提取 tar 文件之前快速格式化分区。或者使用图像解决方案,但使用尽可能小的图像,并在 dd 之后调整文件系统大小(尽管这对于只读存储不是必需的)

于 2011-03-10T22:54:49.790 回答