Initrd

初期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は様々な環境で安定して起動できます。

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。