[English] [Japanese]

Linux CD-ROM ゲームシステム

 
  YAMAMORI Takenori ●yamamori@kt.rim.or.jp

●どうやって作るのか?

○ブートの仕組み

CD-ROMゲームシステムを作るためには、Linuxのブートの仕組みを よく理解しておく必要がある。まず、HDDにインストールされた通常のLinuxの、 マシンに電源が入ってからシステムが起動するまでの流れ図を以下に示す。

●電源が入ってから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待ち状態になる。                                |
  +-----------------------------------------------------+

※注1
IDEのHDDのみのシステムでは、普通、initrd を使用しない状態でLinuxがインストールされているため、initrd はロードされない。
※注2
この時、LILOなどで指定された正規のrootファイルシステムのデバイスが、 initrd 自身である場合は、/linuxrc は実行されない。
※注3
カーネル再構築、initrd の作成やLILOのインストールが不適切だと、ブート時に、 “Kernel panic: VFS: Unable to mount root fs ...” というエラーメッセージを出してハングすることがある。 これはこの段階で“/”のマウントに失敗しているのが原因だ。

一方、CD-ROMゲームシステムでは、起動の流れ図は以下のようになる。

●電源が入ってからLinuxゲームが起動するまで(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には目的のゲームの起動コマンド   |
  |のみが書かれており、これでゲームが直接起動する。             |
  +-------------------------------------------------------------+

※注
本来は、/etc/rc.d/rc/etc/rc.d/rc1.d 以下のスクリプトを順に実行するところだが、Vineのランレベル1の場合は S00single 自身がその中で他の S20random などのスクリプトを順に起動し、 最後にシングルユーザシェルを起動するようになっている。

以上、ブートの仕組みは結構複雑だが、ざっと概要を理解していただきたい。 ゲームシステム用のCD-ROMは、それ自体は基本的には普通のLinuxの“/”以下を まるごとコピーしてきたものである。しかし、これをまさか直接“/”に マウントすることはできないので、まずinitrdを“/”としてマウントし、 initrdの中の/mnt/cdromにゲームシステム用のCD-ROMをマウントするのである。 その際に、シンボリックリンクをうまく使うなどして、 CD-ROMマウント後のディレクトリ構成が通常のLinuxと同様に見えるように するための工夫を行なっている。



●CD-ROMゲームシステム作成手順

さて、HDDが要らないCD-ROMゲームシステムだが、そのCD-ROMを作るためには いったんHDD上に「ベースシステム」としてLinuxをインストールし、 シングルユーザモードでゲームが起動する状態に設定しなければならない。 そして、最終的にCD-Rを焼くまでに、以下のような手順を必要とする。


To 『Linux CD-ROM ゲームシステム』index


このページは、(株)アスキー TECH Linux Vol. 2 『CD-ROMだけですぐに遊べる! Linux ゲームシステム全解説!!』の原稿を元に、Web 用に再構成したものです。
To 謎の処理系 SunOS 4.1.4 Home
YAMAMORI Takenori 山森丈範
yamamori@kt.rim.or.jp