Linux CD-ROM ゲームシステム |
||
YAMAMORI Takenori ●yamamori |
ここまででゲームシステムの外観は見えたが、CD-ROMにした時に ファイルシステムがリードオンリーとなることにまだ対応できていない。
そこで、以下の作業を行ない、リードオンリーとなっても問題がないようにする。
CD-ROMシステムではswapは当然使用できない。 そこで、/etc/fstabの内容を見て、以下のような swapを記述した行を見つけ、 それを#でコメントアウトする。
(/etc/fstabのswapをコメントアウト) ---- #/dev/hda2 swap swap defaults ----
この変更は、リブートすると有効になる。 swapを直接外したい場合は、 “/sbin/swapoff デバイス名”コマンドを実行するとよい。 また、“/sbin/swapon -s”で現在のswapの使用状況を表示できる。
HDD上でテストしている間は気がつかないが、 CD-ROMになった時、depmodを実行すると /lib/modules以下のファイルのシークのため、ブートが極端に遅くなる。 しかも、いずれmodules.depファイルはリードオンリーで更新できないため、 depmodの実行自体が無駄である。
depmodは、ブート時に/etc/rc.d/rc.sysinit内で起動されている。 ここでは、depmodの実行属性が落ちていると実行しないようになっているため、 以下のようにdepmodのx属性を落して対処することにする。
(depmodを実行しないようにする) ---- # chmod a-x /sbin/depmod ----
/etc/mtabもリードオンリーで書き込めなくなる。 すると、マウントポイントの表示が矛盾するようになる。 それでもたいした実害はなく、ゲームは実行できるのだが、 以下のように/proc/mountsを使うように変更しておくとうまくおさまる。
(/etc/mtabの修正) ---- # rm /etc/mtab # ln -s /proc/mounts /etc/mtab ----
なお、/etc/mtabを/tmp 以下などに単純にシンボリックリンクで飛ばせばいいと思うかも知れないが、 これはlockファイルの関係でうまく行かない。
/etc/mtabをこのように/proc/mountsへのリンクに変更した場合、 ループバックマウントのumount時に、 /dev/loop*が自動的に解放されないようになるので注意が必要だ。 今後“mount -o loop”でイメージファイルをマウントした場合は、 そのumount後に、
# /sbin/losetup -d /dev/loop0
などと、明示的に実行するのを忘れないようにしなければならない。
/var/lock, /var/runは、rcスクリプトなどの実行により 書き込みが発生する。また、/var/tmpも当然書き込みが発生する。 そこでこれらを/tmpにシンボリックリンクで飛ばす。 /tmpは、最終的にはinitrdのRAMディスクとなるため書き込み可だ。
(/var/lock, /var/run, /var/tmp をシンボリックリンクで飛ばす) ---- # cd /var # mv lock lock-0 # ln -s /tmp/var/lock . # mv run run-0 # ln -s /tmp/var/run . # mv tmp tmp-0 # ln -s /tmp . ----
次に、/tmp以下に飛ばされたこれらのディレクトリを、 ブート時に作成するように、rc.sysinitスクリプトを修正する。
/etc/rc.d/rc.sysinitの220行目付近にある、
# Remount the root filesystem read-write. action "Remounting root filesystem in read-write mode" mount -n -o remount,rw /
という、“/”をremountしている行を見つけ、この行の直後に、
mkdir -p /tmp/var/run /tmp/var/lock/subsys /tmp/var/lock/console
というコマンドを追加する。
これも、あとにならないと気づかないことだが、Vine 2.0のhalt スクリプト中でfuserを実行しているのが問題になる。
CD-ROMゲームシステムではファイルシステムのマウントの仕方が特殊なため、 システムのシャットダウン時に、fuser が実行されるとそこでハングしてしまう。
そこで、以下のように修正する。 /etc/rc.d/init.d/haltの81行目付近の、
/sbin/fuser -k -m $sig $remaining > /dev/null
という行を見つけ、この行の直前に、
break
というシェルコマンドを追加して、ここでループを抜けるようにする。
これで、CD-ROMになった時も、システムがきれいに シャットダウン・リブートできるようになる。
ここまででリードオンリーファイルシステムへの対応のための修正は完了した。 ここで一度リブートし、正常にゲームが起動することを確認しておく。