Initramfs/ガイド

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page Initramfs/Guide and the translation is 19% complete.

Other languages:
English • ‎español • ‎français • ‎italiano • ‎русский • ‎中文(中国大陆)‎ • ‎日本語 • ‎한국어

Linux ベースのコンピューターシステムでは、正しくブートするために initramfs が必要になることがあります。このガイドでは initramfs を適切に作成、管理する方法や initramfs のコンセプトを説明します。

initramfs のコンセプト

はじめに

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

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

Linux のブートプロセス

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

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

  • /usr パーティションが別のファイルシステムにある場合、/usr の中に保存されているツールやドライバーは /usr が利用可能になるまで使えません。そうしたツールが /usr を利用可能にするために必要な場合、システムをブートすることができなくなります。
  • ルートファイルシステムが暗号化されている場合、Linux カーネルは init アプリケーションを見つけることができないため、ブートできないシステムになってしまいます。

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

initial root disk

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

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

  • これはれっきとしたブロックデバイスであり、ファイルシステム全体でオーバーヘッドが必要です; 固定サイズになります。initrd があまり小さすぎると必要なスクリプトがすべて収まりません。大きくしすぎるとメモリを浪費してしまいます。
  • これは真の、静的なデバイスなので Linux カーネル内のキャッシュメモリーを消費しますし、(ページングのような)メモリーやファイルを管理するメソッドを使用しがちになります。これにより、initrd はますます多くのメモリーを消費することになります。

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

initial ram file system

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

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

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

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

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

initramfs の作成

導入とブートローダーの設定

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

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

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

FILE grub.confinitramfs を使用してブートするための grub.conf のエントリの例
title Gentoo Linux 3.2.2-r5
root (hd0,0)
kernel /boot/kernel-3.2.2-gentoo-r5
initrd /boot/initramfs-3.2.2-gentoo-r5

genkernel を用いる

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

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

root #genkernel --install --no-ramdisk-modules initramfs

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

オプション 説明
--disklabel /etc/fstab での LABEL= 設定のサポートを追加する
--dmraid フェイクハードウェア RAID のサポートを追加する。
--firmware システム上で見つかったファームウェアコードを追加する。
--gpg GnuPG のサポートを追加する。
--iscsi iSCSI のサポートを追加する。
--luks LUKS 暗号化コンテナのサポートを追加する。
--lvm LVM のサポートを追加する。
--mdadm ソフトウェア RAID のサポートを追加する。
--multipath SAN へのマルチ I/O アクセスのサポートを追加する。
--zfs ZFS のサポートを追加する。

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

dracut を用いる

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

Dracut ユーティリティーをインストールするには以下を実行してください:

root #emerge --ask sys-kernel/dracut

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

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

root #dracut

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

root #dracut --host-only --no-kernel

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

user $man dracut
user $man dracut.cmdline

参考

  • Gentoo 公式 Wiki の Initramfs
  • Custom Initramfs — the successor of initrd. It provides early userspace which can do things the kernel can't easily do by itself during the boot process.
  • Early Userspace Mounting カスタム initramfs についての、もう一つの読む価値のある記事。

外部の情報