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

 今回は,前回作成した自分Linux用initrdファイル(ramdisk.img)を用いて,自分Linuxが起動することを確認しよう(図1)。

図1●自分Linux作成作業の流れ
図1●自分Linux作成作業の流れ
今回は,Linux起動確認を実施する。

 ただし,起動を確認するといっても,実際に行うと途中で停止してしまう。なぜなら,自分Linux用initrdファイルは自分Linuxの起動時にだけ用いるルート・ファイル・システムであり,自分Linuxに不可欠な実際のルート・ファイル・システムをまだ組み立てていないからだ。そのため,前回の「(5)初期化プロセスの実行」の個所で簡単に解説した初期化プロセスを実行できずにLinuxカーネルが停止する。

 実際のルート・ファイル・システムを作成してから自分Linuxの起動を確認してもよい。しかし自分Linuxがinitrdファイルの問題で起動できなかった場合,initrdファイルから作り直さなければならない。そこで,自分Linux用initrdファイルが完成した時点で途中までは確実に起動することを確認しておきたい。

LILOを使って自分Linuxを起動

 自分Linuxの起動確認には,自分Linux開発マシンにインストールされているVine Linuxのブート・ローダー「LILO」(LInux LOader)を用いる。LILOでも前回紹介したGNU GRUB(GRand Unified Bootloader)のようにLinuxを起動できる。両者の違いは,本ページ末の別掲記事「LILOとGNU GRUBの違い」を参考にされたい。

 では,LILOで自分Linuxを起動できるように準備していこう。

(1)自分Linuxのカーネルをコピー
 まず,LILOが自分Linuxのカーネルを起動できるようにVine Linuxのカーネル・イメージが格納されているディレクトリ(/boot)に自分Linuxのカーネル・イメージ(/usr/src/linux/arch/i386/boot/bzImage)と,カーネルで利用されている変数と関数のアドレス一覧が記されているファイル(/usr/src/linux/System.map)をコピーする。

コピーする際,-pオプションを付けて所有者のユーザーIDやグループID,アクセス権限,最終修正時刻,最終アクセス時刻を同じ状態にする。ファイル名は区別しやすいようにそれぞれ「vmlinuz-2.4.29-mylinux」と「System.map-2.4.29-mylinux」にした。

(2)initrdファイルの書き換え
 「作成したinitrdファイルを用いて自分Linuxの起動確認を行う」と書いたが,実は作成したinitrdファイルであるramdisk.img をそのまま起動確認に用いることはできない。ramdisk.imgは,コンパクト・フラッシュまたはUSBメモリー用に設定したものだからだ。

 自分Linux用のルート・ファイル・システムはハード・ディスク内の/usr/local/src/origlinuxディレクトリ上で構築する。このディレクトリは本講座第1回のVine Linuxインストール時に,「hda3」のパーティションに割り当てている。自分Linux完成時にはこのディレクトリをコンパクト・フラッシュや USBメモリーに書き込み,書き込んだものをルート・ファイル・システムとして扱いながらそれらのデバイスから自分Linuxを起動する。その際,コンパクト・フラッシュなら「hda1」に,USBメモリーなら「sda1」にルート・ファイル・システムが割り当てられる。つまりパーティション番号が異なってしまう。

 このパーティション番号はデバイス・ファイル名として,initrdファイルを作成する際にlinuxrcスクリプトと/etc/fstabファイルだけに記している。その部分を起動確認用に書き換えればよい。

 そこで,ramdisk.imgを圧縮する前のファイル(/usr/local/src/origlinux/ramdisk)を,

のように/mnt/loop0ディレクトリに再びマウントする。そして,/mnt/loop0/linuxrcスクリプトと /mnt/loop0/etc/fstabファイルを書き換える。書き換えたファイルはそれぞれ図2図3の通り。「/dev/hda1」または「/dev/sda1」の個所を,「/dev/hda3」(/usr/local/src/origlinuxディレクトリに割り当てたデバイス名)に書き換える。

図2●自分Linux起動確認用に書き換えたlinuxrcスクリプト
図2●自分Linux起動確認用に書き換えたlinuxrcスクリプト

図3●自分Linux起動確認用に書き換えたfstabファイル
図3●自分Linux起動確認用に書き換えたfstabファイル

 以上の書き換えが終了したら,

のようにアンマウントする。再び圧縮してイメージ化し,自分Linuxのカーネルと同様にVine Linuxの/bootディレクトリに格納する。ファイル名も,区別しやすいように,「initrd-2.4.29-mylinux.img」にした。

 最後に,LILOの設定ファイルである/etc/lilo.confファイルに自分Linuxを起動するための設定を書き込む(図4)。

図4●自分Linuxの起動設定を追加したLILOの設定ファイル
図4●自分Linuxの起動設定を追加したLILOの設定ファイル
[画像のクリックで拡大表示]

LILOの場合には設定内容をブート・ローダーに反映させる必要があるため,

