Linuxシステムにおいて、 initrd(初期RAMディスク)は、Linuxの起動プロセスの一部として使用される一時的なルートファイルシステムをメモリにロードするための仕組みです。 (初期RAMディスク)と(初期RAMファイルシステムから)は、これを実現するための2つの異なる方法を指します。どちらも、実際のルートファイルシステムをマウントする前の準備としてよく使用されます。 initrdinitramfs
多くのLinux ディストリビューションは、単一の汎用Linux カーネルイメージ (ディストリビューションの開発者がさまざまなハードウェアで起動できるように特別に作成したイメージ) のみを出荷しています。この汎用カーネル イメージのデバイス ドライバーは、ロード可能なカーネル モジュールとして含まれています。これは、多くのドライバーを 1 つのカーネルに静的にコンパイルするとカーネル イメージが非常に大きくなり、メモリが限られたコンピューターでは起動できないほど大きくなる可能性があるためです。また、存在しないハードウェアや競合するハードウェアを検出することが原因で、起動時にクラッシュやその他の問題が発生する場合があります。この静的にコンパイルされたカーネル アプローチでは、使用されなくなったモジュールや不要になったモジュールがカーネル メモリに残ってしまうため、起動時にルート ファイル システムをマウントするために必要なモジュールを検出してロードする、あるいはルート ファイル システムがどこにあるのか、あるいは何なのかを推測するといった問題も発生します。[ 1 ]
さらに複雑なことに、ルートファイルシステムはソフトウェアRAIDボリューム、LVM、NFS(ディスクレスワークステーション)、あるいは暗号化されたパーティション上に存在する可能性があります。これらはすべて、マウントするために特別な準備が必要です。[ 2 ]
もう一つの複雑な点は、カーネルによるハイバネーションのサポートです。ハイバネーションとは、メモリ全体の内容をスワップパーティションまたは通常のファイルにダンプし、その後電源をオフにすることで、コンピュータをディスクにサスペンドする機能です。次回の起動時には、このイメージをメモリにロードする前に、アクセスできるようにする必要があります。
カーネルに多くの特殊なケースの処理をハードコードする必要を回避するため、初期ブート段階では一時的なルートファイルシステム(現在は初期ユーザー空間と呼ばれています)が使用されます。このルートファイルシステムには、実際のファイルシステムをマウントするために必要なハードウェア検出、モジュールのロード、デバイスの検出を行うユーザー空間ヘルパーを含めることができます。[ 2 ]

