●逆襲のOS/2●(2010.06.08/2013.12.03)
INIの肥大化とクリーンアップ
OS2.INIやOS2SYS.INIが肥大化すると、ファイル操作が極端に遅くなったり、シャドウが作成不能になったり、クラッシュが頻発したりする。特に問題になるのが、OS2SYS.INIのPM_Workplace:Handles0/1という項目。これは、PM上でファイルを操作する度に大きくなっていく。ちなみに、インストール直後のINIファイルの大きさは、OS2.INIが400KB台、OS2SYS.INIの方は80KBくらい。しかし、クラッシュの頻発に悩まされた私のシステムでは、OS2SYS.INIが2MB以上に膨れあがっていた。

もちろん、原因はHandles0/1の肥大化。Handles0/1の中身は「BLOCK」という単位で管理されていて、通常はせいぜいBLOCK2か3くらいまでにしかならないそうだ。ところが、私のマシンではBLOCK9にまで達していた。ひょっとすると、BLOCK9が上限で、それ以上の情報を書き込もうとする度にクラッシュしていたのかも知れない。もちろん、PM上でのファイル操作は地獄の遅さだった。

なんでこんなことになったのかと言うと、そもそも大量のファイルをいじっていた上に、整理したデータをコマンドライン命令で移動/削除していたため(だと思う)。つまり、すでにHDD上になくなっていたファイルの幽霊情報がどんどん蓄積されていったのだろう。PM上で最終処理されたファイルならば、その情報はHandels0/1から削除されるので、幽霊情報が蓄積されるようなことはないらしい。こうなると、私の使い方の問題も大きいようだが、この程度の状況は想定して、対処機能を付けるのが普通だと思うがなぁ…

●CHECKINIによる幽霊ハンドルの削除

ということで、WPTOOLSというツール集の中にあるCHECKINI.EXEを使うと、こうした幽霊情報を掃除できる(WPTOOLSはHobbesから入手可能)。ローカルドライブの幽霊ハンドルを削除するには、次のようにする。
 CHECKINI /C /Y:2 /H
なお、/Cは修正(corrections)、/Y:2は確認に対する自動応答(yes)、/HはHandlesのみの修正を意味する。これによって、OS2SYS.INIが220KB⇒190KBになった。意外に効果が小さいように感じられるが、このシステムは再インストールしてから日が浅く、幽霊情報があまり蓄積されていなかったためだろう。実在するファイルに関する情報は消せない(実は消す方法あるが:後述)ので、まあ、こんなもんでしょう。

ただし、この方法ではリムーバブルドライブやネットワークドライブの幽霊ハンドルは削除できない。これは、「/Y」または「/Y:2」オプションを指定すると、/Rオプション(ローカルドライブ以外のチェックを無効化)が自動的に有効になってしまうため。これは仕様なのでしようがない。

●リムーバブルドライブおよびLANドライブの幽霊ハンドルの掃除

では、コンパクトフラッシュやSambaサーバー上のファイルの幽霊情報を消すにはどうすればよいだろうか? 無論、「/Y:2」オプションを付けなければよい。つまり、
  CHECKINI /C /H
とすればよいわけだ。Y/N応答が多少わずらわしいが、ディレクトリ単位の処理のようなので、たとえ幽霊ハンドルが数百あっても、同一ディレクトリ内のものであれば、それほどの手間にはならない。

ただし、これにはビミョーな問題がつきまとう。それは、リムーバブルドライブやLANドライブは、ファイルのアーカイブ(保存庫)として利用することが多く、そこには物凄く大量のデータが入っている可能性がある。リムーバブルドライブなど、メディアを交換すれば実質的に容量は無限である。これらに保存されたデータは実在するものであり、そのハンドル情報も決して幽霊情報ではない。しかし、だからと言って無限に貯まられてはたまったものではない。データ数が1万くらいになると、Handles0/1の容量はほぼ上限(BLOCK9)に達するだろう。こうなると、実在していようといまいと、ハンドル情報を削除するしかない。……もちろん、アーカイブはPMでは絶対にいじらない、ということであればこうした問題も起きないが、なかなかそうもいかなくて。

●リムーバブルドライブおよびLANドライブ上の実在ハンドルの削除

ということで、実在するファイルハンドルを削除するにはどうすればよいか? 答えは、リムーバブルメディアを抜き取り、LANドライブを切断した状態で、
  CHECKINI /C /H
とすればよい。これでリムーバブルドライブおよびLANドライブ上のファイルのハンドルは、実在/幽霊を問わずすべて削除できる。それはそうなのだが、ここでもう一つ問題が出る。この方法ではリムーバブル/LANドライブ上のフォルダのシャドウなども消えてしまう。抜き出し/切断によって、それらのフォルダはなくなったと見做されるわけだから。そういう場合は、同じディレクトリ構造を持った、ダミーのメディア/サーバを用意して、抜き出し/切断ではなく、ダミーに接続した状態で上記の命令を実行すればよい。

