■■■カーネルの再構築
2GBのディスクがエラーで使えないのはどうしても納得が行かないので、起動用のカーネル(実態はよくわからないが、おそらくMacで言うところのSystemファイルに相当するものだろう。)を520c用に作り直してみることにした。カーネルファイルはGENERICと言って、対応ポートすべての機種用に作成されている。つまりMacで言えば、カスタムインストールで「すべての機種用」とインストールされているようなものだ。これを再構築して520c用システムをつくるわけだ。
これにはカーネルを構成するソースがいる。syssrc.tgzというファイルにすべてがつまっている。自分の使っているNetBSDのバージョンとおなじバージョンの圧縮ファイルをダウンロードする。約20MB、展開したときには100MBを超える大きさだ。最初は展開途中でディスクがいっぱいになって失敗。さすがに500MBの容量では苦しく、不要なファイルをすべて削除して何とか展開できた。(だから2GBのディスクが使いたいのだ…)
再構築といってもC言語でかかれたソースそのものに手を加えるほどのスキルはないので、カーネルコンフィグを書き換えるだけだ。展開されたディレクトリのかなり深い部分、usr/src/sys/arch/mac68k/conf以下にmac68k用GENERICカーネルのコンフィグファイルがある。viで開いて見ると、CPUの種類から、扱えるポート、プロトコル、68kMacで使えるとは思えないIEEEデバイスに関する設定まであるようだ。(もちろんディフォルトで使用停止にしてあるが…)
とりあえず、いったんviを終了して、このGENERICSBCをPB520cという名前でコピーした。
# cp GENERICSBC PB520c
このPB520cをviで開いてSCSI関連あたりの記述を修正する。パワーブックにはSCSIバスが1系統しか無いので、scsubus* target?となっているところを、
scsibus0 target?
と内部バスのみに変更し、sd* at scsibus? target? luns?~などとなっているところを
sd1 at scsibus0 target2 luns0~
として、バス0のSCSI ID2を強制的にsd1として読み込む設定にした。あとはどうでもいいと思うが、520c+68040では使わないFPE(FPUエミュレーション)と、68030と68020のところをコメントアウトしておく。まず、これで上手くいくとは思えないが、カーネルが本当にリビルドできるのかどうか試さないことには先へ進めない。
# config PB520c
(設定ファイル名)
で../compileディレクトリにPB520c(さっきのファイル名となる)のディレクトリができるので、そこへ
# cp ../compile/PB520c
と移動し、
# make depend
を実行する。オプションのdependは何なのかわからないが、説明に「そうしろ」とあるのでそうしたまで… 数十分でコマンドラインに戻され、あらためて
# make
する。このとき、オプションにCOPTS=-Oをつけると、最適化のプロセスをスキップするのでコンパイルが多少速くなる。らしい…(68040/33MHzでは、どっちにしても3時間程かかるので、あってもなくても同じだ。)もちろん最終段階でのコンパイルにはこのオプションはつけない。念のため。
ところが、何度やってもエラーを返して途中で停止してしまう。Error code 1とある。オプションの設定が悪いのかと思って、試しに何の変更もしていないGENERIC設定でコンパイルしてみたが、まったく同じところで止まってしまう。つまり、マシンに不具合があるためか、ソースに不具合があるためかのどちらかだ。カーネルのコンパイルは他機種でもできるとあるが、うちのNetBSDは520cが唯一なのでどうしようもない。とにかく520cでカーネルをコンパイルすると軽く3時間はかかるので一日作業となってしまうが、メモリ不足からエラーを発生していることも考えられるので、一応、shutdown nowとやって、シングルユーザモードでコンパイルして見ることにした。
ところがこれもエラーで止まる。undifined referenceとかなんとかいうのが山ほど出る。不可解。コンパイラに問題があるのかと思って、再インストール。これも駄目。やることもなくなって、mac68kディレクトリの中をぶらついていたら、confディレクトリにあるSMALLRAMなるファイルを見つけた。どうやらSEとかの少ないメモリで使うためのものらしく68030に最適化されていて、しかもほとんどのオプションがコメントアウトされたものだった。これを68040とネットワークカードをオンボードと書き換え、コンパイル。どうせうまく行かないものとあきらめていたが、2時間たって見て見ると、カーネルが組み上がっているではないか!さっそく現行カーネルの名前をnetbsd.oldと変更し、今出来上がったカーネルを最上位ディレクトリに移動。シングルユーザモードで再起動してみた。カーネル名に(PB520C)と表示され起動プロセスが始まる。しかし、SCSIディスクドライバの読み込みが終わったところでillegal instructionと表示したまま止まる。しばらくしてデバッガに落ちた。??。わからん…
しかし、オプションの設定次第ではコンパイルはできる。つまりオプション設定が間違っているということなのだろう。(しかしGENERICがコンパイルできないのは不可解だが…)
SMALLRAM設定ではIPv6関連やら、UFS以外のファイルシステムやら、pseudoデバイス関連もコメントアウトされている。PB520cでもこれらは使えないと思うので、もう一度GENERIC設定をもとに不要と思われるオプションを取り除いてコンパイルにかけた。2時間ちょっとで完了。通常のものより500kBほどファイルが小さいスペシャルカーネルができた。さっそく古いのをバックアップして再起動。しかし、SMALLRAMで起動したときよりも前の段階で止まった。sn0 at obio~というところから進まないところをみると、インターフェイスカード関連だ。Nubusカードを使わない設定にしただけだが、いちおうnubusカードのsn*のところだけは使う設定にしたほうがいいのかもしれない。
起動できるカーネルができ上がるのはいつになるのだろう。すでにコンパイルの作業にとりかかってから数日がたった。なかば諦めモードとなってきている。Mac純正のHDDを探しはじめている。
■基本的なミス
プログラミングというのはわずかでも手順が狂うと正常に動作しない。今回も何度もわずかな手順の間違いに気付かず何時間も無駄なコンパイルをしていた。カーネルをコンパイルするにはまず自分の使うポート、つまりmac68k macppc i386とかのディレクトリ以下にあるconfディレクトリでconfig ×××とやって作業環境を整える。(×××は同一ディレクトリにある自分のコンフィグファイル名)すると一つ上のディレクトリのcompileディレクトリ以下に×××ディレクトリができる。これが作業ディレクトリだ。このなかに必要なソースや、オブジェクト、メークファイルが準備される。ここで、もし、前回コンパイルしたときのオブジェクトがそのままだと、今回準備するオブジェクトとが混在してしまう。つまり、このconfig ×××を行うまえに、少なくとも失敗した前回のオブジェクトはきれいさっぱり片付けておかなくてはならない。しかし、それに気付かず、何度もconfig ×××をやってから、前回のオブジェクトをmake cleanで消去してしまっていた。これによって、新たな作業環境から前回と同じオブジェクトが消去されてしまう、当然コンパイルは失敗する。また、make cleanを忘れたままコンパイルすればコンパイル自体は成功するかもしれないが、でき上がったカーネルは当然うまく動作しない。
この失敗を踏まえて、今度はコンパイルが成功した直後にmake cleanを実行した。これなら間違いない。と、思ったのは束の間。せっかく上手くできあがったカーネルまできれいさっぱり消えた。コンチクショーめ!!また3時間待ち、とほほ…
失敗は成功の母。だれが言ったか知らないが、失敗なくして成功もない。まさにそのとおり。数々の失敗を教訓に、最後はGENERIC設定をもとに、接続数を半分に、scsiポート関連部分を修正するだけにしてコンパイル。ようやく起動可能なカーネルができた。これをinstallerのcpoutコマンドでMac上のファイルに書き出し保存。500MBのディスクを2GBのディスクに載せ換え、そこにcpinコマンドで再び書き込む。このカーネルを起動カーネルと設定し、シングルユーザモードでブートした。シェルが起ち上がるところまではいつものとおり問題はない。問題はここから。通常のカーネルならばディスクをmount -aとマウントした瞬間に例のsbc0:timeout waiting for DREQの連発で操作不能になる。しかし、今回のカーネルではまったくそんな素振りも見せず、ユーザ設定から、ネットワーク設定からすべて滞りなくできた。
しかし、完璧なわけではない。2GBのディスクは先頭の512MBにroot&userパーティションを切って、残りに750MBくらいずつ2つのuserパーティションを切った。ここへftp経由からファイルをダウンロードしようとしたとたんに例のsbc0~のエラーだ。パーティションをまたいだファイルの移動が問題なのだろうか。とりあえずFTPが使えるので、MacからFTP経由でファイルの移動をしたものの、先行き不安だ。
複数のパーティションをまたいだファイル移動がこのトラブルの原因かどうかはわからないが、精神的に悪いので、2つに分けたサーバスペースを一つにまとめた。ここをSambaとNetatalkの公開ディレクトリとして、shareと名前をつけてようやく落ち着いた。