主PC復旧。

 かなり虚しさを感じる年越しだった。死に掛けた主PCを復旧していたらいつの間にか日付が変わっていたんだからなぁ。
 まず主PCにて障害HDDへのWindows2000新規セットアップを実行。障害HDD上の既存のパーティションは全て破棄、新規に作成し直した。この際、事前に作成しておいたServicePack4適用済みセットアップCDを使用したが、どうしたことか新規パーティションサイズ入力で数値が5桁までしか入力できなかった。入力はMB単位なので、これではどう頑張っても99,999MBが上限ということになってしまう。解決方法は不明のままで、やむなく正常稼動する別PCにてパーティション作成とフォーマットを代行し、改めて新規セットアップを実行。これにより破損していたMBRが一新された。
 次にバックアップHDDから障害HDDの各パーティションへ全ファイルを上書き復元。フォーマットからこの復元までおよそ8時間程度を要し、この途中で新年を迎えてしまった。
 これと平行して、Windows2000で稼動するThinkPad X20にてregedt32.exeを用いたシステムハイブの整理を行う。このあたりの作業はhttp://isolinear.info/blog/archives/2008/03/windows2000hdd.htmlが大変参考になりました。
 http://support.microsoft.com/kb/302829/jaに従い、regedt32.exeで障害HDDから取得しておいた winnt\system32\config\system をX20のレジストリに一時的にロードし、利用されていないControlSetの削除を実施。今まで障害調査などで漫然と眺めていたControlSet00xの存在理由がようやくわかった。ちなみにこのナレッジベース記事は一部記載に誤りがあるような気がする。手順22の「手順6.〜22.を繰り返し、…」は正しくは「手順15.〜25.を繰り返し、…」であろう。編集権限の追加なしにハイブのロードを繰り返しても、作業目的と反対に作業しているPCのレジストリにゴミを追加するだけだ。
 この作業により使用されていない古いControlSetが削除され、障害発生直後は9,020KBだったsystemは一気に3,576KBまで縮小した。ちなみにWindowsXPのregedit.exeでハイブのロードとそのままハイブ形式でのエクスポートも試したが、こちらでは8,628KBとそれほど大きな効果が見られなかった。一応、両方のsystemファイルをキープしておくことに。
 障害HDDへのファイルコピーが完了し、システムハイブ以外は障害発生前に戻った状態になった。一旦最も縮小したsystemファイルを使い、主PCに障害HDDを取り付けたところ一応Windows2000は起動したが、M/B内蔵の音源やビデオカードなどハードウェアのデバイスドライバが全てなくなった状態だ。システムハイブにハードウェアとデバイスドライバ関連の情報が書かれていたとすれば、先のシステムハイブの縮小作業で間違ったControlSetを削除したのだろう。どれが本当に残すべきControlSetだったのかをひとつずつトライ&エラーで調べるのはかなり大変だ。次に障害発生時そのままのsystemファイルを使用したところ、やはりLoader Error 3が発生した。
 これらに代わりそのままエクスポートで吐き出していたsystemファイルを使ったところ、今度は全てのハードウェアが正常に認識された状態でWindows2000が起動した。
 完全復旧かと喜んだが、一部のアクティベーションを要するアプリケーションやシェアウェアでユーザ登録情報が消えてしまっており、再登録しなければならないようだ。しかしデバイスドライバ再導入の手間を考えれば楽なもの、これをもって復旧とすることにした。
 今回の障害の最初のきっかけが何だったのかは判然としないままだ。推測できる流れとしては、まずディスクアクセスに何らかのエラーが起きてMBRが破損し、次の起動で起動に失敗したWindows2000自身によって現状のControlSetの退避と前回正常起動時のControlSetの復元が行われ、このためシステムハイブが肥大してLoader Error 3が発生した…というところか。