initrd -
ブートローダによって初期化された
RAM ディスク
/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"
の両方の機能が Linux
カーネルに直接組み込まれていなければならない
(例えば、カーネルのコンパイル時の設定で
CONFIG_BLK_DEV_RAM=y かつ
CONFIG_BLK_DEV_INITRD=y
とする)。
/dev/initrd
を使用する場合には、RAM
ディスクドライバをモジュールとして
ロードすることはできない。
/dev/initrd
スペシャルファイルは読み込み専用のブロックデバイスである。
このデバイスはカーネルが起動される前にブートローダ
(boot loader) によって初期化
(例えば、ロード)
される RAM
ディスクである。
その後、カーネルは
/dev/initrd
の内容を二段階のシステム起動
(two-phase system boot-up)
で利用することができる。
最初のブートアップ段階
(first boot-up phase)
では、カーネルは
(例えば、ブートローダによって初期化された
RAM disk である)
/dev/initrd
の内容を初期ルートファイルシステム
(root file-system) としてマウント
して起動する。
第二段階では初期ルートデバイスに含まれているものから、追加のドライ
バやその他のモジュールがロードされる。
追加のモジュールがロードされた後、新しいルートファイルシステム
(すなわち、通常時のルートファイルシステム)
が別のデバイスからマウントされる。
ブートアップ作業¶
initrd
を利用した時は、システムは次のようにブートする:
- 1.
- ブートローダはカーネルプログラムと
/dev/initrd
の内容をメモリにロードする。
- 2.
- カーネル起動時、カーネルは
/dev/initrd
デバイスの内容を展開
(uncompress) し、 /dev/ram0
にコピーする。さらに、
/dev/initrd
の使っていたメモリを解放する。
- 3.
- カーネルは /dev/ram0
デバイスを初期のルートファイルシステムとして読み書き可能な形式でマウン
トする。
- 4.
- 指示されたルートファイルシステムが初期ルートファイルシステム
(例えば /dev/ram0)
と同一の場合は、カーネルは普通のブートシーケンスのための最後のステップを
省略する。
- 5.
- /linuxrc
という実行可能なファイルが初期ルートファイルシステムに存在すれば、
/linuxrc を UID 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=filename
- /dev/initrd
の内容としてロードするファイルを指定する。
LOADLIN
では、これはコマンドラインオプションである。
LILO では、 LILO
の設定ファイル
/etc/lilo.config
内でコマンドとして使用しなければならない。
このオプションで指定されるファイルは、多くの場合
gzip 圧縮された
ファイルシステムイメージである。
- noinitrd
- この起動オプションは二段階の起動操作を無効にする。
カーネルは /dev/initrd
が初期化されていない場合と同様の、通常のブートアップ動作を行う。
このオプションを用いると、ブートローダによってメモリ上にロードされた
/dev/initrd
の内容はそのまま保存される。
つまり、このオプションを用いることによって、
/dev/initrd の内容を
(ブート以外の目的に)
利用することが可能になる。また、その内容は
ファイルシステムイメージに限定されない。
しかし、 /dev/initrd
デバイスは読みだしのみ可能であり、システムの起動後
1 度しか読み出す事
ができない。
- root=device-name
- 通常時ルートファイルシステムとして使われるデバイスを指定する。
LOADLIN
では、これはコマンドラインオプションである。
LILO
ではコマンドラインオプション、または、
LILO
の設定ファイルである
/etc/lilo.config
のオプションラインとして使用する。
このオプションで指定されるデバイスは、適切なルートファイルシステムとし
てマウント可能なデバイスでなければならない。
通常時ルートファイルシステムの変更¶
デフォルトでは、カーネルの設定
(例えば、
rdev(8)
を用いてカーネルファイル内にセットされたもの、または、コンパイル時にカー
ネルファイル内に埋め込まれたもの)、
または、ブートローダのオプション設定によって指定されたものが通常時ルー
トファイルシステムとして使われる。
NFS
マウントされた通常時ルートファイルシステムを利用する場合、
nfs_root_name と
nfs_root_addrs
ブートオプションを使って
NFS
の設定を与えなければならない。
NFS
マウントされたルート
(ファイルシステム)
についての
より詳しい情報は、カーネルのドキュメントファイル
Documentation/filesystems/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
アドレスを持つ "idefix"
という名前の
システムの、通常時ルートデバイスとして、
ローカルネットワークの
193.8.232.2 という IP
アドレスを持つ NFS
サーバの NFS
ディレクトリ
/var/nfsroot
をマウントするように変更できる:
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
注意:
ルートファイルシステムを変更するために
/proc/sys/kernel/real-root-dev
を使うのは以前の方法である。
ルートファイルシステムを変更する新しい方法についての情報は、
カーネルソースに含まれる
Documentation/initrd.txt
ファイルや、
pivot_root(2) や
pivot_root(8)
を参照してほしい。
使い方¶
initrd
が実装された主な目的は、システムインストール時に、モジュール化されたカー
ネルの設定を可能にすることであった。
次のような流れのシステムインストールが可能になる:
- 1.
- ローダプログラムは、フロッピーやその他のメディアから、
最小限のカーネル
(例えば、 /dev/ram, /dev/initrd,
ext2
ファイルシステムのみのサポートしたカーネル)
をブートし、 gzip
圧縮された初期ファイルシステムイメージを
/dev/initrd
にロードする。
- 2.
- 実行ファイル
/linuxrc は、(1)
通常時ルートファイルシステムのマウントに何が必要か
(すなわち、デバイスタイプ、デバイスドライバ、ファイルシステム)、
(2)
配布メディアに何が必要か
(例えば、CD-ROM,
ネットワーク、テープなど)
を決定する。決定は、ユーザへの問い合わせ、自動検出、あるいはその両者の
方法を組み合わせて行われる。
- 3.
- 実行ファイル
/linuxrc
は、初期ルートファイルシステムから必要なモジュールをロードする。
- 4.
- 実行ファイル
/linuxrc
は、ルートファイルシステムを作成し、配置する
(この段階では、通常時ルー
トファイルシステムは完全なシステムである必要はない)。
- 5.
- 実行ファイル
/linuxrc は、 /proc/sys/kernel/real-root-dev
を設定し、 /proc、
マウントされている通常時ファイルシステム及びその他のファイルシステム
をアンマウントし、
実行を終了する。
- 6.
- 次に、カーネルは、通常時ルートファイルシステムをマウントする。
- 7.
- この段階で、ファイルシステムは全く変更が行われていない状態で、
アクセスできる状態になる。
また、ブートローダをインストールすることができる。
- 8.
- ブートローダを設定し、システム起動時に使用されるカーネルモジュールのセッ
トを含んだファイルシステムを
/dev/initrd にロードする
(例えば、 /dev/ram0
デバイスの内容を修正し、アンマウントする。最後に、
/dev/ram0
のイメージをファイルに書き出す)。
- 9.
- これで、システムがブート可能になる。この後、さらにその他のインストール
の作業を実行できる。
上記の動作での
/dev/initrd
の役割のキーポイントは、初期カーネルの選択や大きなジェネリックカーネル、
カーネルの再構築なしに、通常のシステム操作で再利用可能な設定データを利
用することにある。
2
番目のケースは、一つの管理上のネットワークにおいて、異なる設定のハー
ドウェアのシステム上で
Linux
を動作させるためのインストールを行う場合
である。
このようなケースの場合、ごく小数のカーネルのセット
(理想的にはたった一
つのカーネル)
のみを利用し、システム固有の設定情報は可能な限り小さくす
ることが望ましいであろう。
この場合、全ての必要なモジュールが入った共通ファイルを作成する。
そして、
/linuxrc
ファイル、または、
/linuxrc
から実行されるファイルのみを異なったものにしておく。
3
番目のケースは、より便利な復旧用ディスクを作る場合である。
ルートファイルシステムのパーティションの位置といった情報は
ブート時に必要ないため、
/dev/initrd
からロードされたシステムは、
必要な正常性チェックを行った後で、ユーザへの問い合わせや自動検出
(もしくはその両方)
を行うことができるようになる。
(他にもたくさん例があるだろうが)
最後の例としては、
initrd を利用すると、CD-ROM
上の Linux
ディストリビューションを
より簡単に CD-ROM
からインストールすることができるだろう。
ディストリビューションは、
LOADLIN
を使って、フロッピーを全く利用せずに
CD-ROM から
/dev/initrd
を直接ロードすることができる。
また、
LILO
ブートフロッピーを使ってブートを行い、
/dev/initrd を通して CD-ROM
からより大きな RAM
ディスクを起動することもできる。
ファイル¶
/dev/initrd
/dev/ram0
/linuxrc
/initrd
- 1.
- 現在のカーネルでは、
/dev/ram0 が / から /initrd
に移動された際に、移動時にマウントされていたファイルシステムは、
その後も継続的にアクセス可能である。しかし、
/proc/mounts
のエントリは更新されない。
- 2.
- 現在のカーネルでは、ディレクトリ
/initrd
が存在しない場合、
/dev/ram0
を何らかのプロセスが利用していたり、何らかのファイルシステムが
/dev/ram0
上にマウントされていると、
/dev/ram0
は完全にはアンマウント「されない」。
/dev/ram0
が、完全にアンマウント「されなければ」、
/dev/ram0
はメモリ上に残ってしまうはずである。
- 3.
- /dev/initrd
の利用者は、上記の注意事項で述べた動作に依存しないようにすべきである。
これらの動作は Linux
カーネルの将来のバージョンでは変更される
かもしれないからだ。
関連項目¶
chown(1),
mknod(1),
ram(4),
freeramdisk(8),
rdev(8)
カーネルソースパッケージに含まれるドキュメントファイル
initrd.txt、 LILO
のドキュメント、LOADLIN
のドキュメント、SYSLINUX
のドキュメント。
この文書について¶
この man ページは Linux
man-pages
プロジェクトのリリース
3.41 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。