akmemを試す

2002.10.14 初稿
2002.10.27 カーネルオプションについて追加、変更
2002.12.31 こんな時期に子ネタ追加
2003.06.22 カーネル2.4.17の補足追加

概要

PS2Linuxは "shutdown -r now" をしても自動的にリブートしてくれません。
リセットボタンを押せば良いわけですが、どうも面倒です。
またサーバ運用などでリモートでメンテナンスなんかをしたときにも困ります。
ハード的にダメなのかソフト的な問題なのかは不明ですが不便です。

でも実現したい物は実現したいわけで、方法を見つけました。

前提条件

この方法を行うには下記の事が前提条件です。
・PS2向けに公開されているカーネル 2.2.19 以上の akmem 対応のカーネルを使用
・カーネルを作るときに Another kernel memory device support を付けている(CONFIG_AKMEM=y)
 (何も考えずにデフォルトの config を使えば Y になってるので普通は平気)

カーネルの作り方はここからたどって下さい。

ここで紹介するやり方はBB NaviやHDDゲームとPS2Linuxを共存している環境です。
つまりPS2Linuxβ版をベースにしたものです。PS2Linux 1.0ベースの場合は未確認です。(たぶん同じだと思うけど)

ダウンロード

今回のリブートの実現には akmem という仕組みを使います。
元々はOS起動後に別のOS(カーネル)を起動するための2段ブートローダ用の仕組みみたいです。
ネタ元はこちらにあります。(タイトルに boot loader と無かったら絶対に気が付かなかっただろうな。。。)
ただし、ネタ元で公開されているソースのままでは動かなかったのでakmem_ps2修正版を作りました。

インストール

# cd /usr/src
# ls -l
lrwxrwxrwx    1 root     root           16 xxx xx xx:xx linux -> linux-2.2.19_ps2
drwxr-xr-x   15 root     root         4096 xxx xx xx:xx linux-2.2.19_ps2

/usr/src/linuxが 2.2.19または2.2.21, 2.4.17 のカーネルを指してください。
 → /usr/src/linux-2.*.*/include/linux/akmemio.hだけが必要です。
   このファイルだけ持ってきて、ソースのinclude部分を修正しても良いです。

# tar zxf akmem_ps2.tar.gz
# cd akmem_ps2
# make
# make mknod
# make install      → /sbin/akload です。いやなら手動でコピーして。

使用方法

実に簡単で、
# /sbin/akload -rv /boot/vmlinux-2.2.19
これだけで勝手にshutdownプロセスが走った後で、/boot/vmlinux-2.2.19 カーネルで再起動が掛かります。
カーネル新しくしたときとか、カーネル同じでもリブートしたいときとかに手間が掛からず便利です。

本当は引数にカーネルオプションを付けられるようなのですが、PS2では反映されません。
カーネルオプションを任意の物に反映させるには、それなりの改造が必要になってきます。
固定のオプションに変更したいだけの場合は、カーネル作成の際に以下のファイルに組み込めば良いです。

/usr/src/linux/arch/mips/ps2/sbios/init.c  (カーネル 2.2.*)
/usr/src/linux/arch/mips/ps2/prom.c     (カーネル 2.4.17)

/* get command line parameters */ で、RuntimeEnvironmentで指定されたカーネルオプションをコピーしています。
ここでオプション文字列を操作する処理を組み込んたカーネルを用意すればよいでしょう。


応用例

BB Navigatorの起動の仕組み(CD/DVD不要)と組み合わせてPS2LinuxDVD無しにPS2Linuxを起動する!
(応用例といいつつも、実はこっちがメインだったりして)

akmemを使えばPS2Linux起動後に別のカーネルに差し替えができるってわけです。
ということはBB Navi起動後にPS2Linuxという手順を入れれば、PS2LinuxDVDが無くてもPS2Linuxが起動できるってわけです。
結論から言えば、”できます” (初期型PS2+BBN 0.20で確認)
もちろんBB Navigator側Linuxの起動スクリプトをさわることになるので自己責任で!

ただし、ちょっとやっかいな事があります。
BBNはカーネルオプションとして "root=/dev/hda1 crtmode=ntsc graphics CONSOLE=/dev/null" となっています。
カーネルオプションを変えることができないので、上記以外の環境で使いたい場合にはカーネル側で細工が必要です。
特にルートパーティションが /dev/hda1 じゃない人は修正必須でしょう。
それ以外の人は直さなくてもネットワーク経由なら使えるという感じです。でも直したほうがいいよ。

(1)怪しいパッチを宛てた2.2.19または2.2.21または2.4.17カーネルを作る。
このとき、カーネルオプションを埋め込んでおきます。
# vi /usr/src/linux/arch/mips/ps2/sbios/init.c (カーネル2.2.*の場合)
# vi /usr/src/linux/arch/mips/ps2/prom.c    (カーネル2.4.17の場合)
        /* get command line parameters */
        if (ps2_bootinfo->opt_string != NULL) {
            int i;
            for (i = 0; i < CL_SIZE - 1 && ps2_bootinfo->opt_string[i]; i++)
                arcs_cmdline[i] = ps2_bootinfo->opt_string[i];
            arcs_cmdline[i] = '\0';
        }
        strcpy(arcs_cmdline, "root=/dev/hda1 crtmode=ntsc");

        if (*(unsigned long *)(ps2_bootinfo->sbios_base + SBIOS_SIGNATURE) != 0x62325350) {
(2)インストールする
# mount -t reiserfs /dev/hda11 /mnt/bbn
# cp -p /sbin/akload /mnt/bbn/sbin
# cp -p /usr/src/linux/vmlinux /mnt/bbn/boot/ps2linux-2.2.21
# vi /mnt/bbn/etc/rc.d/謎
適当な場所に /sbin/akload -r /boot/ps2linux-2.2.21

# umount /mnt/bbn
上記対応だと、BB Navigatorを起動することができなくなっちゃいますね。
起動時に切り替えたいというのであれば、たとえばこんなコードを入れればよい。
(コントローラのボタン押しながら起動したときのみPS2Linuxを起動する)
PS2PAD=0
if [ ! -f /proc/ps2pad ]; then
    modprobe ps2pad
    PS2PAD=1
    sleep 1
fi
BUTTON=`cat /proc/ps2pad | awk '$1==0 { print $5; }'`
[ $PS2PAD -ne 0 ] && rmmod ps2pad

[ "$BUTTON" != "" -a "$BUTTON" != "FFFF" ] && /sbin/akload -r /boot/ps2linux-2.2.21


ところで、上記方法で起動したPS2Linuxに思わぬ副産物(?)があることが判明しました。
と言っても前提条件をクリアできる人がどれだけいることか。
・BBNaviからakmemを使ってPS2Linuxを起動した環境
・PS2のメモカをマウントすると、なぜか BWLINUXディレクトリがトップに見えるようになっている人(謎)

何が副産物かというと、なんとBIEXEC-DVDPLAYERとかBIEXEC-SYSTEMなんてのも見えるようになっちゃいました。
HDDにコピーし、メモカのオリジナルを消して、コピーし直すと、普通のディレクトリ扱い(謎)になります。
それでも、もちろんDVDプレイヤとしても機能しますし、BBNのシステムであれば、BBNも起動できます。
といってもこれは同じメモカに戻した場合の話です。
違うメモカにコピーしても無駄です。何故かは ここを見ればわかるかな。
でもちょっと知恵を働かせれば...


戻る