PS3 Linux カーネルのコンパイル

PS3 の Debian 版インストーラでインストールされるカーネルの config を見ると
いろいろ手が入っていて、ADDON CD (FC5) のバイナリよりもさまざまなオプション
が有効になっているようです。
試しに手持ちの USB 器機、 corega FEther USB-TX をつないでみたら
あっさり認識してしまいました。
USB1.1 用の LANアダプタ なので今ではあんまり使い道が無いのですが。
USB 無線LAN とか他のアダプタはドライバ無くてだめでした。

Fedora Core 5 でもこのアダプタが使えるようにカーネルをコンパイルしてみました。

ADDON CD 20061208 の \src からカーネルソースを適当なフォルダに持ってきます。
   linux-20061208.tar.bz2

展開します

 $ tar -jxvf linux-20061208.tar.bz2

とりあえず標準の config でコンパイルしてみます。
手順は ADDON CD の LinuxKernelOverview.html に書かれているとおりです。

 $ cd linux-20061208
 $ make ps3pf_defconfig
 $ make

ここで指定した make ps3pf_defconfig は、arch/powerpc/config/ps3pf_defconfig
を参照しているようです。
コンパイルがうまくいったので、今度は Debian のカーネル config でコンパイル
してみます。

Debian を install したドライブの /boot/config-2.6.16-ps3pf をコピーしてきます。
/mnt/usbhdd にマウントしてあると仮定してこんな感じ。

 $ cp /mnt/usbhdd/boot/config-2.6.16-1-ps3pf ./.config

module install 時に既存のシステムを上書きしないようにバージョン番号を変えて
おきます。

 $ make menuconfig

  General setup
    → Local version – append to kernel release

  ここに文字列を追加します。”-net2″ にしてみました。
  必要ならここで他の設定も変更します。

 $ make clean
 $ make

念のために、既存の module やカーネルをバックアップしておきます。
(命名を間違えて上書きしてしまわないように)

 # cd /boot
 # cp vmlinux-2.6.16 vmlinux-2.6.16.org
 # cp initrd.img initrd.img.org
 # cp config-2.6.16 config-2.6.16.org
 # cp System.map-2.6.16 System.map-2.6.16.org

 # cd /lib/modules
 # cp -r 2.6.16 2.6.16.org

元のカーネルのソースフォルダに戻って module を install します。

 # make modules_install

これで /lib/modules/2.6.16-net2 というフォルダに新しいモジュールファイルが
格納されます。

新しいカーネルを /boot にコピーします。

 # cp vmlinux /boot/vmlinux-2.6.16-net2
 # cp .config /boot/config-2.6.16-net2
 # cp System.map /boot/System.map-2.6.16-net2

新しいカーネル用の initrd.img を作ります。

 # cd /boot
 # /sbin/mkinitrd –with-usb initrd.img-2.6.16-net2 2.6.16-net2

ここで注意点。USB の外付け HDD から起動している場合上記の –with-usb が
必要です。

またこのままだと、生成される initrd.img の中の init ファイルに例の 15秒待ち
が無いので、以前苦労したように認識が遅いドライブだと起動しなくなってしまいます。
毎回生成された init を書き換えるのも大変なので、mkinitrd 自体を書き換えて
しまいました。

バックアップ

 # cd /sbin
 # mv mkinitrd mkinitrd.org
 # cp mkinitrd.org mkinitrd

書き換え

 # vi mkinitrd

「emit “mkblkdevs” 」という行が2つのあるので、2つ目の直前に「emit “sleep 15″」
を追加してしまいます。

 :
emit “sleep 15”
emit “mkblkdevs”
 :

これでもう一度 initrd.img を作ります。

 # cd /boot
 # rm initrd.img-2.6.16-net2
 # /sbin/mkinitrd –with-usb initrd.img-2.6.16-net2 2.6.16-net2

あとは kboot.conf でこれらの新しいカーネルを指定して起動するオプションを
加えるだけです。

 # vi /etc/kboot.conf

default=linux
timeout=30
root=LABEL=/

linux=’/boot/vmlinux-2.6.16 initrd=/boot/initrd.img ‘
net2=’/boot/vmlinux-2.6.16-net2 initrd=/boot/initrd.img-2.6.16-net2 ‘

net2= の行を追加しました。この場合、起動時の kboot: 画面で net2 と入力すると
新しいカーネルで起動します。
実際に reboot して net2 で起動してみます。

設定ミスがあると起動しなくなってしまうので注意してください。

うまく起動したら FEther USB-TX をつないでみます。
ウィンドウを起動して、
 「管理」→「ネットワーク」→「ハードウエア」のタブで eth1 が追加されており
 ハードウエア名の確認ができます。
デバイスのタブで「新規」ボタンを押して、eth1 を追加していくとネットに接続
できました。ルータにでもしましょうか。