†逆襲のOS/2†

OS2SYS.INIのダイエット

作成開始日 2013.12.03
最終更新日 2014.05.11

OS2SYS.INIの肥大化は、システムの深刻な不安定化とパフォーマンスの極端な低下を招く。ファイル操作が極端に遅くなったり、シャドウが作成不能になったり、ドライブレターが狂ったり、アプリケーションやシステムのクラッシュが頻発したりする。肥大化の原因は、ファイルのハンドル情報(PM_Workplace:Handles0/1)の蓄積。PM上で扱うファイル数が増えれば、当然ハンドル情報数も増える。経験的に言えば、1万ファイル程度でOS2SYS.INIはパンクする。たった1万である。まともな運用がしたければ、OS2SYS.INIの肥大化は何としても避けなくてはならない。その場合、二つに分けて考える必要がある。

【参考】インストール直後のINIファイルの大きさは、OS2.INIが400〜500KB台、OS2SYS.INIの方は80KB前後。しかし、クラッシュの頻発に悩まされた私のシステムでは、OS2SYS.INIが2MB以上に膨れあがっていた。Handles0/1の中身は「BLOCK」という単位で管理されていて、通常はせいぜいBLOCK2か3くらいまでにしかならないそうだ。ところが、私のマシンではBLOCK9にまで達していた。ひょっとすると、BLOCK9が上限で、それ以上の情報を書き込もうとする度にクラッシュしていたのかも知れない。もちろん、PM上でのファイル操作は地獄の遅さだった。

(1)幽霊ハンドルの削除−−CHECKINI

一つは「幽霊ハンドル」の存在。PM上でファイルを操作するとハンドル情報が登録されるが、そのファイルをコマンドラインで削除してもハンドル情報は削除されない。すなわち、存在しないファイルのハンドル情報=「幽霊ハンドル」がOS2SYS.INI内に居座ることになる。こうした操作を繰り返すと、OS2SYS.INIは急速に肥大化する。すべての操作をPM上で行えば、幽霊ハンドルが残ることはないが、それが非現実的なことは言うまでもない。このような場合には、CHECKINIというツールを使って幽霊ハンドルを検出・削除する。CHECKINIはWPTOOLSというツール集の中にある(Hobbesから入手可能)。ローカルドライブの幽霊ハンドルを削除するには、次のようにする;
CHECKINI /C /Y:2 /H
なお、/Cは修正(corrections)、/Y:2は確認に対する自動応答(yes)、/HはHandlesのみの修正を意味する。ただし、この方法ではリムーバブルドライブやネットワークドライブ上の幽霊ハンドルは削除できない。これは、「/Y」または「/Y:2」オプションを指定すると、/Rオプション(ローカルドライブ以外のチェックを無効化)が自動的に有効になってしまうため。これは仕様なのでしようがない。コンパクトフラッシュやSambaサーバー上のファイルの幽霊情報を消すときは「/Y:2」オプションを付けない。
CHECKINI /C /H
とすればよいわけだ。Y/N応答が多少わずらわしいが、ディレクトリ単位の処理のようなので、たとえ幽霊ハンドルが数百あっても、同一ディレクトリ内のものであれば、それほどの手間にはならない。

PMREXXベースのCheckini用PMインターフェースとしてCheckiniPMがあるが、インストール手順も使い勝手も良くない。

ただし、いずれしろ、CHECKINIでは正常なハンドル情報は削除できない。特にリムーバブルドライブやネットワークドライブ上のファイルの数は、実質的に無限と見做してもよい。PM上でファイル操作をする限り、OS2SYS.INIは早晩パンクする。フォルダを表示したり、PMアプリケーションでファイルを開くだけでも肥大化する。現実的にはパンクは不可避であり、そうなったらシステムを再インストールしてOS2SYS.INIを初期化するしかなかった。

(2)正規ハンドルの削除−−CLEANINI

