Linux
如果它已被 init 掛載和使用,則打開原始 UBI 分區以在 Linux 上寫入
我需要使用具有超級使用者權限的 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
或支持inittab
in not compiled ininit
will runinit
,那麼您將不得不替換/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
)。