mkinitcpioArch Linuxおよび関連ディストリビューションでinitramfsを生成するプログラム
dracut一部のLinuxディストリビューションでinitramfsを生成する別のプログラムこの初期ルートファイルシステムのイメージ(カーネルイメージと共に)は、Linuxブートローダーまたはコンピュータのブートファームウェアからアクセスできる場所に保存する必要があります。これは、ルートファイルシステム自体、光ディスク上のブートイメージ、ローカルディスク上の小さなパーティション(通常はext2またはFATファイルシステムを使用するブートパーティション)、またはTFTPサーバー(イーサネットからブート可能なシステムの場合)のいずれかです。
ブートローダーはカーネルと初期ルートファイルシステムイメージをメモリにロードし、イメージのメモリアドレスを渡してカーネルを起動します。ブートシーケンスの最後に、カーネルはイメージの最初の数ブロックのデータからフォーマットを判別しようとします。これにより、initrd または initramfs スキームのいずれかが決定されます。
initrd方式では、イメージはファイルシステムイメージ(オプションで圧縮)であり、特別なブロックデバイス(/dev/ram)で利用可能になり、初期ルートファイルシステムとしてマウントされます。[ 3 ]そのファイルシステムのドライバは、カーネルに静的にコンパイルされる必要があります。多くのディストリビューションは元々圧縮されたext2ファイルシステムイメージを使用していましたが、その他のディストリビューション(Debian 3.1 を含む)は、メモリが限られたシステムで起動するためにcramfsを使用していました。これは、cramfs イメージが解凍のための追加スペースを必要とせずにインプレースでマウントできるためです。初期ルートファイルシステムが起動すると、カーネルは最初のプロセスとして/linuxrcを実行します。 [ 4 ]終了すると、カーネルは実際のルートファイルシステムがマウントされたと想定し、/sbin/initを実行して通常のユーザー空間ブートプロセスを開始します。[ 3 ]
initramfs方式 (Linux カーネル 2.6.13 以降で利用可能)では、イメージはcpioアーカイブ (オプションで圧縮) か、そのようなアーカイブを連結したものになります。アーカイブはカーネルによってtmpfsの特別なインスタンスに解凍され、これが初期のルート ファイル システムになります。この方式の利点は、中間ファイル システムやブロック ドライバをカーネルにコンパイルする必要がないことです。[ 5 ]一部のシステムでは、dracutパッケージを使用して initramfs イメージを作成します。[ 6 ] initramfs 方式では、カーネルは/init を、終了することが想定されていない最初のプロセスとして実行します。[ 5 ]一部のアプリケーションでは、initramfs はcasperユーティリティを使用して書き込み可能な環境を作成し、unionfsを使用して読み取り専用のルート ファイル システム イメージ上に永続性レイヤーをオーバーレイできます。たとえば、オーバーレイ データをUSB フラッシュ ドライブに保存し、ライブ CDに保存された圧縮されたSquashFS読み取り専用イメージをルート ファイル[ 7 ] [ 8 ]
カーネルは静的にコンパイルされたアルゴリズムに応じて、gzip、bzip2、LZMA、XZ、LZO、LZ4、[ 9 ]、zstdで圧縮されたinitrd/initramfsイメージを解凍できます。
Debianなどの一部のLinuxディストリビューションは、 ATA、SCSI、ファイルシステムカーネルモジュールなど、特定のコンピュータの起動に必要なものだけを含むカスタマイズされたinitrdイメージを生成します。これらのinitrdイメージには通常、ルートファイルシステムの場所と種類が埋め込まれています。
他のLinuxディストリビューション( FedoraやUbuntuなど)は、より汎用的なinitrdイメージを生成します。これらのディストリビューションは、ルートファイルシステムのデバイス名(またはそのUUID)のみから起動し、起動時に他のすべての情報を検出する必要があります。この場合、ソフトウェアはルートファイルシステムをマウントするために、複雑な一連のタスクを実行する必要があります。
一部のディストリビューションでは、 udevなどのイベント駆動型ホットプラグエージェントを使用しています。これは、特定のルールに一致するハードウェアデバイス、ディスクパーティション、ストレージボリュームがオンラインになると、ヘルパープログラムを起動します。これにより、検出を並列実行し、LVM、RAID、または暗号化の任意のネストに段階的にカスケードしてルートファイルシステムに到達できます。
ルート ファイル システムが最終的に表示されると、マウントされたルート ファイル システムでは実行できないすべてのメンテナンス タスクが実行され、ルート ファイル システムは読み取り専用でマウントされ、実行を継続する必要があるすべてのプロセス (スプラッシュ スクリーン ヘルパーとそのコマンドFIFOなど) が新しくマウントされたルート ファイル システムに移行されます。
最終的なルート ファイル システムを単純に/にマウントすることはできません。そうすると、最終的なクリーンアップ タスクで初期ルート ファイル システム上のスクリプトとツールにアクセスできなくなります。
ほとんどの初期ルートファイルシステムは、/linuxrcまたは/init をシェルスクリプトとして実装しており、最小限のシェル(通常は/bin/ash)といくつかの必須ユーザー空間ユーティリティ(通常はBusyBoxツールキット)が含まれています。さらにスペースを節約するために、シェル、ユーティリティ、およびそれらをサポートするライブラリは通常、スペース最適化( gccの "-Os" フラグなど)を有効にしてコンパイルされ、この目的のために特別に作成されたC ライブラリの最小限のバージョンであるklibcにリンクされています。 [ 11 ]
Linux ディストリビューションのインストーラーは通常、永続ストレージが設定される前にインストーラー インターフェイスとサポート ツールをホストできる必要があるため、完全に initramfs から実行されます。
Tiny Core Linux [ 12 ]とPuppy Linux [ 13 ]はinitrdから完全に実行できます。
Windows Vista以降、[ 14 ] WindowsはWIMディスクイメージファイルから起動することができ、そのファイル形式は公開されています。[ 15 ]これはZIP形式に似ていますが、ハードリンク、重複排除されたチャンク、チャンク単位の圧縮をサポートしています。この場合、WIM全体が最初にRAMにロードされ、続いてカーネルの初期化が行われます。次に、ロードされたWIMはドライブ文字が割り当てられたSystemRootとして利用可能になります。Windowsインストーラはこれを利用し、BOOT.WIMから起動し、インストールするWindowsファイルのコレクションとしてINSTALL.WIMを使用します。
また、Windows プレインストール環境(Windows PE) でも同じものが使用されており、一部のウイルス対策ソフトウェアやバックアップ/障害復旧ソフトウェアの個別ブート バージョンのベースとして使用されています。
Windows を、物理ドライブ上に配置した WIM ファイルまたは VHD ファイルから常に起動するようにインストールすることも可能です。ただし、Windows のブートローダーは起動時カーネルモジュールの .sys ファイルを自身でロードできるため、この方法はめったに使用されません。これは Linux では initrd を必要とするタスクです。
GRUB カーネルのコマンドラインにリストされているカーネルパラメータを使用して、initramfs RAM ファイルシステムをオンザフライで構成し、柔軟性を高め、RAM ファイルシステムコードをさらに削減します。