rita.karing.jpに関する技術情報
486機でVine Linux 4.1

rita.karing.jp(www.karing.jp)は、2007年3月にOSをVine Linux 2.6r1からVine Linux 4.1に一新しました。以下は、そのときの記録、およびtipsです。ここでは、サポート外である486機にVine 4.1をインストールする方法を紹介します。おそらく、最近のrpm系ディストリビューションでも応用が効くはずです。

サーバー等の設定に関しては基本的に以前と変わっていませんのでそちらに興味のある方は旧版の技術情報を参照ください。→rita.karing.jpに関する技術情報

1. はじめに
2. インストールの概要
3. 486用のkernel
4. 486用のrpm
5. 486用のglibc
6. インストール
7. pcmciaの設定
8. 486における諸問題
9. まとめ


1. はじめに

いまさら無理をしてまで486機を使い続けることにメリットはあるのか、と問われると答えに窮するのですが、かと言って個人のサーバー程度では十分に使用できるものを簡単に捨ててしまうのも気がひけます。また、この486ラップトップ機は、スペックでは劣っても、SCSI内蔵のその拡張性はなかなか他のノート機では代替が効かないのでまだまだ使い続けることにしました。

巷では、昨今の肥大化したシステムでは486機は実用に堪えないのではないかと思っている方も多いかと思われますが、肥大化の最大の原因はおもにGUIデスクトップのためであり、サーバー機としてならば、バージョンアップ、世代交替による肥大化はさほどではありません。むしろ低スペックのマシンでこそ、バージョンアップ、世代交替による進化洗練を実感できます。この486機では、Vine 2.6r1からVine 4.1にアップデートし、CGIの実行速度が二倍以上になり、以前には処理が不安定だったCDクオリティのWAVファイルがスムーズに再生されるようになりました。

ここで対象となる実機は以下のHITACHI FLORA 3010CTです。HITACHIのサイトには見当たらない幻の機体です。当時としてはハイエンドのラップトップ機だと思われるのですが、なにゆえ記録から消されているのか不思議です。

ちなみにこの機体はAC駆動オンリーのバッテリーレス設計になっており、現在では絶滅した狭義のラップトップ機です。またSCSIコネクタにはPC98用とも言えるアンフェノールハーフピッチが、BIOSのバッテリーには通常のボタン電池ではなく、MacのPRAM用として知られるER3Sが使われており、PC/AT黎明期の息遣いを感じさせてくれます。

HITACHI FLORA 3010CT
CPU 486DX4/75MHz
RAM 32MB
HDD FUJITSU MHD2032AT 3253MB
Video chip WD90Cxx
LCD 9.8inch TFT 256色
on board Sound Soundbraster Pro 互換
on board SCSI aha1510 (no pcmcia)
pcmcia Vadem VGー468
Ethernet PCカード Fujitsu FMV-J182A
Ethernet PCカード Toshiba Advanced Network 10/100
 
外部SCSI機器
SCSI DVD-RAM Panasonic LF-D200
SCA HDD Seagate Cheetah 18GB
SCSI Scanner CANON CanoScan 300
SCSI CD-R MATSHITA CW-7502


2. インストールの概要

Vine 4.1は486機どころか公式にはISAバスさえサポートしていません。また、Vine 4.1のインストールには最低96MBのメモリが必要で、それを満たす486機は極めて稀でしょう。それよりなにより、そもそもインストーラのrpmは486機では動作しません。よって、486機にVine 4.1をインストールするには、Vine 4.1をインストール可能な別機でインストールしてからそのHDDを移しかえるか、もしくはVine 3.2からaptでアップグレードすることになります。

しかし、どちらもそれだけでは済みません。なぜなら、Vine 4.1には486機では正常に動作しないパッケージがいくつかあるからです。とりあえず、クリティカルなものとしてkernel、rpm、glibcが挙げられ、それぞれ486機用にビルドしたものをインストールする必要があります。

簡便のため以下よりおもに3.2からのaptによるアップグレードについて詳述します。おおまかな流れは、まず必要な486用のパッケージを用意し、その後Vine 3.2をインストール、最新の状態にした後、sources.listを4.1用に変更、aptをアップグレードします。ここでrpmがVine 4.1のrpm-4.4.2にアップグレードされるのですが、このrpm-4.4.2は486機では動作しないので、それ以上インストール作業を進めることができなくなります。ここで486用にリビルドしたrpmをインストールし、さらに486用にリビルドしたkernelをインストール、このkernelでbootするように設定します。その後、dist-upgradeを実行し、終了です。

