initによってマウントされ使用されている場合は、Linuxに書き込むためにraw UBIパーティションを開きます。

initによってマウントされ使用されている場合は、Linuxに書き込むためにraw UBIパーティションを開きます。

スーパーユーザー権限を持つ 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場合、またはサポートされていない場合は、次のように置き換える必要があります。inittabinitinit/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)。

関連情報