我正在使用具有内部SD卡的嵌入式Linux设备。该设备需要可更新,无需打开设备并取出SD卡。目标是允许用户使用USB闪存驱动器更新其设备。我想用一张新的SD卡图像完全覆盖内部SD卡。
我的第一个想法是卸载根文件系统并使用一些效果:
dd if=/mnt/flashdrive/update.img of=/dev/sdcard
但是,实际上很难正确卸载根文件系统,因为像“login”和“systemd”这样的进程仍在使用root上的资源。例如,一旦您终止登录,更新脚本也会被终止。
当然,我们总是可以在不卸载root的情况下使用dd。然而,这似乎相当愚蠢。 :P
我还在考虑修改系统init脚本,以便在系统实际安装根文件系统之前执行此逻辑。
是否有正确/简单的方法来执行此类更新?我以为它以前已经完成了。
谢谢!
答案 0 :(得分:1)
重新映像已安装的文件系统听起来不是一个好主意,即使挂载是只读的。
考虑:
使用ramdisk(从压缩映像初始化)作为实际的根文件系统,但可能只有安装在下面的文件系统中最重要的工具,您可以放弃升级。大多数Linux实现在引导过程的早期都会在挂载主磁盘文件系统之前执行此操作:重新启动以进行升级可能是一种选择。
SD卡可能比您需要的大。每次升级时都有两个分区并在它们之间交替。或者有一个维护分区,您可以启动它来执行升级/恢复。
实际上不要对文件系统进行映像,而是升级单个文件。
答案 1 :(得分:0)
尝试其中一项或两项:
telinit 1
或/和
mount -o remount,ro /
在运行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
最后一件事:这种执行软件升级的方式非常薄弱。请考虑其他解决方案。