web-dev-qa-db-ja.com

Linuxでルートファイルシステムを完全に切り替えるにはどうすればよいですか?

Rootfsをフラッシュデバイス(UBIFSを備えたMTDデバイス)で実行しています-注:これはビットベイクシステムであるため、本格的なubuntuなどではありません。

そのデバイスをフォーマットして新しいrootfsを書き込むことができるようにしたいので、このデバイスをubidetachする必要があります。これは可能ですが、そのためにはすべてのプロセスを強制終了する必要があります/これまでに存在したシェル/アプリなど-つまり、次の場合と同様のリスト:

fuser -vm /dev

したがって、これまでの私の試み(ある程度は機能します)は、pivot_rootを使用して次のことを行います。

  1. Bin、sbin、libなどを新しい/ tmp_root /フォルダーにコピーします
  2. / proc、/ sys、devをマウント/バインドし、/ tmp_root /に実行します
  3. ピボットルートを呼び出す
  4. Oldrootからすべてをアンマウントします
  5. Oldroot/devに関連するすべてのプロセスを強制終了します
  6. oldrootをアンマウントします

これは問題なく動作します。この時点で、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を実行しています

3
code_fodder

情報:

switch_root

switch_rootは、すでにマウントされている/ proc、/ dev、/ sys、および/ runをnewrootに移動し、newrootを新しいルートファイルシステムにして開始しますinitプロセス。

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をフォーマットしてコピーできるその他のツール。

  • ブートローダー。
  • 起動可能なUSBにインストールされたライブLinuxディストリビューション。
  • システムを起動するための最低限の必要性とツール(プログラム)がパーティション分割、フォーマット、およびコピーする必要があるだけのカスタムビットベイクファイルシステム。これは、MTD上の別の「ドライブ」別のパーティション、またはbzImageの一部であるUSBまたはメモリのみのinitramfsにあります。
  • USBなどの別のパーティションに一時的に存在する新しいrootfs。現在のカーネルとrootfsの代わりにブートローダーから起動するようにブートローダーを調整する必要があります。
  • ネットワークブートエーテルPXEまたはNFS。

これはまったく役に立ちますか?

1
jc__