スーパーユーザー権限を持つ Linux ユーザー空間で、新しい UBIFS イメージで元の UBI パーティションを更新する必要がありますが、書き込みのためにそのEBUSY
パーティションを開こうとするたびに/dev/ubiX_Y
(Device or Resource Busy) エラーが発生します。読み取り専用でマウントされました。 Zerofreeやext4magicなどのユーティリティがこのように動作するのを見ると、読み取り専用でマウントされている場合は、ext4ファイルシステムなどの共通ブロックパーティションを書き込むために開くことができると思います。 UBIパーティションではそうではありません。
理論的には、パーティションを使用してプロセスを終了するか、パーティションを完全にマウント解除する前にプロセスに接続してすべてのファイルを強制的に閉じることができますが、init
常に開いているビジーボックスプロセスでは何もできないようです/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
init
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
)。