Initramfs/Guide/ja

ますます多くのシステムで、正しくブートするために initramfs が必要になってきています. このガイドでは initramfs を適切に作成、管理する方法だけでなく、 initramfs のコンセプトについても対象とします.

はじめに
多くのユーザーにとって、initramfs を使ったシステムは無関係です. そうした人々のシステムは単純なパーティションスキーマを採用しており、また(暗号化ファイルシステムのような)変わったドライバーや構成を使っていないため、Linux カーネルが バイナリに制御を渡すことが確実にできるのです. しかしながら、多くのシステムにおいて、initramfs は必須です.

initramfs とは何か(そして何のために必要なのか)を理解する上で鍵となるコンセプトは、レベルの高いアプローチではありますが、Linux のブートプロセスが動作する仕組みを理解するということです.

Linux のブートプロセス
Linux カーネルが(ブートローダーによって読み込まれた後に)システムの制御を得ると、自身のメモリー構造とドライバーを準備します. それから、制御をあるアプリケーション(通常は )に渡します. そのアプリケーションの役割は、さらにシステムの準備をすることと、ブートプロセスが終わった時点ですべての必要なサービスが実行されユーザーがログインできる状態にすることです. アプリケーションはサービスの中でも、検出されたデバイスをもとにシステムのさらなる読み込みや準備を行う デーモンを起動することによってその作業を行います. が起動されるとまだマウントされていない残りのファイルシステムがすべてマウントされ、それから残りのサービスが開始されます.

必要なファイルやツールがすべて同じファイルシステムにあるシステムでは、 アプリケーションは以降のブートプロセスを完全に制御できます. しかし複数のファイルシステムが定義されている(またはもっと風変わりなインストールがなされている)場合には、事はもう少しトリッキーになります:


 * パーティションが別のファイルシステムにある場合、 の中に保存されているツールやドライバーは が利用可能になるまで使えません. そうしたツールが  を利用可能にするために必要な場合、システムをブートすることができなくなります.


 * ルートファイルシステムが暗号化されている場合、Linux カーネルは アプリケーションを見つけることができないため、ブートできないシステムになってしまいます.

この問題への古くからある解決策が initrd (initial root device) を使うことです.

initial root disk
initrd は、ルートファイルシステムの アプリケーションに制御を渡す前に必要なファイルシステムをマウントするのに必要なツールやスクリプトを含む、メモリー内ディスク構造 (ramdisk) です. Linux カーネルはこのルートディスクにあるセットアップスクリプト(通常は と呼ばれますが、その名前である必要はありません)を起動します. セットアップスクリプトはシステムの準備や真のルートファイルシステムへの切り替えを行い、そして を実行します.

initrd を使う方法は必要なことをすべて行えますが、いくつか欠点もあります:


 * これはれっきとしたブロックデバイスであり、ファイルシステム全体でオーバーヘッドが必要です; 固定サイズになります. initrd があまり小さすぎると必要なスクリプトがすべて収まりません. 大きくしすぎるとメモリを浪費してしまいます.


 * これは真の、静的なデバイスなので Linux カーネル内のキャッシュメモリーを消費しますし、(ページングのような)メモリーやファイルを管理するメソッドを使用しがちになります. これにより、initrd はますます多くのメモリーを消費することになります.

こうした問題点を解決するために initramfs が作られました.

initial ram file system
initramfs は tmpfs (サイズを柔軟に設定できる軽量なメモリ内ファイルシステム)をもとにした初期 RAM ファイルシステムで、特別のブロックデバイスを使用しません(したがってキャッシュは起こらず、前に述べたオーバーヘッドはすべて無くなります). initrd と同様に、initramfs には真のルートファイルシステム上にある バイナリが呼び出される前にファイルシステムをマウントするために必要なツールやスクリプトが含まれています. これらのツールは(暗号化ファイルシステム用の)復号化抽象レイヤー、論理ボリュームマネージャー、ソフトウェア RAID、Bluetooth ドライバーベースのファイルシステムローダー等の場合があります.

