INITRD(4)

名前
initrd - ブートローダによって初期化された RAM ディスク

説明
/dev/initrd スペシャルファイルは読み込み専用のブロックデバイスである。 /dev/initrd はカーネルが起動される前にブートローダ(boot loader)によって 初期化(例えば、ロード)されるラムディスク(RAM disk)デバイスである。 カーネルは、その後 /dev/initrd ブロックデバイスの内容を 2 段階システム起動(two phased system boot-up)に利用することができる。

最初のブートアップ段階(first boot-up phase)では、カーネルは (例えば、ブートローダによって初期化された RAM disk である) /dev/initrd の内容を初期ルートファイルシステム(root file-system) としてマウント して起動する。 第二段階では初期ルートデバイスに含まれているものから、追加のドライ バやその他のモジュールがロードされる。 追加のモジュールがロードされた後、新しいルートファイルシステム(すなわ ち、通常時のルートファイルシステム)が別のデバイスからマウントされる。

ブートアップ作業
initrd を利用した時は、システムは次のようにブートする:

    1. ブートローダはカーネルプログラムと /dev/initrd の内容をメモリにロードする。

    2. カーネル起動時、カーネルは /dev/initrd デバイスの内容を展開し、 /dev/ram0 にコピーする。さらに、 /dev/initrd の使っていたメモリを開放する。

    3. カーネルは /dev/ram0 デバイスを初期のルートファイルシステムとして読み書き可能な形式でマウン トする。

    4. もし、指示されたルートファイルシステムが初期ルートファイルシステム (例えば /dev/ram0 )と同一なら、カーネルは普通のブートシーケンスのための最後のステップを 省略する。

    5. もし、 /linuxrc という実行可能なファイルが初期ルートファイルシステムにおいて提供され ていれば、 /linuxrc をユーザ ID 0(すなわち、root)の権限で実行する。 ( /linuxrc ファイルは実行可能パーミッションが与えられていなければならない。 /linuxrc は正当な実行ファイルであればよく、シェルスクリプトでも構わない)。

    6. もし。 /linuxrc が実行されない、または、 /linuxrc の実行が終了した時は、通常時ルートファイルシステムがマウントされる。 (もし /linuxrc を終了した時、何らかのファイルシステムが初期ルートファイルシステム上に マウントされている場合のカーネルの動作は 決められていない(不定である) 現在のカーネルがどのように動作するかは、 注意 のセクションを参照のこと)。

    7. もし、通常時ルートファイルシステムが /initrd というディレクトリをもっているなら、 /dev/ram0 デバイスは / から /initrd に移動される。 /initrd ディレクトリが存在しない場合は、 /dev/ram0 はアンマウントされる。 ( / が /initrd に移された時 /dev/ram0 はアンマウントされない。その結果、 /dev/ram0 で走り始めたプロセスはそのまま残る事ができる。 もし、 /initrd ディレクトリが通常時ルートファイルシステムに存在せず、 /linuxrc が終了した時に /dev/ram0 上で実行された、なんらかのプロセスが走り続けていた場合の カーネルの動作は 決められていない(不定である)。 現在のカーネルが、この時どのような動作をするかについては、 注意 を参照のこと)。

    8. 普通のブートシーケンス(例えば、 /sbin/init の起動)が通常時ルートファイルシステム上で行われる。

オプション
initrd を用いる場合にカーネルのブートアップ操作に影響を与えるブートローダ・オプ ションは次のような物がある、

initrd=ファイルネーム
    /dev/initrd の内容としてロードするファイルを指定する。 LOADLIN では、これはコマンドラインオプションである。 LILO では、 LILO の設定ファイルである /etc/lilo.config においてコマンドとして用いなければならない。 このオプションで指定されるファイルは典型的な場合 gzip 圧縮されたファイ ルシステムイメージである。

noinitrd
    この起動時オプションは 2 段階起動操作を無効にする。 カーネルは /dev/initrd が初期化されていない場合と同じ、通常のブートアップ動作を行う。 このオプションを用いると、ブートローダによってメモリ上にロードされた /dev/initrd の内容は保存される。 つまり、このオプションを用いる事によって、 /dev/initrd の内容を(ブート以外の目的に)利用することが可能になる。また、その内容は ファイルシステムイメージに限定されない。 しかし、 /dev/initrd デバイスは読みだしのみ可能であり、システムの起動後 1 度しか読み出す事 ができない。

