月別アーカイブ: 2007年1月

PS3 Linux カスタム kboot を作る

ハイレゾ対応版kbootを作ります。
前回外付け USB HDD からの起動で、インストールされている kboot (otheros.bld)
の違いで少々はまりました。
また Linux のブートローダーである kboot は常に 480i で起動します。
kboot.conf に書いておけば kboot から呼ばれたカーネルは任意の画面モード
で起動しますが、その選択画面である kboot: コマンドラインはいつも 480i です。

これ、PCモニタなど 480i で表示ができない環境を使っていると結構困ります。

・Linux インストールのためだけに TV が要る
・起動ドライブや起動するディストリビューションの選択ができない

なので自前の kboot を作ってみることにしました。

rpm のインストールが必要なので、今回は build 環境として Fedora Core 5 を
使います。

(1) ppu-gcc の install

kboot の build に必要なので ppu-gcc をインストールします。
PS3 の Cell 開発環境を入れてみる」で入れた spu-gcc と要領は同じです。

http://www.bsc.es/plantillaH.php?cat_id=252
まずこちらから ppu-gcc 一式をダウンロードします。
PowerPC(ppc) 上で動作する ppu 向けのバイナリパッケージを選択します。

ppu-binutils-3.3-72.ppc.rpm
ppu-gcc-3.3-72.ppc.rpm
ppu-gcc-c++-3.3-72.ppc.rpm
ppu-gdb-3.3-72.ppc.rpm

上記パッケージを必ずこの順番でインストールします。

 # rpm -ihv ppu-binutils-3.3-72.ppc.rpm
 # rpm -ihv ppu-gcc-3.3-72.ppc.rpm
 # rpm -ihv ppu-gcc-c++-3.3-72.ppc.rpm
 # rpm -ihv ppu-gdb-3.3-72.ppc.rpm

(2) kboot のソースの準備

kboot のソースはいつもの ADDON CD に含まれています。
FC5 のインストールに使ったやつです。
ftp://ftp.uk.linux.org/pub/linux/Sony-PS3/
CELL-Linux-CL_20061208-ADDON.iso

この中の \src から kboot-20061208.tar.bz2 を任意のフォルダにコピーします。

PS3 Linux は何度も再起動したりしてるので、最近は Windows PC から putty
経由でアクセスして作業しています。なのでファイルもいつも Windows で
落としてから samba で PS3 にコピーしています。
(PS3 Linux をサーバーにしてみる)

(3) kboot (otheros.bld) の build

展開して build してみます。

 # tar -jxvf kboot-20061208.tar.bz2
 # cd kboot-20061208
 # make

HDD があふれました・・。Linux 用に 10G しか割り当てておらず、
しかも FC5 をフルインストールしたので空きが足りなかったようです。
外付けの HDD ドライブ上にソースを移してもう一度 make します。

カーネルごとコンパイルなのでかなり時間がかかりますが、
今度は特に問題も無くコンパイルが通りました。

ぽちネット さんの こちら の記事によると、kboot-10/linux が
otheros.bld そのものだそうです。参考にさせていただきました。

kboot の root イメージは kboot-10/root に入っています。
kboot 時に実行されるスクリプト init は、kboot-10/scripts/kboot にありました。

(4) kboot のカスタマイズテスト

まず YDL 版 kboot のように、kboot: 上でも ps3videomode を使えるようにします。
そもそも kboot には ps3pf_util が含まれていて、kboot-10/ps3pf_utils-1.0.1
の中にはちゃんと ps3videomode もできています。

これを root にコピーするように手を加えます。
コピーしているのは Makefile の中です。

 # vi kboot-10/Makefile

  □1556行目、boot-game-os の後ろに ps3videomode も付け加えます。

      cp $(PS3PF_UTILS_DIR)/{find-other-os-flash,other-os-flash-util,boot-game-os} $(PWD)/root/sbin

         ↓

      cp $(PS3PF_UTILS_DIR)/{find-other-os-flash,other-os-flash-util,boot-game-os,ps3videomode} $(PWD)/root/sbin

  □512行目にも boot-game-os があるので、同じように ps3videomode を加えます。

    ”$$FILE” = “root/sbin/boot-game-os” -o \
    ”$$FILE” = “root/sbin/ps3videomode” -o \

root-meta/installed からから 0byte のファイル ps3pf_utils を消します。

 # rm kboot-10/root-meta/installed/ps3pf_utils

scripts/kboot に ps3videomode の呼び出しを追加してみます。
これで「PS3 Linux で kboot をハイレゾにする」に書いたように、
いちいち kboot.conf に ps3videomode の起動を書かなくてすみます。

 # vi kboot-10/scripts/kboot

  □87行目あたり、PATH の設定のあとに追加してみる

    ps3videomode -v 3

  (ここでの設定は 3 = 720p なので、TV 等 480i の方はこの行を追加しないで
  ください)

これでもう一度 make します。

 # make

できたら otheros.bld に変換します。(gzip してリネームするだけ)

 # cp kboot-10/linux .
 # gzip -9 linux
 # mv linux.gz otheros.bld

これで自分だけの kboot (otheros.bld) ができました。