●ローカルドライブ上のファイルのハンドル情報の削除(1)Handels0/1の直接削除

ローカルドライブも容量が大きければ、結局リムーバブル/LANドライブと同じ問題が出る。では、ローカルドライブ上に実在するファイルのハンドル情報はどうやったら消すことができるのか? 一番安全なのは、コマンドラインでファイルを別の場所に移動して、CHECKINIを掛けるという方法。WPSはコマンドラインでのファイル処理を検知できないので、移動と削除の区別がつかない(それがそもそもの問題だったわけだ)。いわば、実在ファイルのハンドルを意図的に幽霊化させるわけだ。なお、移動先は同一ローカルディスク内でも大丈夫(だと思う…ダメならリムーバブルにでも追い出して(^^ゞ)。

もし、それが面倒だと言うのなら、まったく推奨できない、極めて危険な方法だが、INIエディタでHandles0/1を直接削除してしまうという方法もある。その際、絶対に守らなくてはならないのは、Handels0/1のBLOCK1は必ず残しておくということ。これまで削除すると、ブート不能状態に陥る。また、Hadles0およびHandles1の両方のBLOCKを削除すること。つまり、Handles0のBLOCK2〜BLOCK9とHandles1のBLOCK2〜BLOCK9を削除する。これによって、OS2SYS.INIのサイズは劇的に減少する。

でも、そんなことして大丈夫なのか?−−答えは判らない。でも、大丈夫だったことはあった。システムがぶっこわれて再インストールしたこともあった。まあ、賭けですな(^^; で、その経験から言えることを少々。まず、このHandles情報はノードで鎖状につながっているようで、一部だけ選択的に消すことはできないようだ。テーブル構造で部分削除が簡単なら、こんな苦労をしなくて済むのだが。また、ハンドル情報は時系列に従って単純に後ろに追加されるのではなく、ある程度の分類がなされた上で、種類ごとに別のチェインにまとめられているような気がする。

ここから何が言えるのかと言うと、INIエディタで選択的にハンドル情報を消そうなんて考えるのは止めた方が良さそうだ、ということ。また、重要な情報ほど頭の方に入っている可能性が高く、お尻のBLOCKから1つずつ(ただしHadles0/1の両方)順番に消していけば、リスクを小さくできるかも知れない、ということ。もちろん、1回ごとにシステムのリブートが必要。

なお、INIエディタによってBLOCKを削除したあとは、Ctrl+Alt+Deleteはではなく、必ず正規の手順でOS/2を終了させること。これによって、その時点のデスクトップの情報がiniに書き込まれているようで、仮にBLOCK削除によって重要情報が削除されても、デスクトップへの被害は少なくて済むようだ。ま、いずれにしろ、私の狭い経験からの推測で、何の保証もできないことは言うまでもないが。

  PMREXXベースのCheckini用PMインターフェースCheckiniPMというのもあるようだが、インストール手順も使い勝手も良くない。もちろん、選択的な削除の役には立ちそうにない。 また、os2.iniに書かれているフォルダ情報はfposというツールで消せるようだ。ただし、こちらはフォルダの表示設定情報などを記憶しているので、消してしまうといろいろと不便が発生する。

●【追記】ローカルドライブ上のファイルのハンドル情報の削除(2)ファイルのリネーム

その後、もう少しトリッキーな方法を思い付いた。それは、コマンドラインで、ファイル名をリネームしてしまうという方法だ。たとえば、あるディレクトリ内の「*.jpg」ファイルをいったん「*.jp」と変更して(ren *.jpg *.jp)、その上でcheckini /h /cを掛ければ良い。再三述べているように、PMはコマンドラインでのファイル操作を検知できないので、このリネームによってファイルが消えたと見做されるようだ。そして、checkini終了後に「*.jp」を「*.jpg」に戻してやればよい。

ただし、この方法はファイルに対しては有効だが、ディレクトリに対しては有効ではない。ディレクトリ名の変更で同様な効果があれば実に便利なのだが、そもそもディレクトリに対してはRENは無効。ディレクトリ名の変更にはMOVEを使うのだが、同じコマンドライン命令でもMOVEでは効果はないようだ。

【追記の追記:2013.12.03】その後、ディレクトリのリネームで擬似幽霊化させる方法が判明した。と言うか、擬似幽霊化がOS2SYS.INIに反映にされるのには、かなりのタイムラグがあるらしいことが判った。コマンドラインないしはコマンドラインベースのファイラーでディレクトリをリネーム後、一度システムをリブートすると良い。ただし、別項でも述べているが、この方法も長続きはしない。知らないうちに全情報が勝手に復元されてしまう。

●【補記】デスクトップの喪失

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

●OS2.INIのCLEAN (2013.10.19)

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

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

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

●INI2REXXによるINIのREXXファイル化 (2013.10.19)

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

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