我需要使用来自具有超级用户权限的 Linux 用户空间的新 UBIFS 映像来更新原始 UBI 分区,但是EBUSY
每当我尝试打开对应的/dev/ubiX_Y
写入内容时,即使当前文件系统存在,我也会收到(设备或资源繁忙)错误它以只读方式安装。我怀疑,当以只读方式安装时,带有例如 ext4 文件系统的常见块分区可以打开用于写入,因为看到 Zerofree 和 ext4magic 等实用程序就是这样工作的。 UBI 分区的情况似乎并非如此。
理论上,我可以使用分区终止进程,也可以附加到它们并在完全卸载分区之前强制关闭其上的所有文件,但似乎我无法对init
始终保持打开状态的busybox 进程执行任何操作/etc/inittab
。是的,有问题的分区是根/
安装分区。
我还可以实现一个内核模块来完成肮脏的工作,但我想保留尽可能多的内容二进制我的更新实用程序的前向兼容性,并基本上尽可能保持与内核版本无关,因此以这种方式解决它是非常不可取的。我还有其他方法可以做到这一点吗?
答案1
如果有一行/etc/inittab
类似:
::restart:/tmp/updater_stage2
然后,如果您向它发送 SIGQUIT,init
它将用 /tmp/updater_stage2 替换自身。要/etc/inittab
在更改后重新加载,请发送 SIGHUP。您可以替换/etc/inittab
为绑定安装:
mount --bind /tmp/inittab /etc/inittab
kill -HUP 1
sleep 1
kill -QUIT 1
如果没有/etc/inittab
或不支持inittab
in not generated in init
will run init
,那么你将不得不替换/sbin/init
为:
mkdir /tmp/old_sbin
mount --bind /sbin /tmp/old_sbin
cp -as /tmp/old_sbin /tmp/new_sbin
ln -sf /tmp/updater_stage2 /tmp/new_sbin/init
mount --bind /tmp/new_sbin /sbin
kill -QUIT 1
然后,您可以使用pivot_root
和chroot
来替换根文件系统,然后您就可以卸载它(在移动后/tmp
等/proc
)。