最近のオンラインコースでは、RHEL / CentOSインストラクターは次のことを述べました。
その後、ブートローダはカーネルを実行します。カーネルフェーズでは、カーネルはRAMディスクをメモリにロードします。このRAMディスクは一時ルートファイルシステムとして使用されます。このファイルシステムには、カーネルモジュール、ドライバ、および起動ファイルも含まれます。その後、カーネルはラムディスクをアンマウントし、ルートファイルシステムをハードディスクにマウントします。その後、最初のプロセスを実行して初期化フェーズを開始します。初期化フェーズでは、親プロセスが実行されます。以前のバージョンのRed Hatでは、これはInitプロセスでした。
これは私に逆さまに見えます。カーネルには、プロセス全体で利用可能ないくつかのファイルシステムが必要ではないでしょうか?上で強調表示された行は、ファイルシステムがまったく実行されていない短い瞬間があったことを示します。
答え1
ブートローダはラムディスク[...]を削除しますか?
いいえ。
その後、カーネルはラムディスクをアンマウントし、ルートファイルシステムをハードディスクにマウントします。その後、最初のプロセスを実行して初期化フェーズを開始します。
これは間違っています。
initramfsにはというプログラムが含まれています/init
。プログラムが実行され、最初の(ユーザー)プロセスです。initramfsはまだ存在しますが、。実際に進行中の除去を引き起こすのはまさにこのプログラムです。
/init
Debian 9 Linuxで使用されるプログラムです。。 FedoraDracutと呼ばれる同様のシステム。ご覧のとおり、スクリプトはモジュールをロードし、フックを実行し、最終的なルートファイルシステムをマウントし、最後にrun-init
klibc-utilsパッケージのプログラムで自分自身を上書きします。 (以前のバージョンが使用されているか利用可能なコンテンツに基づいてrun-init
いますswitch_root
) Dracutはまだ使用中です。switch_root
。この時、ドラカット完全なsystemd-udevd
サブシステムが作成されました。デバイスを実行して自動的に検出し、そのデバイスのデーモンを実行し、ボリュームをマウントします。 DASDによって生成されたデーモンは引き続き並列systemd-udevd
に実行されますswitch_root
。
run-init
プログラムその後、initramfsの内容を削除し、新しいルートファイルシステムに自分自身を追加して開き、chroot
そのファイルシステムのプログラムで上書きします。/dev/console
init
init
、カーネルコマンドラインで名前付き変数を使用するか、/init
最初のプログラムで仮定したこの変数のデフォルト値。 switch_root
若干の違いはありますが、効果はほぼ同じです。 Dracutはinit
プログラム名を渡します。カーネルコマンドラインからもインポートされます。。
ご覧のとおり、どちらもありませんコア...でもないブートローダはこれらのいずれかをトリガします。プログラムが/init
プロセス#1で始まると、ブートローダは完全に消え、カーネルはその/init
プログラム、つまり作成されたフックのプログラムと他の2つのプログラムを上書きするだけです。
ありませんいいえこのプロセス中に、/init
プロセス#1がinitramfsのプログラムを使用して開始された瞬間からファイルシステムをマウントすることはできません。常に1つ以上のプロセスが実行されており、そのプロセスには作業ディレクトリ、ルートディレクトリ、およびプログラムイメージファイルが含まれており、すべてマウントされたボリュームのvnodeを参照する必要があります。どこかに。
元のinitramfsは、最後のマウントポイントが移動され、それを使用する最後のプロセス(各プロセスの現在のディレクトリ、各プロセスのルートディレクトリ、またはプログラムイメージファイル)が消えたときにのみ存在することがわかります。または同様に、run-init
作業switch_root
ディレクトリとルートディレクトリを別のボリュームに切り替えて、別のボリュームにあるファイルのプログラムイメージで自分自身を上書きします。 systemdの人々は、システム寿命の間にまだ存在するそのボリュームのイメージで実行されるプログラムがあるため、initramfsが実際にまったく消えない可能性を検討しました。
したがって、実際に起こっていることは、元のinitramfsと最終的なルートファイルシステムの両方です両方プロセスの特定の時点に存在し、実際にそれ以降であった可能性があります。一点から遠く若いルートファイルシステムにはドットがあります。多くの種類ルートファイルシステムの場合(initramfsへの参照が消えるにつれて)、再び1に落ちます。 (、、、、、および/proc
のファイルシステムは/ runtimeに存在するため/sys
/dev
/run
/dev/shm
/dev/pts
run-init
switch_root
みんなマウントされたファイルシステム(ルートなど)の数は、起動プロセス全体で常に2よりはるかに高くなります。 )
追加読書
- ハラルド・イヤー(2013-10)。デラクール。バージョン3.0。 kernel.org.
- Lennart Petlinget al。 (2013). ルートファイルシステム用のsystemdおよびストレージデーモン。 freedesktop.org.
答え2
実行中のカーネルは必要ファイルシステムは、設定する必要があるネットワークインターフェイスの範囲を超えてマウントされます。もちろん、ファイルシステム(またはプロセスなどのカーネルで実行されるいくつかのコードinit
)が一時rootfsから次に移動している間にそのファイルを積極的に使用しない限り、本当のルートFS。
カーネルが最初に起動した時点からinitrdがインストールされるまで(またはinitrdを使用していない場合は実際のrootfs)、カーネルにファイルシステムがマウントされないことに注意してください。これは、初期ハードウェア検出とデバイスとドライバの初期化の後しばらくの間発生します。