NetBSD/macppc on a PowerMac G3/DT (Open Firmware 2.0)


[2005/2/24]

中古の PowerMac G3/DT 266MHz (ROM revision A, Open Firmware 2.0f1) を入手しました。 本体のみでキーボードもマウスもなし。
私の持っているのは ADB キーボード (FKB8579) だけで、 D-SUB 15pin (2列) のディスプレイ出力に繋ぐケーブルもアダプタも持ってないですし、 ADB マウスも持ってません。 まあ何とかなるだろうと思ってたのですが、ちょっと面倒でした。
以下、一部試行錯誤たれ流しの見苦しい文章となります、申し訳ない。

画面出力

まず、D-SUB 15pin (2列、以下 MAC) から 高密度 D-SUB 15pin (3列、以下 VGA) のアダプタを作りました。
(写真)
ピン配列は としました。面倒なので解像度は 1024x768 固定。 画面が見えさえすれば良いので、適当な線材で適当に半田付けしただけです。

Mac OS 9 インストール

Mac OS 9.0.4 をインストールしようとしたのですが、 CD から起動はできても、マウスが無いと先に進めないようでしたので、 Power Mac G4 にハードディスクを繋いで、そちらで Mac OS 9 をインストールしました。
ついでに OS9vnc もハードディスクにコピーしました。(OS9vncPatches は機能拡張にコピー)
これで Mac OS 9 が立ち上がるようになり、ネットワーク経由で操作できるようになりました。

Open Firmware へのパッチあて

NetBSD System Disk Tutorial にある通り、System Disk を実行して、Open Firmware にパッチをあてました。
Open Firmware で printenv した結果

NetBSD ネットワークブート

Open Firmware で
setenv real-base f00000
reset-all
して、再起動した後、再度 Open Firmware から
boot enet:
で NetBSD が ネットワークブートします。
ネットワークブートに関しては、基本的には Diskless NetBSD HOW-TO に書いてある通りかと思います。dhcp サーバ (NetBSD/hpcmips) の dhcpd.conf (抜粋) を、
host macppc0 {
hardware ethernet CC:CC:CC:CC:CC:CC;
fixed-address macppc0;
option host-name "macppc0";
filename "ofwboot.xcf";
next-server nfsserver.my.domain;
option root-path "/exports/macppc0";
# always-reply-rfc1048 true;
}
のようにしています。
このとき、この Power Mac G3/DT (以下、macppc0) は ofwboot.xcf を nfsserver.my.domain に tftp で要求しますが、macppc0 は arp に対してちゃんと応答しないみたいで、 tftp サーバ側で応答に失敗します。回避策として、mfsserver.my.domain 側で、
arp -s macppc0 CC:CC:CC:CC:CC:CC
を実行しておく必要がありました。dhcp サーバと tftp/nfs サーバが同じ場合は、 この回避策は必要ないと思います。
nfsserver.my.domain の /exports/macppc0 以下には、 NetBSD/i386 でクロスコンパイルした NetBSD/macppc (CVS HEAD 2005-02-17) が インストールしてあります。
GENERIC カーネルだと、NetBSD の起動途中、 SCSI デバイスを probe するところでハングします。 もしかするとハードが壊れているのかも知れません。そこでカーネルコンフィグレーション GENERIC から mesh 関連をコメントアウトしたところ、panic しました。
とりあえず mesh* at ... は活かしておいて、 scsibus* at mesh? のみコメントアウトして凌げてはいます。
また、CD-ROM ドライブの接続されている wdc1 で lost interrupt が出ています。 その前にDisabling stuck interrupt(s): 14 とあるのと関係あるでしょう。これは後回し。 single user mode まで

ディスクへのインストール

