Rootfsをフラッシュデバイス(UBIFSを備えたMTDデバイス)で実行しています-注:これはビットベイクシステムであるため、本格的なubuntuなどではありません。
そのデバイスをフォーマットして新しいrootfsを書き込むことができるようにしたいので、このデバイスをubidetach
する必要があります。これは可能ですが、そのためにはすべてのプロセスを強制終了する必要があります/これまでに存在したシェル/アプリなど-つまり、次の場合と同様のリスト:
fuser -vm /dev
。
したがって、これまでの私の試み(ある程度は機能します)は、pivot_rootを使用して次のことを行います。
これは問題なく動作します。この時点で、MBIFSをMTDデバイスのフラッシュから切り離すことができます。ただし、実行中のすべてのアプリを強制終了する必要がありました。これはあまり役に立ちません。
だから、私がやりたいのは、pivot_root
の代わりに(少なくともトライアルとして)switch_root
などを実行することです。そうすれば、すべてのアプリを実行して、(うまくいけば)MTDをフラッシュできます。端末。通常、これはinitramtfs
です(または私が読んだことがあります)が、私の場合は、すでに実行中のrootfsでテストを行い、ファイルシステムを切り替えたいだけです。
私が作成したのと同じ/tmp_root
フォルダーを使用して、次のことを試しました。
exec switch_root /tmp_root /sbin/init
exec -c /dev/console switch_root /tmp_root /sbin/init
しかし、私はいつも同じ種類の結果を次のように取得します。
古いルートファイルシステムはinitramfsではありません:無効な引数
私は少し立ち往生していますが、システムが起動して実行されたら、rootfsを完全に切り替えることさえ可能ですか?
注: Linuxカーネル4.1.xを実行しています
情報:
switch_rootは、すでにマウントされている/ proc、/ dev、/ sys、および/ runをnewrootに移動し、newrootを新しいルートファイルシステムにして開始しますinitプロセス。
プログラムinitは、プロセスID 1のプロセスです。これは、必要な方法でシステムを初期化する役割を果たします。 initはカーネルによって直接開始され、通常はプロセスを強制終了するシグナル9に抵抗します。 他のすべてのプログラムは、initによって直接開始されるか、その子プロセスの1つによって開始されます。
switch_root
がinitプロセス1によって開始される前に開始されたプログラム、デーモン、モジュール(?)はすべて、switch_rootがそのinitを強制終了するため、initが強制終了された後にすべて開始されます。
新しいrootfsには、新しいinitを開始するためのモジュール(?)、プログラム、デーモンが必要です。モジュール(?)をリロードし、デーモンを再起動し、ユーザープログラムを生成するのは新しいプロセス1です。
"そのデバイスをフォーマットして新しいrootfsを書き込むことができるようにしたい"
新しいrootfsがすでにビルドされており、「インストール」する準備ができていると仮定します。
フォーマットした後、これをどのように起動しますか?すでに起動されているのでswitch_rootが必要なのはこのためですか?
はいの場合、switch_rootは必要なツールではない可能性があります。
新しいrootfsをフォーマットしてコピーできるその他のツール。
これはまったく役に立ちますか?