CD-ROMだけで動作するオリジナルLinuxを作ろう |
||
YAMAMORI Takenori ●yamamori |
このあと,CD-ROMブートシステム特有の修正および,ログインせずに 直接アプリケーションが立ち上がるようにするための修正をなど行ないます.
このシステムは,「login:」のプロンプトなしにアプリケーションを起動するために シングルユーザモードを利用します.そこで,起動スクリプトとして /etc/rc.d/rc1.d/S99gameというファイルを作成します.(下のリスト)
このファイルの中では,まずPATHを設定し, 先ほど/lib/modules以下に直接配置したモジュールを, 依存関係にしたがってinsmodでロードするコマンドを羅列しています. そしてこのあとxinitで,目的のアプリケーションを起動します. ここではxinitの引数で直接コマンドを絶対PATHで指定し, $HOME/.xinitrcは用いていません.
なお,このS99gameは通常の起動スクリプトとは異なり, /etc/init.d以下のスクリプトへのシンボリックリンクではなく直接配置しており, また,start,stopの引数チェックも省略しています.
この状態で「/sbin/init 1」を実行してランレベル1に移行して, アプリケーションが起動されることを確認しておいてください.
#!/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:\ /usr/local/sbin:/usr/bin/X11:/usr/X11R6/bin:/root/bin export PATH insmod /lib/modules/agpgart.o ← 必要なカーネルモジュールのロード insmod /lib/modules/mga.o insmod /lib/modules/soundcore.o insmod /lib/modules/sound.o insmod /lib/modules/ac97_codec.o insmod /lib/modules/emu10k1.o insmod /lib/modules/input.o insmod /lib/modules/joydev.o insmod /lib/modules/gameport.o insmod /lib/modules/ns558.o insmod /lib/modules/analog.o aumix -v 50 -w 50 ← サウンドボリュームの設定 xinit /usr/bin/tuxracer & ← ゲームの起動 PS1='S99game# '; export PS1 ← デバッグ用にシェルを起動 /bin/sh |
そのほかの細かいファイルの修正点を以下に書きます.
/etc/inittabのデフォルトのランレベルを記述している行を, 「id:1:initdefault:」と修正して,ランレベル1で起動するようにします.
/etc/fstabにswapパーティションの記述がある場合は, その行を#でコメントアウトしてswapを使わないようにします.
/etc/mtabには,mountコマンドによってマウントされたファイルシステムの マウント状況が記録されていますが,今回のようにCD-ROMやtmpfs,pivot_rootを 行なっているシステムでは,mtabの内容が実際とは異なってしまい, mountやdfコマンドの表示がおかしくなります. そこで次のように,/etc/mtabを/proc/mountsへのシンボリックリンクに変更して, この状態を回避します.
# cd /etc; rm mtab; ln -s /proc/mounts mtab
このシステムではfsckは意味がないため,/の直下にfastbootというファイルを 作成して,fsckが実行されないようにします.
このシステムでは,前述の通りmodprobeではなくinsmodコマンドで, 依存関係に頼らずにモジュールを直接ロードします. したがってrc.sysinitからdepmodを実行する必要はなく,念のため次のように depmodの実行パーミッションを落しておきます. (少しでもtmpfsの容量を稼ぎたい場合は削除してもよいでしょう)
# chmod -x /sbin/depmod
tmpfs用のマウントポイントとしてあとで使用するため /mnt/tmpというディレクトリを作成しておきます.
以上で,不要なファイルの削除やCD-ROMシステム用の修正は完了しました. このハードディスクの状態をtar+gzipで固めます. これは,次のように/pre-bootというディレクトリを作り, そこにtmpfs.tar.gzというファイル名で保存するようにします.
# cd / # mkdir pre-boot # GZIP=-9 tar --exclude ./a --exclude ./pre-boot \ -zcvlf pre-boot/tmpfs.tar.gz .
ここで,GNU tarの「--exclude」オプションを付けて/aや/pre-bootディレクトリを アーカイブ対象からはずし,また「l」オプションで単一ファイルシステムのみが 対象になる(/procなど別のファイルシステムが除かれる)ことに注意してください.