NetBSD-2.0 の INSTALL.txt を見ると、Open Firmware 2.0 のマシンで Mac OS と NetBSD とで dual boot にはできない、と書いてますが、 試行錯誤してみることにします。
まず、network boot した NetBSD を使って、pdisk で NetBSD 用のパーティションを 追加しました。NetBSD-current (2005-02-17) のソース (sys/arch/macppc/macppc/disksubr.c) を見ると、 パーティションタイプを APPLE_UNIX_SVR2 にしておけば NetBSD のパーティションとして 認識されるようですので root swap user 3つのパーティションを作りました。
pdisk -l の実行結果
disklabelの実行結果
disklabel -e -I wd0で、編集せずに エディタを終了すれば、 Apple partition map から生成された NetBSD のラベルが書き込まれます。 Apple の partition map と DOS の partition table が同時に置ける ように、 Apple の partition map と NetBSD/macppc の disk label (セクタ0 の 64バイト目から置かれる) も同時に置けるようになっているのでした。
newfs /dev/rwd0a します。 まずは /usr/mdec/ofwboot とカーネルのみを /dev/wd0a のファイルシステムにコピーして、 installboot を実行してみます。
# mount /dev/wd0a /mnt
# cp /usr/mdec/ofwboot /mnt
# cp /netbsd /mnt
# umount /mnt
# installboot -v /dev/wd0a /usr/mdec/bootxx ofwboot
File system: /dev/wd0a
File system type: ffs (blocksize 8192, needswap 0)
Primary bootstrap: bootxx
Secondary bootstrap: ofwboot
Bootstrap start sector: 4
Bootstrap byte count: 1732
Bootstrap block table: 118 entries of 8192 bytes available, 7 used: 2736 2752 2768 2784 2800 2816 2706
Writing bootstrap
この時点で /dev/wd0a の先頭やディスクの先頭を見てみると、 というわけで、この状態では Open Firmware からは boot できません。

他の OS のパーティションと混在した状態で NetBSD をブートするために、 partition map と NetBSD の bootxx の中身を書き換える

ディスク先頭の Apple partition map を手で書き換えます。
書き換え前: (アドレスはディスクの先頭からのオフセット)
00001400: 504d 0000 0000 0011 001f 84cd 0008 0000 PM..............
00001410: 4e65 7442 5344 2072 6f6f 7400 0000 0000 NetBSD root.....
00001420: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001430: 4150 504c 455f 554e 4958 5f53 5652 3200 APPLE_UNIX_SVR2.
00001440: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001450: 0000 0000 0008 0000 0000 0033 0000 0000 ...........3....
00001460: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001470: 0000 0000 0000 0000 0000 0000 0000 0000 ................
書換え後:
00001400: 504d 0000 0000 0011 001f 84cd 0008 0000 PM..............
00001410: 4e65 7442 5344 2072 6f6f 7400 0000 0000 NetBSD root.....
00001420: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001430: 4150 504c 455f 554e 4958 5f53 5652 3200 APPLE_UNIX_SVR2.
00001440: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001450: 0000 0000 0008 0000 0000 003b 0000 0004 ...........;....
00001460: 0000 0800 0000 4000 0000 0000 0000 4000 ......@.......@.
00001470: 0000 0000 0000 0000 506f 7765 7250 4300 ........PowerPC.

さらに、bootxx に渡されている ofwboot のブロック番号を絶対ブロック番号に手で書き換えます。
書き換え前: (アドレスは /dev/rwd0a パーティションの先頭からのオフセット)
00000c20: 0d0a 0000 4e65 7442 5344 2f6d 6163 7070 ....NetBSD/macpp
00000c30: 6320 626f 6f74 7878 2020 2032 3030 3230 c bootxx 20020
00000c40: 3531 3500 0000 2000 0000 0007 0000 0ab0 515... .........
00000c50: 0000 0ac0 0000 0ad0 0000 0ae0 0000 0af0 ................
00000c60: 0000 0b00 0000 0a92 0000 0000 0000 0000 ................
書換え後: (/dev/rwd0a の先頭ブロック番号 0x1f84cd を加算する)
00000c20: 0d0a 0000 4e65 7442 5344 2f6d 6163 7070 ....NetBSD/macpp
00000c30: 6320 626f 6f74 7878 2020 2032 3030 3230 c bootxx 20020
00000c40: 3531 3500 0000 2000 0000 0007 001f 8f7d 515... ........}
00000c50: 001f 8f8d 001f 8f9d 001f 8fad 001f 8fbd ................
00000c60: 001f 8fcd 001f 8f5f 0000 0000 0000 0000 ......._........
この状態で、Open Firmware で:
0 > setenv boot-device ide/@0:0
0 > boot
OF_open bootpath=ide/@0
read stage 2 blocks: 0123456. done!
starting stage 2...

