基于Linux的固件,如何实现更新的好方法? [英] Linux-Based Firmware, how to implement a good way to update?

查看:388
本文介绍了基于Linux的固件,如何实现更新的好方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用alix 2d13开发基于Linux的设备.

I'm developing a linux-based appliance using an alix 2d13.

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

I've developed a script that takes care of creating an image file, creating the partitions, installing the boot loader (syslinux), the kernel and the initrd and, that takes care to put root filesystem files into the right partition.

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

Configuration files are on tmpfs filesystem and gets created on system startup by a software that reads an XML file that resides on an own partition.

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

I'm looking a way to update the filesystem and i've considered two solutions:

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

每种解决方案都有其自身的优势: -文件系统映像可让我删除所有未使用的文件,但需要很多时间,并且会迅速杀死紧凑型闪存; -归档文件较小,需要较少的更新时间,但是我很快就会在根文件系统上遇到麻烦.

Every solution has its own advantages: - a filesystem image will let me to delete any unused files but needs a lot of time and it will kill the compact flash memory fastly; - an archive is smaller, needs less time for update, but i'll have the caos on the root filesystem in short time.

另一种解决方案是在tar归档文件中放入文件列表并将更新前/更新后的脚本放到tar归档文件中,因此所有不存在于文件列表中的文件都将被删除.

An alternative solution could be to put a file list and to put a pre/post update script into the tar archive, so any file that doesn't reside into the file list will be deleted.

您怎么看?

推荐答案

我使用了以下方法.它多少基于论文构建与Murphy兼容的嵌入式Linux系统",该论文

I used the following approach. It was somewhat based on the paper "Building Murphy-compatible embedded Linux systems," available here. I used the versions.conf stuff described in that paper, not the cfgsh stuff.

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

这篇关于基于Linux的固件,如何实现更新的好方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