闪烁以root身份安装的内部SD卡

时间:2012-10-27 20:26:15

标签: sd-card embedded-linux updates dd

我正在使用具有内部SD卡的嵌入式Linux设备。该设备需要可更新,无需打开设备并取出SD卡。目标是允许用户使用USB闪存驱动器更新其设备。我想用一张新的SD卡图像完全覆盖内部SD卡。

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

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

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

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

我还在考虑修改系统init脚本,以便在系统实际安装根文件系统之前执行此逻辑。

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

谢谢!

3 个答案:

答案 0 :(得分:1)

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

考虑:

  • 使用ramdisk(从压缩映像初始化)作为实际的根文件系统,但可能只有安装在下面的文件系统中最重要的工具,您可以放弃升级。大多数Linux实现在引导过程的早期都会在挂载主磁盘文件系统之前执行此操作:重新启动以进行升级可能是一种选择。

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

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

答案 1 :(得分:0)

尝试其中一项或两项:

  1. 首先调整为单用户模式:telinit 1
  2. 或/和

    1. Remount / as readonly:mount -o remount,ro /
    2. 在运行dd

      之前

答案 2 :(得分: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

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