root=device-name
    通常時ルートファイルシステムとして使われるデバイスを指定する。 LOADLIN では、これはコマンドラインオプションである。 LILO ではコマンドラインオプション、または、 LILO の設定ファイルである /etc/lilo.config のオプションラインとして使用する。 このオプションで指定されるデバイスは、適切なルートファイルシステムとし てマウント可能なデバイスでなければならない。

通常時ルートファイルシステムの変更
デフォルトでは、カーネルの設定 (例えば、 rdev を用いてカーネルファイル内にセットされたもの、または、コンパイル時にカー ネルファイル内に埋め込まれたもの)、 または、ブートローダのオプション設定によって指定されたものが通常時ルー トファイルシステムとして使われる。 NFS マウントされた通常時ルートファイルシステムを利用する場合、 nfs_root_name と nfs_root_addrs ブートオプションを NFS の設定を与えるために用いなければならない。 NFS マウントされたルート(ファイルシステム)に関しての、より詳しい情報につ いては、カーネルのドキュメントファイル nfsroot.txt を参照の事。 ルートファイルシステムの設定に関する、より詳しい情報については、 LILO と LOADLIN のドキュメントを参照の事。

また、 /linuxrc を用いる事によっても通常時ルートファイルシステムデバイスを変更すること ができる。 /linuxrc を用いて、通常時ルートデバイスを変更するためには、 /proc がマウントされていなければならない。 /proc がマウントされた後、 /linuxrc 実行時に proc ファイル /proc/sys/kernel/real-root-dev, /proc/sys/kernel/nfs-root-name, /proc/sys/kernel/nfs-root-addrs に書き込む事によって通常時ルートデバイスを変更する。 / (NFS ではない)物理的なルートデバイスの場合、 /linuxrc によって新しいルートファイルシステムのデバイス番号が /proc/sys/kernel/real-root-dev に書き込まれる事によって、ルートデバイスが変更される。 NFS ルートファイルシステムの場合、 /linuxrc によって NFS の設定が /proc/sys/kernel/nfs-root-name と /proc/sys/kernel/nfs-root-addrs に書き込まれ、さらに /proc/sys/kernel/real-root-dev に(疑似 NFS デバイスナンバーである) 0xff を書き込むことによってルート デバイスが変更される。 例えば、次のシェルコマンドラインは通常時ルートデバイスを /dev/hdb1 に変更するはずである。
        echo 0x365 >/proc/sys/kernel/real-root-dev
また、NFS の場合、次のようなシェルコマンドラインはローカルネットワーク の 193.8.232.2 という IP アドレスを持つ NFS サーバの /var/nfsroot NFS ディレクトリを 193.8.232.7 という IP を持つ idefix という名前のシ ステムの通常時ルートデバイスとしてマウントするように変更するはずである。
	echo /var/nfsroot >/proc/sys/kernel/nfs-root-name
	echo 193.8.232.2:193.8.232.7::255.255.255.0:idefix \
	  >/proc/sys/kernel/nfs-root-addrs
	echo 255 >/proc/sys/kernel/real-root-dev

使い方
initrd を実装した主な目的は、システムインストール時に、モジュール化されたカー ネルの設定を可能にすることである。

次のような流れのシステムインストールが可能になる:

    1. ローダプログラムはフロッピや、その他のメディアからミニカーネル(例え ば、 /dev/ram, /dev/initrd と ext2 ファイルシステムのみのサポートしたカーネル)をブートし、 gzip 圧縮された初期化ファイルシステムイメージを /dev/initrd にロードする。

    2. /linuxrc の実行により、(1) 通常時ルートファイルシステム(すなわち、デバイスタイ プ、デバイスドライバ、ファイルシステム)のマウント (2) 配布メディア(例 えば、CD-ROM, ネットワーク、テープ、…) のためになにが必要かを決定する。 これは、ユーザへの問い合わせ、自動検出、あるいはその両者の方法を組み合 わせて使用する事で解決する。

    3. さらに、 /linuxrc の続きを実行することにより、初期化ルートファイルシステムから必要なモ ジュールをロードする。

    4. ルートファイルシステムを作成し、配置する(この段階では、通常時ルー トファイルシステムは完全なシステムである必要はない)。

    5. /proc/sys/kernel/real-root-dev をセットし、 /proc や、マウントされている通常時ファイルシステム、その他のファイルシステム をアンマウントし、 /linuxrc の実行を終了する。

    6. カーネルは、次に通常時ルートファイルシステムをマウントする。

    7. この状態で、マウントされたルートファイルシステムはそのまま、利用可 能である。また、ブートローダをインストールすることができる。

    8. ブートローダは、システム起動時に使用されるカーネルモジュールのセッ トを含んだ /dev/initrd のファイルシステムをロードするように、設定される (例えば、 /dev/ram0 デバイスの内容を修正し、アンマウントする。最後に、 /dev/ram0 のイメージをファイルに書き出す)。

    これで、システムがブート可能になる。この後、さらにその他のインストール の作業を行う事ができる。