先に486機では動作しないパッケージとしてglibcをあげましたが、Vine 4.1のglibcにはサポート対象のi586、i686以外にもi386のパッケージが用意してあり、486機上で行うアップグレードの場合にはi386用のglibcがインストールされるため特段の処置は不要です。ただし、別機で通常のインストールを実行し、HDDを交換する場合は、通常、386用のglibcはインストールされないので注意する必要があります。


3. 486用のkernel

主題の実例では、PCIサポート、フレームバッファをはずし、ルートファイルシステムをmountするのに必要なIDEドライバやファイルシステム(ext2,iso9660)のみをkernelに組み込み、その他、実機で必要なドライバのみをモジュール化しています。これらの最適化によってkernelを1MB弱に収めることができ、昔懐かしいフロッピーのboot diskも作れるようになりました。なにかと制限の多い486機ではフロッピーを活用できるのとできないのとでは大違いです。

もっとも、対象の環境に合わせ不要な機能を削ぎ落としていくことは意味のあることとはいえ、kernelのconfigは一筋縄ではいかないそれだけで大きなテーマですので、ここで悩むよりインストール完了後に落ち着いて手をつける方が合理的とも言えます。確実な策をとるならば、出来合いのconfigファイルのProcesser familyを486機に変更する(CONFIG_M486=y)だけですますのも一つの方法です。

適当なconfigファイルができたら、kernel-2.6.16-0vl68.src.rpmを展開し、

# rpm -i kernel-2.6.16-0vl68.src.rpm

先に作成したconfigファイルをrpm/SOURCEにkernel-2.6.16-i486.configとしてコピーします。そしてその一行目を

# i386

に書き換えます。この値はスペックファイルのスクリプトがアーキテクチャを決定するために用いられます。

次に rpm/SPECS/kernel-2.6-vl.specを編集します。

i386 i586 i686 athlon

となっているすべての箇所にi486を加え、

i386 i486 i586 i686 athlon

とします。終わったら、--target i486でリビルドします。

#rpmbuild -bb --target i486 rpm/SPEC/kernel-2.6-vl.spec

出来上がったkernel-2.6.16-0vl68.i486.rpm、kernel-devel-2.6.16-0vl68.i486.rpmは実機でのインストールに備え適当なところに保存しておいてください。また、rpm実行時に依存関係を解消するため、procps-3.2.6-0vl3.i386.rpm nfs-utils-1.0.9-0vl3.i386.rpm modutils-3.2.2-0vl3.i386.rpm libevent-1.1b-0vl1.i386.rpm openldap-2.3.27-0vl2.3.i386.rpm libnfsidmap-0.16-0vl3.i386.rpmが必要なので合わせて準備しておきます。

kernelまでrpm化の手間をとらなくても良さそうなものですが、rpmのデータベースにkernelが入っていないと依存関係のためインストールされないパッケージ(pcmciautilsなど)があるので何らかの方策が必要です。


4. 486用のrpm

Vine 4.1を486機にインストールしてみようと思い立ち、何が一番大変だったかと言えば、すでにrpmが486をサポートしていなかったことです。時代の流れからもはや486機がサポートから外されるのは自然なことで、そのことに関しては特に思うこともないのですが、とにかく困ったのはこのサポート外であることの情報がまったく見つからないことでした

現行のrpmは、486には存在しないrdtsc命令を何のラッパーにも包まないかたちで直接発行しているため、486機では不正終了してしまいます。この明確な仕様変更に関し、失敗談、成功談、その他まったく情報がないということは、つまり、誰も486機で試した人がいないということなのだと思われます。

ここは、一応、技術情報と銘打っている手前、あまり感情的なことは避けたいのですが、自分と同じ試み考えを持った人がどこにも見つからなかったという冷厳な事実には失望しました。いや、孤独こそ我が友人、これまでの己の人生を振り返る良い機会になりました。というわけで、このページを読む人も極めてマレでしょう。今、これを読んでいるあなたは相当の奇人です。

なにはともあれ、このままではrpmは動かないのでpatchをあてます。ここではVine 4.1が対象ですので、Vine 4.1のrpm-4.4.2-0vl16.src.rpmにpatchをあてi486でリビルドします。当然ですが、リビルドにはVine 4.1の(もしくはそれと同等の)別環境が必要です。なお、このpatchはtargetをi486にしたときのみ有効になります。

rpm-4.4.2-fake-rdtsc.patch
rpm-vl.spec(s1)

rpm -i rpm-4.4.2-0vl16.src.rpm
cp rpm-4.4.2-fake-rdtsc.patch rpm/SOURCE
cp rpm-vl.spec rpm/SPEC
rpmbuild --target i486 -bb rpm/SPEC/rpm-vl.spec