>> NetBSD/macppc OpenFirmware Boot, Revision 1.10
>> (nand@netbsd0, Sat Feb 19 07:00:45 JST 2005)
Cannot use bootpath
Using boot-device instead
no active package5000996+210848 [255344+233059]=0x56fe14
start=0x100000
(boot メッセージ省略) boot device: wd0
root on wd0a dumps on wd0b
root file system type: ffs
warning: no /dev/console
exec /sbin/init: error 2
init: trying /sbin/oinit
exec /sbin/oinit: error 2
init: trying /sbin/init.bak
exec /sbin/init.bak: error 2
init: not found
panic: no init
Stopped in pid 1.1 (init) at netbsd:cpu_Debugger+0x10: lwz r0, r1, 0
x14
db>
のようにカーネルを実行させることが出来ました。
本来ならば、Open Firmware で boot するパーティションを選択したいところですが、 このマシンの Open Firmware (+SystemDiskパッチ) は最初の bootable なパーティションからしか boot できないようです。
bootable とは、partition map のエントリの、
+0x5b 番地の 0x08 の bit がセットされており、
+0x78 番地からの文字列が "powerpc" であること。
まとめると、 ことで、Mac OS と NetBSD の dual boot なディスクを作れるようになると思われます。

[2005/2/25] ブートするパーティションの選択

うちの PowerMac G3/DT の場合、 nvramrc に格納されている Open Firmware の /packages/mac-parts へのパッチのうち、
' load 160 + ' 0 $L
の部分で、boot コマンドに与えるパーティション番号を無視して、 常に最初に bootable なパーティションを探すようにパッチを当てていることがわかりました。
何でそういうことしてるのかまではわからないので、副作用があるかも知れませんが、 上記の行を nvramrc から削除すれば、 パーティションを指定できるようになりそうです。 (まだ他の OS を入れてないのでちゃんと確認できていません。)
ただし、パーティション番号は (デフォルトでは) 16進数になります。
boot ide/@0:a
のようにブートします。
[2005/3/1]
Debian GNU/Linux (2.6.10) を入れてみました (インストールには floppy と CD-RW 使いました)。
Linux のローダは quik というプログラムでインストールできます。 primary boot loader は Linux の root partition の先頭に置かれています。
partition 8 に NetBSD がインストールされており、 partition 10 に Linux をインストールしてあるとすると、
boot ide/@0:8
で NetBSD が起動し、
boot ide/@0:a
で、Linux が起動することを確認しました。 real-base は Linux でも f00000 で問題ないように見えます。

[2005/3/3] PCI NIC での割り込み取りこぼし

-current のコードで RealTek 8169S の NIC を使うと、
re0: watchdog timeout
が出て使いものになりませんでした。面白いことにシリアルコンソールからずっと キーボード入力 (あるいは画面出力) していると、症状が出ません。
ということで、おそらく割り込み関連だろうとあたりを付けて、 ここ に書いた変更で動くようになりました。 (適当に似たような問題に見えた problem report に reply してしまいましたが、 関係無かったかも...)
私だけの問題ではないと思うのですが、何で2カ月以上もそのままなのかわかりません。

[2005/3/5]

送ったパッチをとりあえず取り込んでみたと言う感じのメイルが来ていました。
ちなみに中古の PowerMac 4400/200 (ただし2次キャッシュ無し) + fxp (i82550) でも同種の問題 (普段は fxp0: device timeout するが、シリアルコンソールに継続的に出力があると問題が発生しない) があり、同じパッチでちゃんと動いているように見えます。
PowerMac 4400/200 (without L2 cache) + fxp へのインストールは、 G3/DT でインストールした HDD を 4400 に繋いで使うことにしました。
しばらくサーバとして使うつもりです。 ネットワークブートできないので、何かあった時にはちょっと面倒かもしれない。

[2005/3/5]

