このサーバーはMebius MN-340(CPU: Pentium 150MHz) + FreeBSD 4.10で構成されていた。たまにCPUのパワー不足を感じる以外は問題なく動いていたが、長年色々なアプリをインストールしては消したりしていたためか、HDDにゴミが溜まり、不自然に空き容量が無くなってしまった。
しかも、おそらくセクタ不良によるHDDの"hardware error"がこれまでに何回か発生して、使用不能な領域が増えている。
そのため、HDDをフォーマットしてFreeBSDを再インストールすることにした。
●最新バージョンを試す
せっかくなので、最新バージョンである6.1をインストールしようと思った。CD-Rが勿体無いので、インストーラーをFD起動してネットワークインストールしようと思って、6.1-RELEASE/floppies/の
boot.flp
kern1.flp
kern2.flp
をダウンロードしてFDにコピーしてPCをFD起動したら、右側にポップな"FreeBSD"のアスキーアートが出るブートメニューでデフォルトのものを選択し、カーネルが起動開始した直後に"page fault"が出て固まってしまった。
FDが悪いのかと思って、6.1-RELEASE-i386-bootonly.iso をCD-Rに焼いてCD起動したが、結果は同じだった。PCIドライバ起動中に出てる感じだ。
以前にもこのPCのFreeBSDを5.xにバージョンアップしようとして、同じことが起こって断念した経緯がある。6.xになって解決してるかもと期待したが、残念だった。
仕方なく、4.xの最終バージョンである4.11をインストールすることにした。
●FreeBSD 4.11インストール
4.11のインストールCDのISOイメージをFreeBSDのミラーサイトからダウンロードしようとしたら、古過ぎるためか、ミラーサイトの無いftp-archiveサーバーに移されていた(なぜか2.2.9だけはftpサーバーに残されていた。2.2.9は現役なのだろうか?)。そのftp-archiveサーバーからのダウンロードが非常に遅いため、通常の2枚分のCD-ROMイメージの取得を諦めて、233Mの4.11-RELEASE-i386-miniinst.isoを2時間かけてダウンロードし、8分でCD-Rに焼いた。
そのCD-ROMにはX11が入っていなかったので、この際、X Window無しのWebサーバーとして構築することにした。
CD-ROMを起動して、Kern-Developerのセットを選択して、特に工夫せずインストールしてFreeBSDを起動したら、PCMCIAのネットワークカードが認識されなかった。dmesgで起動ログを見ると、pcic0(PCMCIAドライバ)は正常に起動していたのに、カードを抜き差ししても反応しなかった。認識失敗の下り調子のBEEP音も出ない。原因がわからなくて、再度インストーラーを起動してKernel configurationにてシリアルポート(IRQ=3-4)とパラレルポート(IRQ=7)のドライバを無効にして、ネットワークインストールする振りしてIRQ=3,7指定でPCMCIAのNICを認識させてみたら、あっさり認識されたので、そのままFreeBSD全体を再インストールした。そうすると、シリアルポート(IRQ=3)を有効にして起動しても、PCMCIAのNICが正常に認識された。
おそらく、rc.confのpccard_*の行がおかしかったのだろう。最終的には
pccard_enable="YES"の設定で正常に動いている。
pccard_mem="DEFAULT"
pccard_flags="-i 3"
●カーネル再構築
なにぶん低スペックのマシンなので、まずカーネルをスリムにすることにした。
cd /usr/src/sys/i386/conf/として、MINEを編集した。結果はこちら。SCSI関連、PCI NICドライバ、USB関連を全て無効にした。Webサーバーとしての動作を考えると、もっとスリムにできるだろうだが、追求するのは後日にすることにした。
cp GENERIC MINE
MN-340に浮動少数点演算のコプロもあるようなので、MATH_EMULATIONも無効にしてみた。これを消すのは初挑戦だ。
MINE編集後、
config MINEとして再構築(約2時間)したカーネルをインストールして再起動すると、起動しなかった。この時、MINEのcpuの行を誤って"I386_CPU"としていたため、"Unknown processor type"というエラーが出たのだ。
cd ../../compile/MINE
make depend
make
make install
そこで、/usr/share/doc/の教え通り、カーネル起動前の10カウント中に停止し、
unloadとしてカーネルを起動し(10カウントより前にkernel.oldと打っても起動するが、正しく起動しないようだ)、
boot kernel.old
cd /として、正しく動くカーネルを退避した。
mv kernel.old kernel.good
mv modules.old modules.good
その後、MINEのcpuの行を"I586_CPU"に修正して同じ手順で再構築すると、今度は無事に起動した。
再構築前のカーネルが4.2Mだったのに対し新しいのは1.9M、起動直後のRAM使用量は24Mから21Mに減少した。(カーネル単体のRAM使用量は調べ方がわからなかった)
●Portsのアップデート
4.11のpackagesは当然もはやネット上に存在しないので、各種アプリケーションはportsでインストールするのだが、4.11のportsのままだと、必要とする各ソースコードパッケージのバージョンが古すぎて、やはりネット上に存在しないものが多数ある。従って、まずはportsを最新のものにしなければならない。
portsの更新は、現在はPortsnapとかいう手段が主流のようだが、今回は昔ながらのCVSupで行うことにした。
1. cvsupインストール
cd /usr/ports/net/cvsup-without-guiなんと、依存関係により、これだけで12のパッケージがインストールされてしまった。
make install
2. 環境変数の設定
環境変数SUP_UPDATE, PORTSSUPFILEを設定する。
setenv SUP_UPDATE(本当はports-supfileを別の場所にコピーした方が良い)
setenv PORTSSUPFILE /usr/share/examples/cvsup/ports-supfile
3. ports-supfileの編集
$PORTSSUPFILEで示されるファイルを編集する。特に"*default host="の右側に近所のサーバー名を指定する。
今回は/usr/share/docs/を参考に(今回はよくお世話になった)
*default host=cvsup4.jp.FreeBSD.orgとした。
4. CVSup実行
cd /usr/portsとすると、約3時間で更新が完了した。
make update
5. portupgrade
cvsupの道連れに大量の古いバージョンのツールがインストールされたので、portupgradeを使用して全てバージョンアップすることにした。
portupgradeをインストールし(これでまたrubyを含むいくつかのツールが芋づる式にインストールされてしまった)、
portupgrade cvsup-without-guiを実行すると、無事に全てバージョンアップされた。
portsを更新するだけで20近いパッケージがインストールされてしまうとは、えらいものだ。最初は最新のports.tar.gzをダウンロードした方が良かったのかも知れない。
ynomura
FreeBSD 6.x/5.xのインストーラー起動時に
---------------------
on pcib0
trap12: page fault while in kernel mode
...
current process = 0 (swapper)
---------------------
と出て固まる件について色々調べたが、同様のトラブルは結構発生しているようだが、解決したらしい情報は1件も発見できなかった。原因の憶測も多岐に渡り、結構根が深い問題のようだ。
大体共通しているのは、おそらくハードウェアが古くてサポート対象外となったのだろう、ということだった。
古いIDE HDDはDMAができないのが原因だろう、という意見が散見されたが、ブートメニューの"Safe mode"だとIDEのDMAが無効にされる(カーネル変数hw.ata.ata_dmaが0に設定されるされる)ことが判明し、Safe modeでも同様の現象だったので、外れだ。
他に"second disk"で起動するとより多くのカーネルが選択できるので試してみるべし、という怪情報があったが、*-disk2.isoでは起動できなかった。こういうことではなく"second disk"なるものが存在するのだろうか?