如果 init 挂载并使用了原始 UBI 分区,则在 Linux 上打开用于写入的原始 UBI 分区

如果 init 挂载并使用了原始 UBI 分区,则在 Linux 上打开用于写入的原始 UBI 分区

我需要使用来自具有超级用户权限的 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或不支持inittabin not generated in initwill 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_rootchroot来替换根文件系统,然后您就可以卸载它(在移动后/tmp/proc)。

相关内容