このビルドで以下のパッケージが生成されます。
popt-1.10.2-0vl16.s1.i486.rpm rpm-4.4.2-0vl16.s1.i486.rpm rpm-build-4.4.2-0vl16.s1.i486.rpm rpm-devel-4.4.2-0vl16.s1.i486.rpm rpm-libs-4.4.2-0vl16.s1.i486.rpm rpm-python-4.4.2-0vl16.s1.i486.rpm

出来上がったら実機でのインストールに備え、適当なところに保存しておいてください。

このpatchは、rdtscの擬似値を作るものなのですが、実は、rdtscの実値がなくてもrpmは適当に動作してくれます。rpm-4.0の頃には不要だったわけですし、同様の命令が存在しないIA32以外のプラットホームのことも考慮されているからです。

つまり、問題なのは486にとって不正な命令であるrdtsc命令を発行してしまうことで、擬似値を与えるなどという回りくどいことをせずとも、rdtsc命令を出せないように、rpm-4.4.2/rpmio/rpmsw.cにあるrdtsc命令を含むわずか一行を削除してしまえば486機上でも動作するようになります。擬似値を用いるにしろ、値そのものを無視するにしろ、いずれにせよはずれた道ですので、トラブルシュートの経験則としてはより単純な方がお薦めです。ここで、わざわざ複雑な解決策をとっているのは単に検証のためです。

また、このpatchを有効にするとrpmの実行速度は著しく低下します。通常のrpmとこのpatchを有効にしたrpmをAthlon64 3200+上で動作比較してみたところ、ほぼ二倍の速度差がありました。rdtsc命令を使うrpmのライブラリ関数はなんとrpm一度の実行につき少なくとも100回弱、多いときは数百回も呼び出されるため、ほんのわずかなオーバーヘッドもたちまち積もり積み重なってしまうのです。そういうヘビーロードな関数において、ベタ書きのrdtsc命令という言わばもっともオーバーヘッドの小さな手段がとられているのはたいへん合理的なことです。そういう事情では486が無視されるのも仕方がないことと納得がいきます。


5. 486用のglibc

前述したように、glibcに関してはi386でビルドされたパッケージがVine 4.1にも用意されていますので、別機でインストールしたなどでi586やi686のglibcがインストールされている場合はi386のglibcと入れ換えてください。486機上でVine 3.2からアップグレードする場合はi386のglibcがインストールされるので特別な操作は不要です。


6. インストール

この項ではaptによるアップグレードについて詳述します。この作業は486機のパワーでは丸一日以上かかりますので、けっこう大変です。前述したように486用のrpmには大きなオーバーヘッドがあります。486機のパワーではrpmのデータベース更新だけで数時間を要したりするので気長に待ってください。可能ならば、aptによるアップグレードインストールは避け、別機でインストールし、そこで486用の環境(kernel rpm glibc)を整え、HDDを交換する方がはるかに簡単です。

また、インストール法にかかわらず、486機の頃は昔懐かしい1024シリンダ問題がありますので、/bootは500MB以下の第一パーティションに割り当てておくのが安全です。

Vine 3.2のインストールが終わったら、再起動し、aptで3.2を最新の状態にします。この例では3.2はフルインストールされています。

# apt-get update
# apt-get upgrade

そして、これからVine 4.1へのaptによるアップグレードインストールを行うわけですが、まず、先に用意した486用のパッケージを準備しておきます。また、このアップグレードの途中ではrpmが使えなくなってしまうので、そのときrpmを486用のrpmに入れ換える手段を用意しなければなりません。このために、3.2のrpmを退避させておき、それで486用のrpmの入れ換えを行います。

# cp -a  /bin/rpm /root/bin/
# cp -a /usr/lib/librpm* /usr/local/lib

これにより、librpm-4.0.4.so librpmdb-4.0.4.so librpmbuild-4.0.4.so librpmio-4.0.4.soが/usr/local/libに退避させられます。なお、Vine 3.2のデフォルトでは/usr/local/libにはリンカのパスが通っていないので、/etc/ld.confに/usr/local/libを加え、ldconfigを実行しておいてください。

一通りの準備が整ったら、/etc/apt/sources.listをVine 4.1のsources.listで上書きし、aptを更新します。

# apt-get update
# apt-get install apt

このとき、アンインストールされるgcc glib-devel build-essential gcc-c++はアップグレード終了後に入れ直します。

aptの更新が終了したらこの時点で486機ではrpmが使えなくなっているので、退避させておいた3.2のrpmで486用のrpmに入れ換えます。

