PS3でlinuxメモ

もともとdebian使いなもんだからさーっぱりわからん。というわけでメモ。

Fedora5のインストール

10Gだとkbootのセルフコンパイルが容量不足です。 Cellでがんばってみたログを参照に minimumインストールします。
minimumインストール後、Fedora5のCD入れます。
# mount /mnt/cdrom
# yum grouplist
一覧表示
# yum groupinstall "X Window System"
# yum groupinstall "GNOME Desktop Environment"
# yum install scim-anthy fonts-japanese
# yum groupinstall "Development Tools"
# chmod o+rwx /tmp
# adduser myuser
# passwd myuser
# yum install telnet-server
# ps3videomode -v 4       細かくしないとGUIが見えません。
# startx
グラフィカルインタフェースでネットワークアドレスの設定と telnetサービスを有効にしておしまい。 あとは外からtelnetで使います。 (06-12-1)

otheros.self

PS3の「その他のプログラム領域」にotheros.bldを書き込むためのプログラムです。 これ自体はPS3のXMB上で動作し、ELFバイナリにPS3の独自ヘッダがついている形になっていますが、暗号化と署名がされているようです。 USBメモリだけでなく、CDROMの/PS3/otheros 配下においてもインストールできます。

「その他プログラム用」フラッシュメモリサイズは8192セクタ(4Mbyte)です。 フォーマットはother-os-flash-util.cを参照したり、 dd if=/dev/sdb of=flash.imgなどで取得して見てください。 offset1領域は今は使われていないようです。 offset2領域のデータがgzip展開され、0番地からコピーされ、0番地から実行されます。 (06-12-14)

kboot

kbootはsrccdから展開してkboot-20061110下でmakeします。 カーネルコンパイルする時initrd用にデバイスファイル作るのでroot権限が必要です。 fedoraにはfakerootはないのかな?
kbootはlinux kernel+initrd(kexec、インストール用スクリプト)なんですが、 クロスコンパイル可能なものを利用しているのかコンパイラ自体からコンパイルされます。 (クロスコンパイルはぽちネット参照) 各ソースはdl/の下のアーカイブから展開され、patches/によりパッチが当てられ、コンパイルされて、build(ツールの場合)あるいはrootの下へインストールされます。
makeの流れ:

uClibc-0.9.28:
  tar xjf、patch
  config/uClibc.configをuClibc-0.9.28/.configへ
  make oldconfig
  make (gcc-3.4.6-hostを作成後)
  make PREFIX=root install_runtime
  make PREFIX=build install_runtime
  make PREFIX=build install_dev
busybox-1.1.3:
  tar xjf、patch
  make allnoconfig
  make CROSS=powerpc-linux-ulibc-
  make install
binutils-2.16.1:
  tar xjf、patch
  configure --prefix=kboot-10/build ...
  make
  make install
   -> buildにインストールされる
linux-2.6.16:(カーネル)
  dl/linux-2.6.16をtar jcfしてtar xjf、patch
  config/kernel-configをlinux-2.6.16/.configへ
  make oldconfig include/asm
  make ;vmlinuxとりあえず作成
gcc-3.4.6:
  tar xjf、patch
  (ソースの展開のみ)
gcc-3.4.6-host:
  ../gcc-3.4.6/configure --build=powerpc64-pc-linux-gnu
                         --host=powerpc64-pc-linux-gnu 
                         --target=powerpc-linux-uclibc
  make (PATH+=build/bin)
  make install (PATH+=build/bin)
gcc-3.4.6-uclibc:
  ../gcc-3.4.6/configure --with-sysroot=build
                         --build=powerpc64-pc-linux-gnu
                         --host=powerpc64-pc-linux-gnu
                         --target=powerpc-linux-uclibc
  make (PATH+=build/bin)
  make install (PATH+=build/bin)
udev-088:
  tar xjf
  make CROSS_COMPILE=powerpc-linux-uclibc-
  make install DESTDIR=root
kexec-tools-1.101:
  tar xjf、patch
  configure
  make ARCH=ppc64
  make ARCH=ppc64 install