mesh 関係で出たと思った panic が再現させられない、たぶん これと関係あったような気がする...
CD-ROM を手持ちの DVD-ROM に繋ぎ変えたら、wdc1 の lost interrupt がなくなった。
それとは別に wd0 で (これは Maxtor の 80G に交換したためと思われるが、) ブート時に1回だけ必ず、sector 0 を読むのに失敗する (soft error corrected)。 HDD が使い古しなので何が悪いのか判断不能。他のドライブに替えて試してみるべき(?)。

[2005/3/9]

試しに OpenBSD 3.4 のインストール用カーネル (bsd.rd) をブートしてみましたが、 起動途中でハングしました。理由は不明。後日。

[2005/3/10]

netbsd-bugs に投げたパッチはもともとの問題とは関係無かったようです。申し訳ない...
自分自身の問題として新たに send-pr するべきでした。

Mac OS X 10.2 のインストール CD から (キーボードの 'C' を押しながら起動で) ブートすることはできましたが、マウスが無いのでインストールはできませんでした。
この作業で、Open Firmware の nvramrc が書き変わりました。
その後あらためて前述のように /packages/mac-parts の load へのパッチを削除するなどして、 現時点での Open Firmware で printenv した結果。
System Disk によるパッチと、微妙に異なりますが、大差無い模様。 Mac OS 9 を立ち上げなくても Open Firmware にパッチを当てることが出来るので、便利。

SCSI のハードディスク SEAGATE, ST32430N をジャンク箱の中に発見したので、 接続してみました。wd0 から GENERIC カーネルで起動させると、
mesh0: timeout state 3
mesh0: intr/msk 00/07, exc 00, err 00, st0/1 21/40
mesh: resetting DMA
のエラーメッセージが出てハングアップします (1分位しか待ってませんが)。
options SCSI_DELAY=30 のカーネルでも同様。
ちなみに Mac OS 9 では、ドライバが無いのでアクセスが出来ませんでしたが、 ハードディスクが認識はされていました。
ただ、上のハングした状態から電源を切らずに、 ADB キーボードからリセット (Ctrl-Command-Power) して、 再度 wd0 から GENERIC カーネルで起動させると、SCSI DISK も認識しますし、 アクセスも出来ました。
SCSI ハードディスクが Open Firmware からの boot デバイスとして使えるかどうかについてですが、 電源 ON 直後では、
boot scsi/sd@0:0
でハングしてしまいました。
上記のように、一旦 NetBSD で認識に成功した後であれば、 上記 boot コマンドはうまく行きました (カーネルが読み込めるところまで確認したのみ)。
Open Firmware での初期化に不十分なところがあるのではないかと思われます。

[2005/3/11]

NetBSD 2.99.16 の 2005/3/10 のカーネルで、 (前述の私の送ったパッチが取り込まれてるんですが)、
re0: watchdog timeout
がやはり出ます。まだ何かある? or あれで直ったと思ったのは幻覚?。 重ねて申し訳ない...
PowerMac 4400 + fxp (i82550) だと、前述のパッチありだと fxp0: device timeout が出なくなることを改めて確認しました。 こちらは1週間以上連続運転してますが、特に問題ありません。

PowerMac G3/DT の PCI スロットに Acard 6860M を差した状態だと、 Open Firmware から (内蔵 IDE の) NetBSD が boot 出来ませんでした real-base が F00000 だと、Acard 6860M の Firmware のための作業領域として e00000 あたりを使うようで、bootxx が ofboot をロードする アドレスとぶつかってしまうようです。
real-base を 500000 に変更すれば (カーネルのサイズが小さいので) boot 出来ることは確認しました。
acardide に1台ドライブを繋いでちょっとアクセスしたくらいでは割り込みを取りこぼすと いうこともないようです。

[2005/3/18]

うちの中古の PowerMac G3/DT (Rom Rev. A, Open Firmware 2.0f1) で NetBSD-current (2005/03/15) を起動しようとして、 これまでに経験した問題 (まとめ):

[2005/3/20] ROM 交換

vintage computer のページを見て、 Beige G3 の ROM だけ売ってるのでびっくりしました。
ROM 以外のロジックボードのハードウェアは全く同じなんでしょうか。
面白そうなので、とりあえず購入して、 Open Firmware 2.4 のマシンとして使うことにしました。
というわけで、つづく

nand@mac.com     目次へ $Revision: 1.23 $ $Date: 2005/05/25 03:35:42 $