Linux CD-ROM ゲームシステム |
||
YAMAMORI Takenori ●yamamori |
CD-ROMゲームシステムを作るためには、Linuxのブートの仕組みを よく理解しておく必要がある。まず、HDDにインストールされた通常のLinuxの、 マシンに電源が入ってからシステムが起動するまでの流れ図を以下に示す。
+--------------------+ | 電源ON | +--------------------+ | +--------------------+ |PCのBIOSが起動する。| +--------------------+ | +----------------------------------------------------+ |BIOSは、設定にしたがってブート可能なメディアを探し、| |HDDのMBRに書かれたプログラム(=LILO)をロードし、 | |LILOに制御を移す。 | +----------------------------------------------------+ | +----------------------------------------------+ |LILOは、BIOS経由でHDDからカーネル(vmlinuz)と| |初期RAMディスク(initrd)をロードし、(※注1) | |カーネルに制御を移す。 | +----------------------------------------------+ | | (ここから先はBIOSを使わない) | +---------------------------------------------------+ |カーネルはinitrdをRAMディスクとして展開し、 | |これを仮の“/”ファイルシステムとしてマウントする。| +---------------------------------------------------+ | +------------------------------------------------------------------+ |カーネルは、initrdの中に実行可能な/linuxrcが | |存在する場合は、それを実行する。(※注2) | |/linuxrcは通常はシェルスクリプトであり、この中では、 | |「正規の“/”ファイルシステムをマウントする前に必要な処理」が | |行なわれる。SCSI HDDを“/”として用いたシステムでは、 | |/linuxrcの中のinsmodコマンドにより、SCSIモジュールがロードされる。| +------------------------------------------------------------------+ | +-----------------------------------------------------------+ |/linuxrcが終了すると、カーネルは正規の“/”ファイルシステム| |(たとえば/dev/hda1や/dev/sda1)をマウントする。(※注3) | |そして“/”ファイルシステム上の/sbin/initを実行する。 | +-----------------------------------------------------------+ | +--------------------------------------+ |initは、/etc/inittabの記述にしたがい、| |まず、/etc/rc.d/rc.sysinitを実行する。| +--------------------------------------+ | +----------------------------------------------+ |initは次に、デフォルトのランレベルに応じて | |/etc/rc.d/rcをランレベルを引数として実行する。| +----------------------------------------------+ | +-------------------------------------------------------------------+ |/etc/rc.d/rcは、たとえばランレベル3なら、/etc/rc.d/rc3.d以下の、 | |SnnXXXX(nn=数字)というシェルスクリプトを、startという引数を付けて| |S00XXXX〜S99XXXの順に実行する。 | +-------------------------------------------------------------------+ | +-----------------------------------------------------+ |/etc/inittabの記述にしたがい、 | |ランレベル3の場合はmingetty(CUI login)のみ、 | |ランレベル5の場合はさらにxdm(GUI login)を起動して、| |login待ち状態になる。 | +-----------------------------------------------------+ |
一方、CD-ROMゲームシステムでは、起動の流れ図は以下のようになる。
+--------------------+ | 電源ON | +--------------------+ | +--------------------+ |PCのBIOSが起動する。| +--------------------+ | +---------------------------------------------------------------+ |BIOSは、設定にしたがってブート可能なメディアを探し、 | |FDエミュレーションモードのEl Toritoブート可能CD-ROMを見つける。| +---------------------------------------------------------------+ | +--------------------------------------------------------------+ |BIOSは、CD-ROM内のエミュレートされたFDイメージの先頭セクタから| |プログラム(=LILO)をロードし、LILOに制御を移す。 | +--------------------------------------------------------------+ | +---------------------------------------------------------------+ |LILOは、BIOS経由でエミュレートされたFDからカーネル(vmlinuz)と| |初期RAMディスク(initrd)をロードし、カーネルに制御を移す。 | +---------------------------------------------------------------+ | | (ここから先はBIOSを使わない) | +---------------------------------------------------+ |カーネルはinitrdをRAMディスクとして展開し、 | |これを仮の“/”ファイルシステムとしてマウントする。| +---------------------------------------------------+ | +-------------------------------------------------------------------+ |カーネルはinitrd内の/linuxrcを実行する。 | |/linuxrc内で、cdmount(後述)という特別なマウントコマンドを実行し、| |/mnt/cdromにゲームシステムのCD-ROMをマウントする。 | |さらに/linuxrc内のコマンドにより、正規の“/”ファイルシステムの | |デバイスをこのinitrd自身に変更し、/linuxrcを終了する。 | +-------------------------------------------------------------------+ | +---------------------------------------------------+ |正規の“/”ファイルシステムがinitrd自身であるため、| |カーネルはそのまま/sbin/initを実行する。 | |/sbin/initは、シンボリックリンクでCD-ROM内の | |/mnt/cdrom/sbin/initにリンクされている。 | +---------------------------------------------------+ | +--------------------------------------+ ← |initは、/etc/inittabの記述にしたがい、| Vine 2.0 では、rc.sysinitの |まず、/etc/rc.d/rc.sysinitを実行する。| 実行時に“Welcome to Vine Linux” +--------------------------------------+ というメッセージがカラーで表示 | されるため、わかりやすい。 +-------------------------------------------------------------------+ |デフォルトのランレベルは1(シングルユーザモード)に設定されており、| |/etc/rc.d/rcが、引数1で実行される。 | +-------------------------------------------------------------------+ | +---------------------------------------------------------------------+ |/etc/rc.d/rcは、/etc/rc.d/rc1.d以下のシェルスクリプトを、 | |S00singleから順番に実行する。(※注) ここで、このディレクトリ内に | |特別に作成してある、S99gameというシェルスクリプトが最後に実行される。| +---------------------------------------------------------------------+ | +-------------------------------------------------------------+ |S99game内で、PATHなどの設定や、セーブ用FDのマウントを行ない、| |xinitでXを起動する。.xinitrcには目的のゲームの起動コマンド | |のみが書かれており、これでゲームが直接起動する。 | +-------------------------------------------------------------+ |
以上、ブートの仕組みは結構複雑だが、ざっと概要を理解していただきたい。 ゲームシステム用のCD-ROMは、それ自体は基本的には普通のLinuxの“/”以下を まるごとコピーしてきたものである。しかし、これをまさか直接“/”に マウントすることはできないので、まずinitrdを“/”としてマウントし、 initrdの中の/mnt/cdromにゲームシステム用のCD-ROMをマウントするのである。 その際に、シンボリックリンクをうまく使うなどして、 CD-ROMマウント後のディレクトリ構成が通常のLinuxと同様に見えるように するための工夫を行なっている。
さて、HDDが要らないCD-ROMゲームシステムだが、そのCD-ROMを作るためには いったんHDD上に「ベースシステム」としてLinuxをインストールし、 シングルユーザモードでゲームが起動する状態に設定しなければならない。 そして、最終的にCD-Rを焼くまでに、以下のような手順を必要とする。