initramfs の内容は cpio アーカイブを作ることで作成します. は古い(しかし実績のある)ファイルアーカイバーです(そして、アーカイブファイルは cpio ファイルと呼ばれます). cpio は アーカイバーと完全に同等です. ここで が選ばれた理由は、コードの観点から実装がしやすく、また(当時は)  がサポートしていなかったデバイスファイルをサポートしていたためです.

すべてのファイル、ツール、ライブラリ、(あれば)構成設定などは cpio アーカイブに収められます. このアーカイブはその後 ユーティリティーを使って圧縮され、Linux カーネルとともに保管されます. ブートローダーは、カーネルが initramfs が必要であると知ることができるように、ブートする際に Linux カーネルに initramfs を提示します.

initramfs が検出されると、Linux カーネルは tmpfs ファイルシステムを作成してアーカイブの内容をそこに展開し、それから tmpfs ファイルシステムのルートにある スクリプトを起動します. このスクリプトは(たとえば追加モジュールの読み込み、暗号化抽象レイヤーの準備などを行ってマウントができるようにしてから)真のルートファイルシステムとその他の重要なファイルシステム(たとえば や  など)をマウントします.

ルートファイルシステムやその他の重要なファイルシステムがマウントされると、initramfs の スクリプトはルートを真のルートファイルシステムに切り替え、ブートプロセスを続けるためにシステムの  バイナリを起動します.

導入とブートローダーの設定
initramfs を作成するには、どのような追加ドライバー、スクリプト、ツールがシステムをブートするために必要なのか知っておくことが重要です. たとえば LVM を使用している場合には initramfs 内に LVM ツールが必要です. 同様に、ソフトウェア RAID を使用している場合には ユーティリティーが必要、等々.

ユーザーのシステム用の initramfs (圧縮された アーカイブ)作成を支援するツールがいくつかあります. 同様に、完全なコントロールを望むユーザーは個人用のカスタム initramfs を簡単に作成することができます.

作成が済んだら、initramfs を使用することを知らせるためにブートローダーの設定を調整する必要があります. たとえば initramfs ファイルが に保管されている場合、 の設定は以下のようになるでしょう:

genkernel を用いる
カーネルの設定とビルドに使わなかった場合でも、Gentoo のカーネルビルドユーティリティ を initramfs の生成に使用することができます.

を initramfs の生成に使う場合、 や のファイルシステムをマウントするために必要な全てのドライバーやコードはカーネルに(モジュールとしてではなく)含めることをおすすめします. そして、以下のように を実行します:

システムによっては、以下のオプションのうちいくつかが必要になるかもしれません:

完了すると、できた initramfs ファイルが に保存されます.

dracut を用いる
ユーティリティーは initramfs ファイルを管理することを唯一の目標として作られました. どのモジュールを含め、またどれを含めないかについて、高度にモジュール化されたアプローチを使用します.

必要なモジュールをセット(またはアンセット)することをおすすめします. で DRACUT_MODULES を設定したら、 を実行して Dracut ユーティリティーをインストールしてください.

次のステップは を編集して  を設定することです. 設定ファイルはコメントがしっかり付けられており、必要なモジュールのサポートを追加するために利用できます.

設定が終わったら、以下のように を実行して initramfs を作成します:

こうして生成されるイメージは の設定をもとに一般的なシステムブートをサポートします. また、あなたのシステムに特化した initramfs を生成することもできます(この場合、 は既存のシステムから必要なツール、ドライバーなどの検出を試みます). モジュールやドライバーを(分離されたモジュールやファームウェアへの参照としてではなく)カーネルに組み込んでいる場合には、 オプションを追加できます:

詳細については dracut や dracut.cmdline のマニュアルページを参照してください:

参考

 * Gentoo 公式 Wiki の Initramfs.
 * Gentoo 公式 Wiki の Dracut.

外部の情報

 * Linux カーネルドキュメント内の ramfs-rootfs-initramfs.txt ファイル.