以下同じような感じ
schedutils-1.5.0:
nfs-utils-1.0.9:
coreutils-5.97:
ncurses-5.5:
util-linux-2.12r:
ps3pf_utils:
readline:
getctty:
fsbyname:

rm -f root/etc/{hosts,passwd,kboot.conf,message}
... root内のこまごましたファイル作成
ln -sf /sbin/kboot root/init
root | cpio | gzip > initrd.bin
cp initrd.bin linux-2.6.16/arch/powerpc/initrd
linux-2.6.16/.configのCONFIG_EMBED_INITRD=yに書き換える
linux-2.6.16 make
cp linux-2.6.16/arch/powerpc/boot/vmlinux.bin linux
(vmlinux.binはvmlinuxをobjcopy -O binaryしたもの)
このlinuxというファイルをgz圧縮したのがotheros.bldです。

kbootは起動時に次の動作をします。

  1. DHCPでネットワークアドレス割り当てます。NFSブート可能ですが割愛。
  2. 以下の順序でメディアを検索し、/mnt/rootにマウントします。
  3. マウント後、各メディアの/etc/kboot.conf、/etc/fstab、/etc/hostsをramディスクにコピーします。
  4. あとの動作はそのコピーした/etc/kboot.confに従います。
たとえばCDROM上に以下のような/etc/kboot.confファイルを置いておくと、CDROM上の/PS3/myinstall.shのスクリプトが自動実行されます。
default=myinstall
timeout=10
myinstall='sh /mnt/root/PS3/myinstall.sh'
(06-12-21)

カーネル

カーネルはsrccdから展開してlinux-20061110の下で以下のように再作成できます。
# yum install ncurses-devel
% cp arch/powerpc/configs/ps3pf-config .config
% make menuconfig          .configの編集をします。
                           General setupで Local version に -me 等必ずセットします。
% make                     vmlinuxとモジュールができます。
# cp vmlinux /boot/vmlinux-2.6.16-me
# make modules_install     モジュールが/lib/modules/2.6.16-meにコピーされます。
# /sbin/mkinitrd --preload=ps3pf_storage --with-usb --with=ehci-hcd --with=ohci-hcd
                 --with=usb-storage --with=usbhid /boot/initrd-2.6.16-me.img 2.6.16-me
                           /lib/modules/2.6.16-meを利用したinitrdが作られます。
                           initrd.imgはcpio形式をgzip圧縮したものです。
# vi /etc/kboot.conf
linuxme='/boot/vmlinux-2.6.16-me initrd=/boot/initrd-2.6.16-me.img '
                           注意:linux-meのようにハイフンは使えません。
あとはrebootして、kbootプロンプトでlinuxmeを入力するかTABキーで選んでenterを押します。enterを忘れるとデフォルト起動します。

以下PS3に関係ない単なる調査メモ。

(06-12-6)

ネットワーク

drivers/net/gelic_net.cがドライバです。 VLANを利用して無線と有線を切り替える…みたいな変な作りです。 切り替え式なので同時に使えないし、有線でVLANを使うこともできません。

デバッグフラグを入れたドライバで試してみましたが、 この機構は未実装のようです。 私のは20Gモデルですが動きからすると60Gでも同様、現在無線LANは使えません。 では有線でVLANが使えるのでは…と思いますが、 タグ付きのパケットは出ていくことはできるようですが入ってきません。残念。 (06-12-7)

リモート接続

ローカルpoweronは、プロトコル番号0x88c8、内容は46バイトの00の直送パケットを投げます。おそらく送信元MACを見て照合しています。
リモート接続モードになるとudp:9293に応答するようになります。ブロードキャストにも反応、送信元MACは見ていません。(08-11-14)
send to:udp:9293 "SRCH"(4バイト)
recv from:udp:9293
  char "RESP"
  byte 1 不明
  byte 2  バージョンメジャー
  byte 0x34 バージョンマイナー
  byte 1,0,0 不明
  byte[6] MACアドレス
  char[128] 機器名称、残りは0
  char "NPXS01003_00" 不明