(5) otheros.bld の install テスト

正規の手順で otheros.bld をインストールするのは結構面倒です。

USB メモリや SD カードなどに書き込んでから、一旦 GAME-OS に戻って
メニューから実行する必要があります。
しかもいちいちコントローラを USB の有線接続しなければなりません。

前回「PS3 の Debian で ps3ps_util を」で Linux (Debian) 上から
ブートローダの書き込みを試しましたが見事に失敗しました。
でもせっかくだからもう一度挑戦します。今度は FC5 上からやります。

先に /sbin/find-other-os-flash を実行して、必ず /dev/sdb と表示されることを
確認してください。

 # /sbin/find-other-os-flash

ここで何も表示されなければドライバがきちんと読み込まれていない可能性があります。

書き込みの実行はこんな感じです。

 # /sbin/other-os-flash-util -b -g /dev/sdb otheros.bld

うまくいったら reboot してみます。

(6) とりあえず成功

今回は Linux 上からのブートローダーの書き込みがうまくいきました。
kboot: が表示される直前に、きちんと 720p になっています。
またこれでこれでいちいち otheros.bld の書き込みのために
GAME-OS に戻る必要がなくなりました。

もちろん試す場合は自己責任でお願いします。

もし otheros.bld の書き込みに失敗した場合、起動できなくなった場合は
次の手順に従ってください。

1. 電源も切れず何もできなくなったら、本体裏の電源スイッチを切る
2. 30秒以上待ってから本体後ろの電源スイッチを入れる
3. 前面にあるドライブの前の電源ボタンを、7秒くらい押しっぱなしにして
   電源を入れる。(音がするので指を離すタイミングがわかる)

これで強制的に GAME-OS で起動します。このとき画面モードは 480i になります。

GAME-OS 上で正常に動作する方の otheros.bld を入れなおしてください。

今回作った otheros.bld のスペックはこんな感じです。

 ・動作は FC5 版 (ADDON CD版) と同じで、常に sda1 の kboot.conf を読み込む
  (YDL 版のように全ドライブの kboot.conf をマージしない)

 ・基本的に FC5 版 (ADDON CD版) と同じ。install-fc コマンドも入ってる。

 ・YDL 版の kexec のように ps3videomode が含まれているので、kboot:
  プロンプトやそこから shell に降りた状態で画面モードを切り替えられる。

 ・ついでに起動時に勝手に好きな画面モードにしてしまう。

これで 480i 表示できない環境でも、FC5、Debian、YDL 等を kboot で選択して
切り替え起動できるようになりました。
画面モード設定はもう少し融通が利くように改善したいところです。

PS3 の Debian で ps3ps_util を

Debian でも ps3videomode や boot-game-os が無いとやっぱり不便なので
作っておきます。
ソースは ADDON CD CELL-Linux-CL_20061208-ADDON.iso に含まれています。
ftp://ftp.uk.linux.org/pub/linux/Sony-PS3/

(1) ADDON CD の \src の中身をコピーしておく

 ps3pf_util とカーネルのソースが必要

(2) ソース展開

 とりあえず手作業で

 $ rpm -i ps3pf_utils-1.0.9-3.src.rpm
 $ tar -jxvf /usr/src/rpm/SOURCES/ps3pf_utils-1.0.9.tar.bz2
 $ tar -jxvf ../linux-20061208.tar.bz2

(3) Makefile 修正

  Makefile の CFLAGS に -I../linux-20061208/include を追加

 $ cd ps3pf_utils-1.0.9
 $ vi Makefile

こうなる
CFLAGS = -O2 -Wall -W -Wstrict-prototypes -I../linux-20061208/include

(4) build と install

 $ make
 $ su
 # make install

これで FC5 環境同様に

/usr/bin/ps3videomode
/sbin/boot-game-os

が使えるようになります。

また、一緒にインストールされる other-os-flash-util を使うと、
フラッシュメモリの設定を表示したり書き換えができるようになります。

 # /sbin/other-os-flash-util -s `/sbin/find-other-os-flash`

version: 0x00000001
offset1: 0x00000002
offset2: 0x00000004
boot loader format: 0x00000001 : gziped
boot loader size : 0 : whole of area
boot flag: 0x00000001 : boot linux
num_params: 3
param_data0: 00 00 00 00 38 6d 43 74 00 00 ff ff ff ff ff ff
rtc_diff : 946684788
video_mode : 0x00 : NTSC
controller : 0x00 : O button means yes
param_data1: 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ff ff
Static IP : 0.0.0.0
Network Mask : 0.0.0.0
Default Gateway : 0.0.0.0
param_data2: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff
DNS Server 1 : 0.0.0.0
DNS Server 2 : 0.0.0.0

FC5 環境では /dev/sdb がフラッシュデバイスです。
容量は 4Mbyte でした。
このコマンドでブートローダーの書き込みもできるようです。
が、ためしに書き込んでみたら起動しなくなりました・・。
電源長押しの強制復帰+他のOSインストーラの再実行で一応元に戻りました。

PS3 Linux kboot の挙動の違いについて

