初期RAMディスク(initrd)とは
初期RAMディスク(initial ramdisk、initrd)は、
Linuxカーネルの
ブートプロセスにおいて、一時的なルート
ファイルシステムをメモリ上に展開する仕組みです。この一時的な
ファイルシステムは、真のルート
ファイルシステムをマウントする前に必要な処理を実行するために利用されます。具体的には、ハードウェアの検出、
デバイスドライバの読み込み、複雑な
ファイルシステム(
RAID、LVM、暗号化など)のマウントなどが含まれます。
initrdには、initrdとinitramfsの2つの方式が存在します。initrdは初期の方式で、initramfsは
Linuxカーネル2.6.13以降で利用可能なより新しい方式です。文脈によっては、これらを総称してinitrdと呼ぶこともあります。本記事では、両方の方式について詳しく解説します。
initrdの原理
多くの
Linuxディストリビューションは、幅広いハードウェアに対応するために、単一の汎用カーネルイメージで配布されます。このカーネルイメージは、
デバイスドライバをローダブルカーネルモジュールとして持ち、メモリ容量が限られた環境や低容量のメディアからの起動を可能にします。
しかし、この方式には、ルート
ファイルシステムをマウントする前に、必要なモジュールをロードする必要があるという問題があります。さらに、ルート
ファイルシステムがソフトウェア
RAIDボリューム、LVM、NFS、または暗号化されたパーティションである場合、マウントには特別な処理が必要となります。
また、カーネルがハイバネーションをサポートしている場合も、複雑さが加わります。ハイバネーションからの復帰には、ディスク上のイメージにアクセスし、メモリにロードする必要があるため、起動初期段階での
ファイルシステムアクセスが不可欠です。
これらの問題を解決するために、起動初期段階では一時的なルート
ファイルシステム(初期ユーザ空間)が利用されます。この
ファイルシステムには、ハードウェア検出、モジュールローディング、デバイス発見など、真のルート
ファイルシステムのマウントに必要なユーザー空間ヘルパーが含まれています。
initrdの実装
initrdの
ファイルシステムイメージ(およびカーネルイメージ)は、
ブートローダーやファームウェアからアクセスできる場所に格納する必要があります。主な格納場所は以下の通りです。
ルートファイルシステム自身
ローカルディスク上の小さなパーティション(
ブートパーティション)
Live CD上のファイルシステム
TFTPサーバー(ネットワーク
ブートの場合)
ブートローダーは、カーネルとinitrdイメージをメモリにロードし、カーネル起動時にinitrdのメモリアドレスを渡します。カーネルはinitrdイメージを解析し、そのフォーマットを判断します。
initrdイメージが圧縮された
ファイルシステムイメージ(通常はext2)の場合、特殊なブロックデバイス `/dev/ram` として利用可能になり、ルート
ファイルシステムとしてマウントされます。この
ファイルシステム用のドライバは、カーネルに静的にコンパイルされている必要があります。
初期化用ルート
ファイルシステムが利用可能になると、カーネルは最初のプロセスとして `/linuxrc` を実行します。このプロセスが終了すると、カーネルは真のルート
ファイルシステムのマウントが完了したと判断し、`/sbin/init` を実行して通常のユーザー空間の起動を開始します。
initrdイメージがgzipで圧縮されたcpioアーカイブの場合、カーネルはそれを展開し、initramfs(tmpfsの特殊なインスタンス)として利用します。この方式では、ext2などの
ファイルシステムドライバをカーネルに組み込む必要がなくなり、より柔軟な構成が可能になります。initramfsでは、カーネルは最初のプロセスとして `/init` を実行します。
マウント準備
一部のディストリビューションでは、特定のハードウェア構成に必要なカーネルモジュールのみを含む、カスタマイズされたinitrdイメージを生成します。この場合、ルート
ファイルシステムの場所はinitrdイメージ内に固定されます。
一方、FedoraやUbuntuなどのディストリビューションでは、より汎用的なinitrdイメージを使用します。これらのシステムでは、ルート
ファイルシステムの場所や種類を起動時に判断する必要があります。そのため、ルート
ファイルシステムをマウントするまでに、以下のタスクが実行されます。
ブートに必要なハードウェアドライバのロード
ブートスプラッシュ表示の初期化
NFSルートファイルシステムのマウント
ソフトウェア
RAIDデバイスのマウント
LVMボリュームのマウント
暗号化されたブロックデバイスの復号
* 保守タスクの実行
ルート
ファイルシステムを読み取り専用でマウントした後、必要なプロセス(
ブートスプラッシュなど)を移行し、初期化用ルート
ファイルシステムをアンマウントします。
initrdでは、真のルート
ファイルシステムを一時的なマウントポイントにマウントし、`pivot_root(8)` コマンドで両者を入れ替えます。initramfsでは、初期化用ルート
ファイルシステムを直接上書きするように真のルート
ファイルシステムをマウントします。
初期化用ルート
ファイルシステムには、`/linuxrc` や `/init` といったシェルスクリプトと、最小限のシェル(通常は `/bin/ash`)や
BusyBoxのような基本的なユーティリティが含まれています。これらのツールは、容量を節約するために最適化された状態でコンパイルされています。
まとめ
initrdは、Linux
ブートプロセスにおいて不可欠な役割を果たしており、多様なハードウェアや複雑な
ファイルシステム構成に対応するための柔軟性を提供します。initrdとinitramfsは、それぞれ異なる実装方法を持ちながらも、最終的な目的は同じです。これらの技術のおかげで、Linuxは様々な環境で安定して起動できます。