1.2. Initial Ramdisk(/boot/initrd)

ブートローダーによりロードされた Linux カーネル(/boot/vmlinuz)がハードディスク上の / ファイルシステムをマウントするには、ある条件を満たす必要があります。カーネルが、/ ファイルシステムの存在するデバイスへアクセスするには、そのデバイスをサポートしているデバイスドライバ(カーネルモジュール)が必要になります。さらにカーネルは、Ext3、ReiserFS などのファイルシステムを理解するためのモジュールも必要とします。例えば、SCSI ドライブに / ファイルシステムが存在する場合、カーネルが / ファイルシステムをマウントする前に、その SCSI デバイスをサポートする適切なデバイスドライバがロードされていなければ、カーネルは、/ ファイルシステムをマウントすることはできません。

この問題に対処するいくつかの解決策が考えられます。

  1. カーネルにすべてのデバイスドライバを組み込む

  2. 1 つ、またはいくつかの必要なドライバだけをカーネルに組み込む

しかし、1. の方法では、異なるドライバがお互いに干渉しあい動作が不安定になる可能性があります。また、カーネルのサイズがとても大きくなってしまいます。また、2. の方法は様々なコンピュータへのインストールが想定される Linux ディストリビューションでは、何種類ものカーネルを用意しなければならないため現実的ではありません。さらに SMP 対応などで最適化された異なるカーネルが存在すれば、その数はさらに増加します。

この一般的な問題の解決策として利用されている機能が Initial Ramdisk(initrd)です。 initrd は、Linux システムとして動作させるために最低限必要な機能だけを持たせた小さなファイルシステムのイメージを圧縮したものです。Linux カーネルは、本当の / ファイルシステムをマウントする前に、RAM ディスクにロードした小さなファイルシステム(initrd)を利用するためのオプション機能を備えています。ブートローダーがカーネルをロードすることができるのであれば、initrd もロードすることができます。ブートローダーはブートデバイスからデータをロードするために BIOS のルーチンだけを必要としますので、特別なデバイスドライバを必要としません。ブートローダーはカーネルと initrd をメモリへロードし、カーネルを起動します。そしてブートローダーは、カーネルへ initrd の存在とそれがメモリのどの位置にロードされたのかを通知します。もし、initrd が圧縮されていればカーネルはそれを解凍した後に、一時的な / ファイルシステムとしてマウントします。そして、カーネルは、initrd の / ディレクトリにある linuxrc プログラムを実行します。

この linuxrc プログラムが本当の / ファイルシステムをマウントするために必要なすべての手続きを行います。つまり、/ ファイルシステムをマウントするために必要なデバイスドライバをロードし、そのデバイスへのアクセスを可能にします。linuxrc が終了すると一時的にマウントしていた / ファイルシステムはアンマウントされ、本当の / ファイルシステムがマウントされます。そして、最初のプロセスである /sbin/init を実行します。 本当の / ファイルシステムをマウントするために必要なデバイスドライバは、すでに linuxrc によって ロードされているため、カーネルは本来のブートプロセスを問題なく続行することができます。

1.2.1. Initial Ramdisk(/boot/initrd)の作成方法

新たに SCSI カードを装着し、ハードディスクを接続した場合など、Turbolinux 11 Server のインストールが完了した後で必要なカーネルモジュールを含めた Initial Ramdisk(/boot/initrd)を作成し直したいときがあります。以下では、Initial Ramdisk の一般的な作成手順を示します。

  1. /etc/modules.conf ファイルにロードするカーネルモジュール名を指定します。この例では、aic7xxx を指定しています。

    alias scsi_hostadapter aic7xxx

    注意

    カーネル 2.6 ではローダブルモジュールの構造が一新され、参照するファイルは /etc/modprobe.conf に変更されています。しかし、従来からの互換性が考慮されており、/etc/modules.conf での指定は、depmod -a コマンドを実行することにより、/etc/modprobe.conf へ反映されます。なお、depmod コマンドは、module-init-tools パッケージに収録されている /sbin/generate-modprobe.conf スクリプトを実行し、/etc/modprobe.conf を更新します。

  2. depmod を実行し、カーネルモジュールの依存関係を更新します。

    # depmod -a
  3. mkinitrd コマンドを実行し、/boot/initrd ファイルを作成します。mkinitrd は、 /etc/modules.conf の scsi_hostadapter エントリで指定されたカーネルモジュールを含めて initrd を自動的に生成します。mkinitrd の書式は以下の通りです。image に作成する initrd のイメージ名を、kernel-version に、initrd を作成したいカーネルバージョンを指定します。

    # mkinitrd option image kernel-version

    例えば、既存の /boot/initrd を新しい initrd で上書きするのであれば、以下のように mkinitrd コマンドを実行します。option に -f を指定すると、既存の initrd を強制的に上書きします。また、uname -r はカーネルのバージョンを表示するためのコマンドです。

    # mkinitrd -f /boot/initrd `uname -r`