自分自身の好みに合うLinuxを作ることは,決して難しくない。フリーソフトを手順よく組み合わせていくことで,ごく普通のユーザーであっても自分だけのLinuxを作成できる。本講座を読みながら,Linuxの仕組みを理解して『自分Linux』を完成させよう。

 今回は,前回までに作成した各種ライブラリやコマンド群,カーネルを用いて,自分Linuxの起動開始部分までを組み立てる(図1)。この組み立て作業で重要なのは,PCの電源を投入してLinuxシステムが起動するまでの仕組み作りである。この仕組み作りは少々複雑だが,手順だけでなく,作業内容を理解しながら行えば,決して難しくはない。

図1 自分Linux作成作業の流れ
今回は,initrdファイルの作成を実施する。

 それではまず,仕組み作りの予備知識として,Linuxシステムが起動するまでの流れを解説していこう。

電源オンから
Linuxが起動するまで

 最初にPCのハードウエアが起動するまでの流れを考えてみよう。PCの起動プロセスを大まかに示すと図2のようになる。PCの電源ボタンが押されると,CPUはマザーボード上に実装された「BIOS」(Basic Input/Output System)というソフトウエアを実行し,ハードウエアの初期化と自己診断処理を実施する。自己診断処理が正常終了した後,BIOSに設定されているブート可能なデバイス(ブート・デバイス)の条件に従い,ブート・デバイスが検索される*1。ブート・デバイスが発見されると,そのデバイスからブート処理を試みる。

図2 PCの起動プロセス
「BIOS」(Basic Input/Output System)というソフトウエアにより,初期化や自己診断処理が実施される。

 ブート処理では,まずブート・デバイスの先頭部分,例えばハード・ディスク装置ならMBR(Master Boot Record)と呼ばれる領域に書き込まれたプログラムが読み込まれる。読み込まれるプログラムとは,Linuxなら「GNU GRUB(GRand Unified Bootloader)」や「LILO(LInux LOader)」など,Linuxカーネルを起動できる機能を備えたブート・ローダーである*2。自分Linuxでは扱いやすさからGRUBを用いる。そのため,Linuxを起動するまでの動作については,GRUBを例にして具体的に解説する。

GRUBの仕組み

 GRUBはサイズが大きく,512バイトのMBR(セクター0)には収まらない。そのため,GRUBは「stage1」,「e2fs_stage1_5」や「fat_stage1_5」などファイル・システムごとに用意された「stage1.5」,そして「stage2」という複数のファイルに分割されている。MBRの領域にはstage1が,MBR直後の領域にはstage1.5のファイルが,またLinuxのファイル・システム内にはstage2が書き込まれる(図3)。

図3 GNU GRUBの仕組み
複数のファイルに分かれており,stage2がOSの起動処理を実施する。

 BIOSによるブート処理により,MBR上に書き込まれているstage1が読み込まれ,実行される(図3の(1))。stage1はMBR直後のセクター部分に書き込まれたstage1.5のファイルを読み込み,実行する(図3の(2))。実行されたstage1.5のファイルはLinuxのファイル・システムを認識した後,stage2を読み込んで実行する(図3の(3))。最後に,stage2がLinuxなどのOS起動を行う(図3の(4))。

GRUBによるLinuxの起動

 stage2までが正常に実行される*3と,写真1の画面が表示される。この画面から起動したいOSを選択できる。起動したいOSが選ばれたら,GRUBの設定ファイル(menu.lst)の内容に従ってOSの起動処理を開始する。Linuxの起動手順は次の通りだ(図4)。

写真1 GNU GRUBの画面
写真1 GNU GRUBの画面
起動するOSを選択できる。
[画像のクリックで拡大表示]

図4 GNU GRUBによるLinuxの起動処理<br>GRUBがカーネルやルート・ファイル・システムを読み込みながら,カーネルを起動する。
図4 GNU GRUBによるLinuxの起動処理
GRUBがカーネルやルート・ファイル・システムを読み込みながら,カーネルを起動する。
[画像のクリックで拡大表示]

(1)カーネルの読み込み
 Linuxを起動するためにカーネル・イメージをメモリー上に読み込む。カーネル・イメージはbzip2やgzipで圧縮されたファイルである(図4の(1))。

(2)initrdを読み込み
 カーネル・イメージを読み込んだら,次にinitrdファイルを読み込む(図4の(2))。initrdファイルは,Linuxが起動するときに必要なモジュール(ドライバ)や起動スクリプトを含んだファイルである。通常gzipで圧縮されており,カーネル・イメージをメモリー上に読み込んだ後,カーネル起動時にメモリー上にファイル・システムとして展開される。

(3)カーネルの起動
 読み込みが完了したら,GRUBによってカーネルが起動される(図4の(3))。カーネルは自分自身とinitrdファイルを展開して,初期化処理を実施する。その際,展開されたinitrdファイルを起動時に用いるルート・ファイル・システムとしてマウントする。

(4)linuxrcスクリプトの実行
 initrdファイルには「linuxrc」というスクリプトが含まれている。このlinuxrcスクリプトにはルート・ファイル・システムをマウントする際に必要なドライバをカーネルに読み込んでから,実際のルート・ファイル・システムをマウントするための処理が記述されている(図4の(4))。

 必要なドライバを読み込んでから実際のルート・ファイル・システムをマウントするという処理になるため,PC内のいかなるデバイスにルート・ファイル・システムを保存している場合にも確実にマウントできる。

 特に,USBメモリーという特殊なデバイスにルート・ファイル・システムを配置する自分Linuxでは,initrdファイルは欠かせない。もちろん自分Linux用に作成したinitrdファイルを用意しなければならないが,作成手順などは後半部分で詳しく紹介する。

(5)初期化プロセスの実行
 実際のルート・ファイル・システムをマウントしたら,今度はルート・ファイル・システム内にあるファイルを用いて初期化プロセスが実行される。この初期化プロセスが完了すれば,Linuxが使えるようになる。初期化プロセスに必要なファイルは次回以降に作成する。よって、初期化プロセスの具体的な内容についてもそのときに詳しく解説しよう。