PS3 Linux を外付け HDD から起動するまとめ」 で
kboot の kboot.conf の読み込み挙動が把握できなかった点について原因が
わかりました。install した otheros.bld によって、kboot の動作が異なって
いるのが原因でした。

・FC5 版 (ADDON CD) の otheros.bld
  /dev/sda のみ参照

・YDL 版 otheros.bld
  各ドライブの /etc/kboot.conf を集めてマージ

kboot起動時に /init を読むと __read_fstab() の動作が異なっていることが
わかります。

とりあえず sda の kboot.conf 固定にしたいので、sdf の kboot.conf は削除
しておくことにします。

kboot のソースは ADDON CD に含まれているようです。

PS3 Linux を外付け HDD から起動するまとめ

Debian(Etch)、Fedora Core 5、Yellow Dog Linux と、3種類ほど
外付けドライブにインストールしてみました。
で、はまった点とか書いてみます。

内蔵HDD (sda) へのインストールだと特に問題がなくても、外付け HDD に
install すると不具合が出ることがあります。

●外付けドライブにインストールはできるが起動できない

OSインストールはできるけど、起動時に root を mount できずに boot が
途中で止まってしまうことがあります。
これは root になるべきドライブが認識される前に mount しようとするのが
原因のようです。FC5 では問題が起こらないので、これをお手本にして initrd
の init スクリプトに手を加えるとなんとかなります。
(http://www.devdrv.co.jp/linux/cpio-initrd-format.htm を参考にしました)

・/boot の initrd*.img をコピー (ファイル名は環境依存)

 # cp /boot/initrd*.img .
 # mkdir image
 # cd image
 # zcat ../initrd*.img | cpio -i -c

・init の修正

 mkblkdevs と mkblkdevs の間にドライバ読み込みと認識待ちの sleep を追加。
 追加する内容は FC5 の init を参考にする。
 さらにこの中で読み込んでいる module を lib フォルダに入れておく。

・新しい initrd の作成

 # find . | cpio –quiet -c -o | gzip -c > ../initrd-new.img

kboot.conf の指定で新しい initrd-new.img を読み込むように手直しします。

initrd.img の修正が手間な場合は、実は FC5 の initrd.img をそのまま使っても
たいていうまくいきます。FC5 の initrd.img は ADDON CD の \target に入って
いるので、これを HDD にコピーして使えます。

●kboot.conf がどこから読み込まれるか

基本的に内蔵 HDD sda でラベル ‘/’ がついたパーティションがあるとそこから
読み込まれます。なので、外付け HDD にインストールした場合でもそのカーネル
呼び出しの設定を sda 側の /etc/kboot.conf に追加する必要があります。

この辺の挙動はまだ完全に把握していないのですが、ごくまれに違うドライブの
kboot.conf も読み込まれていることがあります。
ADDON CD の HowToEnableYourDistro.html に書いてある通りにも必ずしもなら
ないことがあるし。もしかしたら認識順も影響するのかもしれません。

メモリカードとか使って kboot.conf の読み込み位置を固定した方がいいのかも
しれません。

YPbPr to RGBHV VGA Box で 1080p

PS3 の HD 画面を PC モニタに映すために、
・PS3 を PCモニタに無理やりつなぐまで
・PS3を繋いだPCモニタ画面
・PS3 Linuxの画面を広く使う
こちらで紹介した「YPbPr to RGBHV VGA Box」を使っています。
モニタは UXGA 1600×1200 の EIZO FlexScan L887 です。
(モニタとの相性も結構あると思います)

いままで 1080p (D5) がだめで 720p (D4) を使ってましたが、Linux だとぎりぎり
1080p で描画できることがわかりました。

それぞれのモードでの画面はこんな感じです。

○ D4 720p オーバースキャン 1124×644 (ps3videomode -v 3)

○ D4 720p フルスクリーン 1280×720 (ps3videomode -v 131)

○ D5 1080p オーバースキャン 1688×964 (ps3videomode -v 5)

× D5 1080p フルスクリーン 1920×1080 (ps3videomode -v 133)

D5 1080p のフルスクリーンだと同期が崩れてかなりノイズが入ります。

なぜか同じ 1080p でも PS3 Linux のモード 5 (オーバースキャン 1688×964) だと
同期が取れてきちんと表示できます。
VGAケーブルは L887 付属のものをそのまま使用しています。

残念ながらゲーム画面 (GAME-OS) は常にフルスクリーン相当なので全くだめでした。

ちなみにモニタの解像度は 1600×1200 なのでそもそも 1920pixel も出ません。
オーバースキャンでも 1688pixel あってさらに画面中央部に収まっているので、
実際は画面が若干縮小されています。
つまりモニタの画素とは 1対1 ではなくてアスペクト比も違っています。

だけどこれだけ画面の広さに差があるので使いやすくなりました。

今はこんな感じで繋いでますが、

[PS3] – コンポーネント – [YPbPr to RGBHV VGA Box] – VGA – [L887]

これだと 480i (D1) の表示ができないので、Linux Install の ためだけ にとうとう
VABOX2 も入手してしまいました。ゲームだけやってる分にはいらないんだけど・・

[PS3] – コンポジット – [VABOX2] – VGA – [L887]