を実行する。

 liloコマンドを実行した際,出力される内容は重要である。lilo.confファイルの設定に誤りがあった場合に,出力を確認することでその誤りに気づくことがあるからだ。

 図5がliloコマンドを実行したときに出力された結果である。「Boot image:」から「Added」までが,LILOから起動できるOSの設定を出力している部分だ。最初の部分が元々記述されていたVine Linuxの設定である。「Added Linux*」の「*」はデフォルトで起動されるOSを表している。これはlilo.confファイルの「default=linux」設定によるものである。

図5●liloコマンド実行時の出力
図5●liloコマンド実行時の出力

 Vine Linuxの設定のあとに,起動確認用に追加した,自分Linuxの設定が出力されている。カーネル・イメージとinitrdファイルのファイル名や格納場所に誤りがないかを確認しておこう。

 「Writing boot sector.」の部分で設定をLILOに書き込んでいる。ちなみに「/boot/boot.0301 exists - no boot sector backup copy made.」は既存の設定がLILO内に存在するが,バックアップはしないというメッセージである。

 エラーなども出力されるため,liloコマンド実行時の出力内容はしっかり確認しておこう。

 これで,自分Linuxを起動するための設定が完了した。

起動中に停止

 システムを再起動し,Vine LinuxのLILOの画面(写真1)が表示されたら,「mylinux」を選択して自分Linuxを起動してみよう。前述した通り,図6の個所で停止したはずだ。「Kernel panic」が表示された場合,ハードウエア・リセットや電源ボタンを一定時間押してシステムを停止させるしかない。そのような方法で停止させても開発環境には何ら影響はないので,安心していただきたい。

写真1●Vine LinuxのLILO画面
写真1●Vine LinuxのLILO画面
Vine Linuxの場合,CUI画面から起動するOSを選択できる。

図6●自分Linuxの起動
図6●自分Linuxの起動
「Kernel panic: no init found. Try passing init= option to kernel.」を表示して停止する。
[画像のクリックで拡大表示]

 自分Linuxが途中まで起動できることが確認できたので,最後にマシンを再起動し,不要なファイルやディレクトリを削除しておく。

 * * *

 次回は,自分Linuxをハード・ディスク上から起動できるように自分Linux用のルート・ファイル・システムを作成させる。

LILOとGNU GRUBの違い

 最近のLinuxディストリビューションではあまり利用されなくなったが,LILOはLinux向けの定番ブート・ローダーである。現在では, GNU GRUB(以下,GRUB)が扱いやすさなどの点からLinux向けのブート・ローダーの主流になっており,多くのLinuxディストリビューションで採用されている。

コマンドラインからブート操作

 LILOのプログラムの実体は,「First boot loader」と「Second boot loader」の2つに分かれている。First boot loaderはMBR(Master Boot Record)などに格納され,ブート時にSecond boot loaderを読み込む処理を行う。そして,Second boot loaderがカーネル・イメージやinitrdファイルを読み込んでLinuxの起動処理を実施する(図A-1の(1))。

 LILOの場合,カーネル・イメージとinitrdファイルは物理的なディスクの位置情報(セクター・アドレス)を基にして読み込まれる。例えば,これらファイルを入れ替えたりした場合には位置が変更されるため,liloコマンドを使ってSecond boot loaderに反映させる必要がある。

 また,LILOではファイル・システムを認識しないため,LILOの設定ファイル(lilo.conf)に記された内容はSecond boot loaderに書き込まれている。もしLILOの設定ファイルを書き換えたなら,同様にliloコマンドを用いて設定を反映しなければならない。

 位置を書き換えたり,設定を反映したりする際,カーネル・イメージやinitrdファイルの位置情報やLILOの設定内容が誤っていたら,Linuxが起動しない状態に陥る。 復旧は難しい。

 GRUBは前回説明した通り,stage1,stage1.5,stage2の3つに分かれている。ブート時には,これら3つのファイルを順々に読み込んで実行していく。そして,stage2がLinuxを起動する(図A-1の(2))。

 stage1.5がstage2を読み込んで実行するのだが,stage1.5ではファイル・システムを認識した上でstage2をファイルとして読み込んでいる。stage2でも「menu.lst」というGRUBの設定ファイルをファイルとして認識し,その設定ファイルの内容に従って,カーネル・イメージやinitrdファイルもファイルとして読み込んでいる。

 これらがLILOと異なる点であり,カーネルやinitrdファイルを入れ替えたり,GRUBの設定を変更したりする場合でもGRUBの設定ファイルを変更するだけでよい。

 さらにGRUBでは,設定ファイルを間違えてLinuxを起動できなくなったとしても設定ファイルを一時的に書き換えてブート処理を実行できるコマンドライン・ツールが用意されている。

図A-1●LILOとGNU GRUBによるLinux起動の仕組み
図A-1●LILOとGNU GRUBによるLinux起動の仕組み