# /root/bin/rpm -Uvh rpm-4.4.2-0vl16.s1.i486.rpm rpm-libs-4.4.2-0vl16.s1.i486.rpm \
    rpm-python-4.4.2-0vl16.s1.i486.rpm popt-1.10.2-0vl16.s1.i486.rpm rpm-build-4.4.2-0vl16.s1.i486.rpm

くわえて、486用のkernel 2.6でブートできるように設定します。先に用意した486用のkernelと依存関係を解消するためのパッケージをインストールします。

# rpm -Uvh kernel-2.6.16-0vl68.1.i486.rpm kernel-devel-2.6.16-0vl68.1.i486.rpm procps-3.2.6-0vl3.i386.rpm\
        nfs-utils-1.0.9-0vl3.i386.rpm modutils-3.2.2-0vl3.i386.rpm libevent-1.1b-0vl1.i386.rpm\
        openldap-2.3.27-0vl2.3.i386.rpm  libnfsidmap-0.16-0vl3.i386.rpm

そして、lilo.confを編集後、liloを実行してください。

終わったらdist-upgradeですが、その前にdist-upgrade実行中に生じる一時的なライブラリの不整合を避けるため、先にlibxsltをインストールします。この一時的なライブラリの不整合は、aptが決定するインストールオーダーの不正確さに起因するもので、rpmの%postスクリプトから実行されるscrollkeeper-updateを一時的にセグメンテーションフォルトさせます。実際にはライブラリの不整合が解消された後、後続するパッケージのインストールで手順にscrollkeeper-updateが再実行されるため実害はないのですが、気分がよくないので対処しておきます。続いてdist-upgradeを実行します。

# apt-get install libxslt
# apt-get dist-upgrade

再起動後、アップグレードの過程でアンインストールされたgcc glib-devel build-essential gcc-c++を再インストールします(gccはdist-upgradeで再インストールされているかもしれません)。

# apt-get install gcc glib-devel build-essential gcc-c++

また、Vine 3.2に存在しないためdist-upgradeではインストールされない差分(grubなど)、逆にVine 4.1には不要な差分(Cannaなど)がありますが、それらも、適宜、追加削除してください。これでVine 4.1へのaptによるアップグレードインストールは終了です。


7. pcmciaの設定

kernel 2.6からデバイスの認識はおもにudevに任されるようになりました。しかしながら、ISA、それもPnPではないデバイスとなるとudevからは見えないので自動的に認識されることがありません。つまり、486機時代の古いpcmciaは自分で設定することになります。

とは言っても、単に既知のモジュールをロードしてやるだけなので特に難しいことはありません。ただ、kernel 2.6のシステムではudevによるデバイス認識が前提なので、起動時のudevによるデバイス認識終了後、できるだけ早くドライバをロードしてやるのが正攻法と思われます。よって起動スクリプトの一つにしてその一番最初に実行させることにしました。一旦、ドライバがロードされてしまえば後はudevが適当に管理してくれます。

以下は、実機で使用中のスクリプトです。起動スクリプトの書式に従っているため少々冗長になっていますが、やっていることは、「modprobe i82365」だけです。

#!/bin/sh
# Startup script for ISA no-pnp pcmcia socket driver
#
# chkconfig: - 9 91
# description: for ISA no-pnp pcmcia socket driver.

. /etc/rc.d/init.d/functions

case "$1" in

  start)
        echo -n $"Starting pcmcia: "
        modprobe i82365;RETVAL=$?
        if [ $RETVAL = 0 ];then
            echo_success
        else
            echo_failure
        fi
        echo
        ;;

    stop)
        echo -n $"Stopping pcmcia: "
        echo_success
        echo
        ;;

restart) /etc/rc.d/init.d/pcmcia stop
         /etc/rc.d/init.d/pcmcia start
        ;;
      *)
        echo -n "Such options are not implemented: "
        echo_failure
        echo
        exit 1
        ;;

esac

exit 0

上記を適当な名前で/etc/init.dにコピーします。仮りにpcmciaという名前にした場合、

# chkconfig pcmcia on

とし、各rcディレクトリにリンクをはります。 ntsysvで設定してもほぼ同じですが、ntsysvの場合、実行しているrunlevelのみに設定されるので注意が必要です。


8. 486における諸問題

Vine 4.1は486をサポートしていないので、rpmのような不具合がどこに潜んでいてもおかしくありません。現在、これまで挙げたパッケージの他、sash-3.7-6vl1が正常動作しないことを確認しています(sashは単純に実機でリビルドすることで動作可能でした)。ただ、大概のものは、-march=i386でコンパイルされており、OS上での整合性はともかく、単体のバイナリとしては486機でも動作するのが建前です。Vine 4.1をサポート外の486機で使うというこの企画はその建前に依拠しています。

