在使用时覆盖 Linux

在使用时覆盖 Linux

长话短说,我想将 USB 随身碟插入我的 Debian 系统(安装在 ARM 板上的 NAND 内存上),并在系统运行时用 USB 随身碟上的映像覆盖 NAND。这可能吗?不幸的是我无法从 USB 启动,所以我必须像“心脏直视手术”一样这样做

谢谢

编辑:一些附加信息

也许添加一些附加信息会很有用:我必须更新 200 多个主板。实际程序是:

  1. 关闭主板
  2. 打开箱子
  3. 将 microSD(带有 Debian 安装)插入板的插槽中,并将 USB 闪存盘(带有新板的 NAND 映像)插入板的 USB 端口中
  4. 板上电源
  5. 开发板将启动 microSD 上的 Debian 安装,并使用简单的 dd 命令自动将 USB 记忆棒上的映像复制到开发板的 NAND:gunzip -c /mnt/pendrive/hda.img.gz | dd of=/dev/nand完成后,开发板将关闭电源
  6. 当开发板断电时,断开 microSD 和 USB 闪存盘
  7. 重新组装外壳
  8. 使用更新的 Debian 安装打开主板电源

此过程是必要的,因为无法从外部访问 microSD 插槽。执行一次...没问题。做了200多次?天哪!

我想加快这个过程,并使其变得超级简单,这样普通用户也可以更新主板。如果出现问题也没有问题,我不需要备份,板上没有数据,只有我正在分发的软件。

我的目标是有一个新的程序,它可以执行以下操作:

  1. 开发板已上电且 Debian 正在运行
  2. 我插入随身碟
  3. 启动 U 盘上的脚本。该脚本会执行 a 操作gunzip -c /mnt/pendrive/hda.img.gz | dd of=/dev/nand,完成后会关闭开发板的电源
  4. 下次开机时,更新后的 Debian 将从 NAND 启动

这个更简单的程序将允许我分发一些 USB 随身碟,以便用户可以更新主板,而无需将所有 200 多个主板带给我。如果这个过程在某个地方失败并且 Debian 安装被损坏,用户只需将该板带给我,我将按照实际过程进行操作。

请注意,该主板无法访问互联网,因此我无法远程登录并启动更新。

答案1

如果您将覆盖程序所需的所有内容放入 tmpfs 并从那里执行它们,您就可以做到这一点。有风险,如果出现问题,您应该准备好备份。

答案2

没做过,听起来风险很大,但确实可行。

首先,停止当前运行的所有服务和所有程序,然后执行 rsync。

另一件可能有帮助的事情是首先 chroot 到 USB 操作系统,以便在工作期间访问正确的库。

答案3

因为你的要求变了,我重新回答一下。

对于您的情况,我将构建一个与这些工具静态链接的特殊 busybox:ash、(核心实用程序,如 ls mv cp rm)、dd、vi 和 gzip/gunzip。编写一个脚本,然后从 USB 运行该脚本(USB 驱动器将被格式化为任何 ext* 文件系统,对吧?),该脚本在运行命令时将仅使用闪存中的 busybox 二进制文件,例如使用更新命令时,它看起来像: /mnt/pendrive/busybox gunzip -c /mnt/pendrive/hda.img.gz | /mnt/pendrive/busybox dd of=/dev/nand

在运行更新之前,我会在使用 更新之前从 busybox 执行一个 shell(如果处于交互模式)exec /mnt/pendrive/busybox ash -l,覆盖您在内存中使用的任何 shell,因为覆盖后它将变得不可用。或者,如果您打算以批处理模式运行它,则不应使用#!/bin/shline,而应指定 busybox shell 的完整路径,例如#!/mnt/pendrive/busybox sh,或者,当像 一样运行它时/bin/sh /mnt/pendrive/script.sh,您应该使用实际的 busybox 二进制文件运行它:/mnt/pendrive/busybox sh /mnt/pendrive/script.sh

请记住,在更新之前,您应该分析并停止任何可能在更新期间向 NAND 写入内容的系统活动,因此,如果您正在运行某些服务(甚至是 syslog),则应该关闭它们。为此使用正确的工具,也许您有一个正在运行的进程管理程序会重生它们。

也许断电应该是即时的,任何卸载或将关闭服务的脚本都不应该运行。您可以使用echo o >/proc/sysrq-trigger或适当的 shutdown 命令来实现这一点,该命令将立即调用适当的 restart() 系统调用。

您可以在那里找到有关 busybox 的更多信息:http://busybox.net/。为了执行安全(即使在静态链接的二进制文件中也不需要共享库),我将使用 musl libc 构建 busybox (http://www.musl-libc.org/)。

相关内容