PC上にファイルが1万程度あり、それらのハンドル情報がすべてOS2SYS.INIに登録されれば、それだけでOS/2は実質的にクラッシュする。何を考えているのか、まったく理解不可能な仕様だ。これでは、私なんぞ月一回程度の再インストールが必要になってしまう。その度に環境設定はすべてやり直しだ。実際の再インストールは半年に一度くらいの頻度だったが、大半の期間はシステムの極端な鈍重化と不安定化に悩まされ続けていた。そこで、どうしても正規のハンドル情報を正常な状態で削除する方法が必要になってくる。

私が主として使用しているPMアプリケーションはPMViewだが、PMViewによるOS2SYS.INIの肥大化は、ユーザーの間でも以前から問題になっていたらしい(http://www.pmview.com/forum/lofiversion/index.php/t258.html)。 で、それを回避する為に、コマンドラインのAPIを使ってcopy/move/deleteを実行するように変更したらしい(オプションでPMのAPIを使うことも可能)。ところが、それでも、やっぱりOS2SYS.INIは急速に肥大化する。バグっているのか、それともリネーム等はやっぱりPM経由なので肥大化するのか…?

この問題が厄介なのは、ファイルのハンドル情報が正規のデータであり、本来であれば必要な情報だと言う点にある。これがファイルをオブジェクト化できるPMのキモらしい。正規の必要な情報であれば、削除できないのが当然だろう。だが、ハンドル情報が本当に必須のものかどうかは判断が難しい。そもそも、ローカルに存在するファイルのすべてがOS2SYS.INIに登録されるわけではない。少なくとも、PMでいじらないファイルに関しては、登録はされないのではないかと思う。さらに、OSを再インストールした直後の状態では、データファイルのハンドル情報は全て消えてしまっているのだが、さりとて特段困ったことが起きるわけではない。確かに、フォルダの表示位置や大きさなどの設定は消えてしまっているし、もし、ファイル単位で特別な設定がしてあれば(シャドウの作成やクラスの変更など)、それも消えてしまうだろう。しかし、単純なファイルとしての機能に一切の支障はない。

と言うか、ファイルのオブジェクト化自体、本当に意味があることかどうか疑わしい。パスとファイル名と拡張子による管理の方がずっと便利だというのが私の実感だ。現実を無視した理念先行のアダ花だったと思う。

ならば、正規の情報であろうとなかろうと、ファイルハンドルなんて消してしまえば良いのではないか? このような必要のないファイルハンドル情報を削除するのがCLEANINIというツールだ(Carsten's OS/2 Homepagesより入手)。

CLEANINI /c /Restart
とすれば、使用されていないハンドル情報をすべて削除して、システムを再起動してくれる。もちろん、必要な情報は残しているので、まっさらに戻るわけではないが、ウチのOS2SYS.INIは90KB台になった。OSインストール直後は80KB台なので、ほぼ初期状態と言ってもよいだろう。ちなみに、このウチではOS2SYS.INIが130KB台に達するとシステムがやや不安定になるので、数日に一度の割合でこのCLEANINIとCHECKINIを掛けている。

【参考】CLEANINIの存在を知る以前、トリッキーな対処方法として、正常ファイルの擬似幽霊化を試したことがある。たとえば、ローカルファイルのファイル名をコマンドライン上で変更したり、リムーバブルメディアを抜いたり、LANドライブを切断したりしてCHECKINIを掛ける。こうすると、それらのファイルは既に存在しないと見做され、理論上はCHECKINIで削除可能になる。が、実際にはそんなに上手くはいかなかった。どうも、コツというかタイミングのようなものがあるらしい。また、切断したドライブ上のシャドウなども消えてしまうため、それはそれでけっこう不便だった。
 
もう一つ、極めて直截な方法としては、INIエディタでHandles0/1情報を削除してしまうという荒業がある。無論、これには非常に大きなリスクが伴う。後ろのブロックから慎重に削除していくと上手くいくこともあるが、かなり高い確率でシステムが再起不能になる。Handles情報はある程度分類した上でノード状に連結されているようで、僅かでも手を加えると、全滅のリスクがあるようだ。少なくとも、不要データのみを選択的に削除するのは困難。無論、どの途再インストールが必要なら、やっちまっても同じだろう、という覚悟があれば止めないが。
 
蛇足ながら、インストール直後のOS2SYS.INIを保存しておいて、肥大化したOS2SYS.INIと差し替えるという方法は上手くいかない。たいていはシステムがブートしなくなる。また、OS2SYS.INIにはOS2SYS.!!!というバックアップファイルがあり、効率化のために処理を振り分けているようだ。そのため、INIの内容の変更が即座に反映されなかったり、変更したはずなのに、いつのまにか元に戻っていたりすることがある。


【補遺1】NEWCALLS.DLL

NEWCALLSはCLEANINIと同じ作者による、INI書き込みの速度向上ツールだ。 そもそもINIの書き込み時には、安全性を考慮してウエイトが掛かるようになっているらしい。これは凄く思い当たることが多い。PMViewでOn-the-flyサムネールの表示をする時も、ファイル移動をする時も、かなりの頻度でおかしなウエイトが掛かる。私の勘では、これがたぶんINI書き込み時のウエイトだ。そして、そのウエイトでフリーズすることが非常に多い。で、このNEWCALLSをインストールすると、DLLを置き換えて、ウエイトが掛らなくなるらしい。そうなれば、確かにパフォーマンスは向上する。しかし、わざわざ入れていたウエイトを取ってしまって、安全性はどうよ? 作者によれば問題ないらしい。というか、経験的に言って、このウエイト時にフリーズすることが多いのだから、むしろない方が安全のような気がする。

ただし、実装方法がPMMERGE.DLLにパッチを当てて、元来DOSCALLS(DOSCALL1?)を呼び出すべきところを、NEWCALLSの呼び出しに置き換えるという、ちょっとイヤな方法を取っている。この方法では、DLLのバージョンが違っていた場合でも有効なのかどうか…。また、その効果に関しても多少疑問で、確かに安定化したような気もするが、OS2SYS.INIが130KB台になると一度不安定化するのは変わっていない。とりあえず、現在は使用していない。

【補遺2】OS2.INIのCLEAN

OS2SYS.INIではなく、OS2.INIを掃除するには次のツールを使うと便利。両方ともHobbesで入手可能。

FPOS フォルダ/ファイルの位置情報を削除
ICONOMIZE カスタム・アイコンを削除

特に、カスタム・アイコンは意外なほど容量を食う。無駄にデカいアイコンは削除するとよい。PM123のアイコンを削除するだけで1MB→700kBくらいになった。

【補遺3】INI2REXXによるINIのREXXファイル化

OS2.INIおよびOS2SYS.INIをREXXスクリプトに変換するツール(x:\OS2内に作成)。一種のINIバックアップツールで、作成されたREXXスクリプト(OS2.CMD/OS2SYS.CMD )を実行すれば、INIファイルが復元されるようだ。単なるバックアップツールと異なるのは、判読可能なスクリプト形式に変換されるため、改変が比較的容易だと言う点。もっとも、Handles0/1をはじめ、多くのデータがバイナリ構造なので、気軽に削除や編集ができるようなものではないが。

【補遺4】デスクトップの喪失

CHECKINIを試用している過程で、なぜかデスクトップを喪失してしまった。リブートすると「一時的なデスクトップ」というレスキュー用の仮のデスクトップが出てきてしまう。原因は不明。ただし、対処方法はある。一時的なデスクトップでコマンドラインを開いて、checkini /Dでデスクトップを明示的に指定してやればよい。たとえば、デスクトップフォルダが「D:\デスクト」であれば;
checkini /DD:\デスクト /c
とする。「/c」オプションが必須かどうかはわからないが、私は付けて復活させた。なお、一時的デスクトップ状態でかな漢字変換が使用可能かどうかは不明。私は、システムドライブ(D:)のDIRを取ってディレクトリ名を表示させ、コピー&ペーストで「デスクト」を入力した。−−日本語のディレクトリ名というのは実に迷惑だな。


【逆襲のOS/2目次】 【ホーム】