しかし、中にはrpmのようにその建前が通用しないものも存在します。今のところrpm以外の重要パッケージでは見つけていませんが、その可能性には常に留意する必要があります。この労力こそがサポート外の動作をさせるこの企画の最大のコストでしょう。

なお、そのようなパッケージに対応したら、不用意にVineオリジナルのパッケージに入れ換えてしまわないよう、aptでHoldの設定をしておくのが賢明です。とりあえず、rpmを不用意にVineオリジナルのrpmに入れ換えてしまうと大変苦労することになるので、まずはapt.confのRPMの項でrpmをHoldの設定にしておきます。

RPM
{
   Hold { "^rpm" ;}
}

さて、ここまで、486というCPUの観点から議論を進めてきましたが、古い機体へのインストール作業で直面する問題は、CPUに起因するものだけではありません。とくにkernel 2.6からはデバイス自動認識のためudevが標準採用され、システムにPCIバスがあることを暗黙のうちに期待しており、ISAバスオンリーのシステムではその恩恵を受けられないのみならず、想定外のトラブルを引き起こします。

また、kernel 2.6ではサウンド回りがOSSからALSAへ移行したわけですが、ALSAのサポートが十分でなくOSSが手放せない古い環境では、ALSAデフォルトの各種設定には何かと悩ませられることでしょう。

残念ながら、開発者たちにとってそれらの問題を解決することはもはや費用対効果に見合いません。もし、なんらかの不具合が出た場合は自己解決するしかなく、ここでの主旨としてはその対処法について議論したいところなのですが、古い機体の問題解決に労力を費すよりも潔くあきらめるという選択肢の方がはるかに合理的かつ合目的的である、というのが、この項における最終的結論です。


9. まとめ

というわけで、486機であるrita.karing.jp(www.karing.jp)もOSをVine 4.1にアップデートし、なんとか再稼働しはじめました。調子はボチボチです。cgiの実行は早くなったし、kernelの最適化も以前よりシビアに実行したし、今回のOSアップデートには概ね満足しています。

唯一不満なのはsambaが3.x系になって重くなったことでしょうか。sambaの負荷の状態によってsmbmountがタイムアウトするようになりました。いままではそんなことなかったのに…。apacheが2.x系になって軽快になったのとは対照的です。起動時、netfsによるsmbmountが失敗しても再実行するようにはしてあるので今のところ問題は出ていないのですが、自動運転の機体ではシステム全体に影響を与えるクリティカルな部分を共有していたりするので、あまり頻繁に失敗するようならば、LAN内のファイル共有はNFSにしようかなとも思案中です。でも、事実上Windowsを使っていない身としては、世間様との接点を保つためにもsambaにはこだわりたいんですよね。

ちなみにサーバーなどの設定はVine 4.1の流儀にあわせ、inetdからxinetdに変えたくらいで、ほぼ変わっていません。今回のOSアップデートにおけるrita.karing.jp最大の変更点は、64MBのswapです。以前はswapなしのRAM32MBのみで動かしていたのですが、多少、日和ました。実際には、kernelは厳しく減量して以前使っていたkernel 2.4より小さくなっているし、仮想コンソールの数を三個から二個に減らしたり、それなりの対策は講じたのでrita.karing.jpの実メモリ消費は以前とさほど変わらず、現在は、使用中 17MB、バッファ/キャッシュ 12MB、swap 13MBくらいの内訳で、これなら、swapなしでもなんとか行けそうなのですが、誰も褒めてくれないし、無理してもしょうがないと少し大人になってみました。

とにもかくにも、Vine 4.1を486機で動かすのはけっこう大変でした。ここにたどり着くまで様々な紆余曲折がありましたが、とにかく情報がまったくないことには滅入りました。おそらく現行のrpm系ディストリビューションを486機にインストールする情報が書いてあるページはジョーダン抜きで世界でここだけなのではないかと思います。もはや、希少価値と言うより、誰にも必要とされていない情報なのでしょう。現行のrpm系ディストリビューションを486機で使っているのは世界で自分一人だけなのではないか、インターネット上で動作しているサーバはこのrita.karing.jpだけなのではないか、と孤独な笑みを夕日にさらして背中で泣いてる男の美学…、世の中、洒落のわからん奴らばっかだな、てな気分です。

2007.3.31 よしのぶ
yoshino@rita.karing.jp
index.html
Sat Mar 31 2007