Linuxが起動時に初期RAMディスクを使用するのはなぜですか?

Linuxが起動時に初期RAMディスクを使用するのはなぜですか?

私は知りたいです:

initrd起動プロセスの最初の部分に使用し、物理pivot_rootディスクにルートを配置する目的は何ですか?なぜディスクにあるものを使わないのですか?

答え1

なぜディスクにあるものを使わないのですか?

あなたはできます。 initrd(またはカーネル2.6.13以降、より新しく広く使用されているバージョンinitramfs)を使用する必要はありません。

これを使用する理由は、展開カーネルが一般的ですぐに利用可能な幅広いハードウェアをサポートする必要があるためです。ルートファイルシステムをマウントするのに重要ないくつかのハードウェアドライバのいくつかは相互に排他的であるかもしれませんが(確かではありません)、それにもかかわらずすべての可能性を構築すると(ユーザーがしなければならないこと)、非常に大きなカーネルに違いがあります。 。

したがって、ドライバはカーネルに組み込まれておらず、別々のバイナリモジュールに配置されます。これはinitramdfs / initrdの主なペイロードです。これにより、カーネルは、ルートファイルシステムを正しくマウントできるように適切なハードウェアドライバをロードできます。

答え2

initrdが表示される前に、ルートファイルシステムとして使用されるパーティションのデバイス名をカーネルコマンドラインに渡す必要がありました。カーネルには、この名前を解析し、いくつかの共通文字列を認識してそれをよく知られたdev_t数字に変換する特別なワンタイムコードがあります。つまり、カーネルは内部的にデバイスを単に配列の数値インデックスとして理解し、デバイスをマウントするにはデバイス番号を知る必要があります。

プラグアンドプレイとホットプラグが登場する前に、システムに常に存在するディスクが1つまたは2つしかない場合、このアプローチは正しく機能しました。ルートファイルシステムがそうであれば、/dev/hda1常にそうです。しかし、プラグアンドプレイの出現により、この問題はそれほど重要ではありませんでした。最近では、内蔵ディスクドライブ、USB、iCSIなどが12個あり、起動時間を改善するために並列に検索されるため、デバイス名が最初に応答するデバイスによって変わることがあります。これはカーネルを意味します。コマンドラインが簡単に間違って起動できなくなります。

この問題を解決するためにUUIDが導入されました。 sda か sde か UUID でデバイスを指定すると、常に正しいドライブが検出されます。ただし、これを行うには実際にドライブを見てください。単純な静的名前 - >dev_tカーネルブートコードマッピングよりも複雑です。私たちはカーネルがこのような複雑な状況に適していないと判断し、initrdが誕生しました。正しいルートデバイスを識別してインストールするために必要なすべてのユーティリティがある可能性があります。ネットワークを起動し、nfsまたはiSCSIルートにアクセスするためのDHCPリースを取得するなど、任意に複雑なタスクを実行することもできます。 initrdを必要とする他には、raid設定、lvm、またはディスクアクセス暗号化などがあります。

答え3

錯乱それは完全に要約されます。初期仮想ディスク(または初期化プログラム) はい任意に選択できる。これは、/usrベストプラクティスとして宣伝された別のファイルシステムにある場合など、いくつかの場合に必要です。

返品、システム、多くのLinuxディストリビューションで発見され、/usr起動時に利用可能でなければなりません。。それ以外の場合は、以下を提供する必要があります。初期化プログラム/usr実際のルートに切り替える前に、正しくマウントされたルートファイルシステムを準備してください。

美しいスプラッシュ画面を整えるには初期化プログラム。すべての最新の主要ディストリビューションは、起動時に悪名高いログメッセージストリームの代わりに起動スプラッシュ画面を提供します。

答え4

initrdの使命は、実際のルートデバイスを使用可能にし、そのデバイスに切り替えることです。実際のルートデバイスは、(例えば)ハードドライブのパーティション、ネットワークのnfs共有、USBスティックのファイルシステム、擬似ファイルシステムなどとすることができる。

ほとんどすべてのinitrdにはというルーチンがありますmountroot。これは正しいルートファイルシステムを検索してマウントする機能です(通常、/rootinitrd自体(ルートのホームディレクトリと混同しないでください))。

ブートマネージャは、カーネルとinitrdを含むディスク(またはどこでも)の正しい場所を指す必要があります。カーネルが実行され、initrd がシステム RAM に直接解凍されます。/通常、initrdというスクリプトがありますinit。擬似ファイルシステム(sysfs、procfs、dev...)がマウントされる部分。 (経由で)アクセスできるいくつかの環境変数もあります(/proc/cmdlineたとえばdebug、、、break...)。

ルートファイルシステムがマウントされると、スクリプトがクリーンアップされ、新しいルートに切り替わります。その後、このプロセスは/sbin/init古いinit-scripts pidであるpid番号1を置き換えます。それ以来、残りのブートプロセスを完了するためのさまざまなメカニズム(upstart、SysVinit、systemd)があります。

関連情報