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 変数に正しい値のサポートを含めるよう特に注意を払ってください. この変数は でシステム特有の構成をサポートするように設定できます:

It is advisable to set (or unset) the modules needed. After configuring the DRACUT_MODULES variable in, to install the Dracut utility.

The next step is to configure by editing. In the configuration file, which is well commented, in order to add support for needed modules.

Once configured, create an initramfs by calling as follows:

The resulting image supports generic system boots based on the configuration in. It is also possible to generate an initramfs specifically tailored to your system (which tries to detect the needed tools, drivers, etc. from the existing system). If the modules and drivers are built into the kernel (not as separate modules and references to the firmware), then the  option can be added:

For more information, check out the dracut and dracut.cmdline manual pages:

さらなる情報

 * Initramfs on the official Gentoo Wiki.
 * Dracut on the official Gentoo Wiki.

外部の情報

 * The ramfs-rootfs-initramfs.txt file within the Linux kernel documentation.