ソースコード・リテラシーのススメ

第14回 initrdを読む

この記事を読むのに必要な時間:およそ 6 分

初期化用ramdisk

カーネル本体の実行ファイルと周辺機器用のドライバを分離して,最小機能のみを持つ汎用的なカーネル本体にユーザ環境に合わせた周辺機器用のドライバを組み合わせることで,それぞれのユーザ環境にカスタマイズしたカーネルを利用することができるようになりました。

しかしながら,モジュールドライバはハードディスク(HDD)上に保存しておく必要があるため,HDD用のドライバやファイルシステム用のドライバは単純にカーネル本体から独立させることはできません。

HDDやファイルシステム用のドライバを単純にモジュール化すると, HDDを使うためのモジュールドライバはHDD上にあるという「缶切りは缶詰の中」状態になってしまいます。

この問題に対処するために考案されたのが初期化用ramdiskです。

初期化用ramdiskとは,その名の通りシステムの初期化用に使われるramdiskで,モジュールドライバやそれらを組み込むためのコマンドなどを収めた小さなファイルシステムをメモリ上に展開し,そこからHDD上のrootファイルシステムを読み込む際に必要となるモジュールドライバなどを読み込ませるようになっています。

かっての初期化用ramdiskは実際にメモリ上に確保したext2やcramfsなどのファイルシステムをダンプしたinitrd形式でしたが,最近ではcpio形式でまとめたディレクトリ構造を動的にファイルシステムに展開するinitramfs形式に変更されています。

初期化用ramdiskは複数のファイルやコマンドを含むファイルシステムですが,HDD上では1つのファイルとしてcpio形式に固めて圧縮されています。

圧縮された初期化用ramdiskファイルは,ブートローダからカーネルのイメージファイルと共にBIOS経由で(カーネルの機能を使わずに)読み込まれ,メモリ上に配置されます。メモリに読み込まれブートローダから処理を委ねられたカーネルは,共に読み込まれた initrd のイメージをramdisk上に展開して仮のrootファイルシステムとしてマウントし,そのファイルシステム上の/initコマンドを実行します。

この/initコマンドが初期化用ramdisk内に用意されているユーザの環境に応じたHDD用のドライバモジュールやrootファイルシステム用のモジュールなどをカーネル本体に組み込むことで,カーネルがHDD上のrootファイルシステムを利用できるようになります。

初期化用ramdisk上の/initは,必要なモジュールの読み込み等を終えれば,HDD上の本来のrootファイルシステムをマウントし,rootファイルシステムを切り替えます。以後の処理は本来のrootファイルシステム上にある/sbin/initの仕事となり,前回説明したように /sbin/init は/etc/inittabを見ながら必要なサービスを起動していきます。

初期化用ramdiskの実際

さて,前置きがずいぶん長くなってしまいましたが,いよいよ初期化用ramdiskの中身を具体的に調べてみることにします。

今回紹介する初期化用ramdiskはFedora Core 9のβ版を手元のVMware Server環境にインストールした際に生成されたものです。初期化用ramdiskのファイル名はカーネルのバージョンやビルド番号によって変わりますし,初期化用ramdiskに組み込まれるモジュールドライバもインストールしたハードウェア環境やファイルシステムの設定によってさまざまに変化するのでご注意ください。

まず,圧縮されている初期化用ramdiskを展開します。初期化用ramdiskは/boot ディレクトリinitrd-<カーネルバージョン>.imgの名称で保存されています。このファイルは先述のようにcpio形式のアーカイブをgzipで圧縮した形式になっていますので,適当なディレクトリを用意してそこに展開することにします。なお,/boot以下のファイルを読み出すにはroot権限が必要です。

# mkdir Initrd ; cd Initrd
# gunzip -c /boot/initrd-2.6.25-0.163.rc7.git1.fc9.i686.img | cpio -ivd
lib
lib/libparted-1.8.so.8
lib/libgcc_s-4.3.0-20080326.so.1
..
usr/lib/libdhcp6client-1.0.so.2.0.12
usr/lib/libdhcp6client-1.0.so.2
init
14818 blocks

# ls -lh
合計 40K
drwx------ 2 root root 4.0K 2008-06-03 06:13 bin
drwx------ 3 root root 4.0K 2008-06-03 06:13 dev
drwx------ 4 root root 4.0K 2008-06-03 06:13 etc
drwx------ 2 root root 4.0K 2008-06-03 06:13 firmware
-rwx------ 1 root root 2.1K 2008-06-03 06:13 init
drwx------ 4 root root 4.0K 2008-06-03 06:13 lib
drwx------ 2 root root 4.0K 2008-06-03 06:13 proc
lrwxrwxrwx 1 root root    3 2008-06-03 06:13 sbin -> bin
drwx------ 2 root root 4.0K 2008-06-03 06:13 sys
drwx------ 2 root root 4.0K 2008-06-03 06:13 sysroot
drwx------ 3 root root 4.0K 2008-06-03 06:13 usr

これで初期化用ramdiskが作業用に作成した Initrd ディレクトリ内に展開されました。展開されたディレクトリのいくつかを眺めてみます。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたのが,いつの間にかミイラ取りがミイラになってOSSを仕事にするようになってしまいました。最近はスペシャリスト養成を目的とした専門職大学院で教壇に立ったりもしています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html