0

我正在开发具有内部 SD 卡的嵌入式 linux 设备。此设备需要在不打开设备和取出 SD 卡的情况下进行更新。目标是允许用户使用 USB 闪存驱动器更新他们的设备。我想用新的 SD 卡映像完全覆盖内部 SD 卡。

我的第一个想法是卸载根文件系统并使用以下效果:

dd if=/mnt/flashdrive/update.img of=/dev/sdcard 

但是,实际上要正确卸载根文件系统似乎很困难,因为像“login”和“systemd”这样的进程仍在使用根上的资源。例如,一旦您终止登录,更新脚本也会被终止。

当然,我们总是可以使用 dd 而不卸载 root。然而,这似乎相当愚蠢。:P

我还考虑在系统实际挂载根文件系统之前修改系统初始化脚本以执行此逻辑。

是否有正确/简单的方法来执行此类更新?我想它以前已经做过了。

谢谢!

4

3 回答 3

1

重新映像已挂载的文件系统听起来不是一个好主意,即使该挂载是只读的。

考虑:

  • 使用 ramdisk(从压缩映像初始化)作为您的实际根文件系统,但可能除了文件系统中最重要的工具以外的所有工具都安装在下面,您可以将其删除以进行升级。大多数 Linux 实现在它们挂载主磁盘文件系统之前的引导过程的早期都会这样做:重新引导以进行升级可能是一种选择。

  • 无论如何,SD 卡可能比您需要的要大。每次升级时有两个分区并在它们之间交替。或者有一个维护分区,您可以在其中启动以执行升级/恢复。

  • 实际上不要对文件系统进行映像,而是升级单个文件。

于 2012-10-27T21:19:17.593 回答
0

尝试其中一种或两种:

  1. 首先进入单用户模式:telinit 1

或/和

  1. 重新挂载 / 为只读:mount -o remount,ro /

在运行之前dd

于 2012-10-27T20:33:08.260 回答
0

就我个人而言,我永远不会像你那样做某事,但有可能做到。

您的 linux 系统每次启动时都会执行此操作。事实上,发生的事情是您的内核最初安装了 initrd,加载了所有模块,然后它调用pivot_root安装真正的 / 。

pivot_root也是一个可以从shell使用的命令,你最好运行man 8 pivot_root但只是给你一个想法,你可以做这样的事情

mount /dev/hda1 /new-root
cd /new-root
pivot_root . old-root
exec chroot . sh <dev/console >dev/console 2>&1
umount /old-root

最后一件事:这种执行软件升级的方式非常弱。请考虑其他解决方案。

于 2012-10-29T08:35:05.293 回答