上記の動作での /dev/initrd の役割のキーポイントは、初期カーネルの選択や大きなジェネリックカーネル、 カーネルの再構築なしに、通常のシステム操作で再利用可能な設定データを利 用することにある。

2 番目のケースは、一つの管理上のネットワークにおいて、異なる設定のハー ドウェアのシステム上で Linux を動作させるためのインストールを行う場合 である。 このようなケースの場合、ごく小数のカーネルのセット(理想的にはたった一 つのカーネル)のみを利用し、システム固有の設定情報は可能な限り小さくす ることが望ましいであろう。 この場合、全ての必要なモジュールと共にコマンドファイルを作成する。 そして、 /linuxrc ファイル、または、 /linuxrc から実行されるファイルのみを異なったものにしておく。

3 番目のケースは、より便利な復旧用ディスクでの利用である。 ルートファイルシステムパーティションの位置のような情報がブート時に必要 ないため、 /dev/initrd からロードされたシステムは、ユーザへの問い合わせや自動検出と利用可能か どうかのチェックを用いて、ルートファイルシステムをマウントする事ができ る。

(他にもたくさん例があるだろうが)最後の例として、CD-ROM 上の Linux ディ ストリビューションをより簡単に CD-ROM からインストールするために initrd を利用できるだろう。 ディストリビューションは、フロッピを全く利用せずに CD-ROM から直接 /dev/initrd をロードするために LOADLIN を利用できる。 また、 LILO ブートフロッピを使ってブートを行い、CD-ROM から /dev/initrd を通してより大きなラムディスクをブートストラップする。

設定
/dev/initrd は読み込み専用にブロックデバイスでメジャーナンバー 1 マイナーナンバー 250 が割り当てられる。 普通、 /dev/initrd の所有者は root.disk であり、モードは 400 (root によって読み出す事のみ可能) である。 もし、Linux システムがあらかじめ作成された /dev/initrd ファイルを持っていなかった場合、次のようなコマンドを用いる事によって作 成する事ができる。:

        mknod -m 400 /dev/initrd b 1 250
        chown root.disk /dev/initrd

また、 /dev/initrd を用いるためには "RAM disk" と "Initial RAM disk" (例えば、 CONFIG_BLK_DEV_RAM=y かつ CONFIG_BLK_DEV_INITRD=y )の両方のサポートを直接カーネルに組み込む事が必要である。 /dev/initrd を用いる場合、RAM ディスクドライバをモジュールとしてロードする事はでき ない。

ファイル
/dev/initrd
/dev/ram0
/linuxrc
/initrd

関連項目
chown(1), mknod(1), /dev/ram(4), freeramdisk(8), rdev(8), カーネルソースパッケージに含まれるドキュメントファイル initrd.txt 、LILO のドキュメント、LOADLIN のドキュメント、SYSLINUX のドキュメント。

注意
1. 現在のカーネルでは、 /dev/ram0 が / から /initrd に移動された時にマウントされていたファイルシステムは、その後も継続的に アクセス可能である。しかし、 /proc/mounts エントリは更新されない。

2. 現在のカーネルでは、 /initrd ディレクトリが存在ぜず、 /dev/ram0 を何らかのプロセスが利用していたり、何らかのファイルシステムがその上に マウントされていた場合、 /dev/ram0 は完全にはアンマウントされない。 /dev/ram0 が、完全にアンマウントされなければ、 /dev/ram0 はメモリ上に残ってしまうはずである。

3. /dev/initrd の利用者は、上記の注意事項で述べてきた動作に依存すべきではない。 これらの動作は Linux カーネルの将来のバージョンでは変更されるかもしれ ない。

著者
initrd デバイスのためのカーネルコードは Werner Almesberger <almesber@lrc.epfl.ch> と Hans Lermen <lermen@elserv.ffm.fgan.de> に よって書かれた。 initrd のためのコードが正式な Linux カーネルに組み込まれたのは開発者向けバー ジョンであった 1.3.73 からである。

翻訳者
石川 睦 <ishikawa@linux.or.jp>