Linux

如果它已被 init 掛載和使用,則打開原始 UBI 分區以在 Linux 上寫入

  • March 5, 2018

我需要使用具有超級使用者權限的 Linux 使用者空間中的新 UBIFS 映像更新原始 UBI 分區,但是EBUSY每當我嘗試打開我的對應/dev/ubiX_Y文件進行寫入時,我都會收到(設備或資源繁忙)錯誤,即使目前文件系統存在它以只讀方式安裝。我懷疑具有例如 ext4 文件系統的通常塊分區可以在以只讀方式掛載時打開以進行寫入,看到諸如 zerofree 和 ext4magic 之類的實用程序以這種方式工作。UBI 分區似乎並非如此。

從理論上講,我可以使用分區終止程序或附加到它們並強制關閉其上的所有文件,然後再完全解除安裝分區,但似乎我不能對init一直保持/etc/inittab打開狀態的 busybox 程序執行任何操作。是的,有問題的分區是根/掛載的分區。

我也可以實現一個核心模組來完成臟活,但我想為我的更新實用程序保留盡可能多的二進制前向兼容性,並且基本上盡可能多地保持核心版本不可知,從而以這種方式解決它是非常不受歡迎的。我還有其他方法可以做到這一點嗎?

如果有這樣的一行/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 compiled 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)。

引用自:https://unix.stackexchange.com/questions/428199