私はフラッシュデバイス(UBIFSを含むMTDデバイス)でrootfsを実行しています。注:ビットベークシステムなので、本格的なUbuntuや何もありません。
私はデバイスをフォーマットし、ここに新しいrootfsを書くことができるようにしたいので、デバイスが必要でそれを行うことができますが、ubidetach
そのためにはすべてのプロセス/シェル/アプリケーションなどを終了する必要があります。 ..存在したことがあります。つまり、次のようなリストがあります。
fuser -vm /dev
。
それで、これまで試したことは(ある程度動作する)ivob_rootを使用することです。次の操作を行います。
- bin、sbin、libなどを新しい/tmp_root/フォルダにコピーしました。
- /proc、/sys、dev をマウント/バインドし、/tmp_root/ として実行します。
- ピボット_ルート呼び出し
- oldrootからすべてを削除します。
- oldroot / devに関連するすべてのプロセスを終了します。
- 以前のルートを削除
これはうまくいきます。これで、UBIFSとFlash MTDデバイスを切り離すことができます。しかし、実行中のすべてのアプリケーションを終了する必要がありましたが、これはあまり役に立ちません!
したがって、私が(少なくとも実験的に)やりたいことは、pivot_root
1つまたは同様のものを作成することです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_root
initプロセス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。
これは役に立ちますか?