Linuxでルートファイルシステムを完全に切り替えるには?

Linuxでルートファイルシステムを完全に切り替えるには?

私はフラッシュデバイス(UBIFSを含むMTDデバイス)でrootfsを実行しています。注:ビットベークシステムなので、本格的なUbuntuや何もありません。

私はデバイスをフォーマットし、ここに新しいrootfsを書くことができるようにしたいので、デバイスが必要でそれを行うことができますが、ubidetachそのためにはすべてのプロセス/シェル/アプリケーションなどを終了する必要があります。 ..存在したことがあります。つまり、次のようなリストがあります。

fuser -vm /dev

それで、これまで試したことは(ある程度動作する)ivob_rootを使用することです。次の操作を行います。

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

これはうまくいきます。これで、UBIFSとFlash MTDデバイスを切り離すことができます。しかし、実行中のすべてのアプリケーションを終了する必要がありましたが、これはあまり役に立ちません!

したがって、私が(少なくとも実験的に)やりたいことは、pivot_root1つまたは同様のものを作成することです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の実行

答え1

情報:

ルートディレクトリの切り替え

switch_root は、マウントされた /proc、/dev、/sys、/run を newroot に移動し、newroot を新しいルートファイルシステムにし始めます。内部に プロセス。

内部に

プログラム初期化はプロセスID1を有するプロセスであり、必要な方法でシステムを初期化することを担当する。 initはカーネルによって直接開始され、通常はプロセスを終了する信号9に抵抗します。他のすべてのプログラムはinitによって直接起動されます。またはサブプロセスのいずれかを介して。

以前に開始されたすべてのプログラム、デーモン、モジュール(?)は、switch_rootinitプロセス1によって開始されます。 switch_rootはinitを終了するため、initが終了した後に開始されたすべてのエントリは消えます。

新しいinitが起動するには、新しいrootfsにモジュール(?)、プログラム、デーモンが必要です。新しいプロセス1はモジュール(?)を再ロードし、デーモンを再起動してユーザープログラムを作成します。


「このデバイスをフォーマットし、ここに新しいrootfsを書き込むことができるようにしたい」

新しいrootfsを構築し、それを「インストール」する準備が整ったとします。

フォーマット後にどのように始めますか?すでに起動しているので、switch_rootが欲しいのですか?

もしそうなら、switch_rootはおそらく必要なツールではないでしょう。

他のツールを使用すると、新しいrootfsをフォーマットしてコピーできます。

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

これは役に立ちますか?

関連情報