マルチブート環境で、チェックディスクが原因でVistaが起動しなくなった
最近わけあって、VistaプリインストールのPCでXPばかり使っていた。
いつも通りのメンテナンスで、XPのコマンドプロンプト上でCドライブ(Vistaがインストールされているドライブ)のチェックディスクを実行していた。
しかし、セキュリティ記述子のチェック中にメッセージが連発。
「ファイル ~ のインデックス ~ から ID ~ のインデックス エントリを削除しています。」
という表示が40万件ほど続いた(およそCドライブの全ファイル数)
チェックディスクを途中で止めるのも問題ありそうなので止めなかった。
再起動してVistaからブートしてみると、ログオン画面の背景(薄い青)が表示されて止まってしまった。
試しにセーフモードで起動しても同じく止まってしまう。最小限の構成である、「セーフモードとコマンド プロンプト」から起動しようとしても無意味であった。
ドライバの読み込みは問題ないようなので、まずはシステムファイルの破損を疑った。
Vista のインストールディスクから「システムの回復オプション」を起動して、コマンドプロンプトを起動。
Cドライブに対してチェックディスクを実行したが、何も問題が見つからなかった。
次に スタートアップ修復を行うも 特に問題なし。
システムの復元は使うだけ無意味なので無視。(というか無効にしてあるんで。)
Win98にシステムファイルチェッカー(sfc.exe)があったのを思い出して、再びコマンドプロンプトを起動して実行してみる。
(ここではHDD上のVistaではなくCD上から起動しているので、オフラインスキャンとして実行する必要がある。次のようにスイッチを指定して実行。)
システム スキャンを開始しています。これにはしばらく時間がかかります。
Windows リソース保護により、破損したファイルが見つかりましたが、それらの一部
は修復できませんでした。
詳細は、CBS.Log windir\Logs\CBS\CBS.log に含まれています。例
C:\Windows\Logs\CBS\CBS.log
数十分の後にこのように表示された。ログファイルは50MBもあり読むのが面倒だったので、とりあえずVistaからブートしてみる。
しかし、同じくログオン画面が出る前で止まってしまった。
ところで、XPですっかり標準となった NTFS ではフォルダ、ファイルそれぞれについて、ユーザーごとにアクセス権限を設定することができる。
これによって安全性を高めた反面、自由なファイル操作が利かなくなった点もある(VistaのWindows Resource Protectなど)
チェックディスクでこのあたりの設定が勝手に変更されたのではないかと予想。
システムファイルへのアクセスがこの設定でブロックされたのではないか、と(エラーメッセージが出なかったのはなぜ?)
XPをセーフモードで起動して、Administratorとしてログオン。
Vista がインストールされているドライブとXP がインストールされているドライブのセキュリティ設定を見比べると、明らかな違いが。
Vista のドライブではAuthenticated Usersがなくなっていた。
そこで、Authenticated Usersをアクセス許可に入れてみることにした。
しばらく待つこと数十分。
再起動してVistaからブートしてみると、いつものログオン画面が現れた。
パスを入れてログオンすると、デスクトップが表示され…問題なく起動できた。
後で確認したらユーザーフォルダからも自分のユーザーのアクセス許可が消えていたので追加しておいた。
この問題についてよく調べてみると、Win2kにおいて似たような現象が起きていたようだ。
http://support.microsoft.com/kb/327009
シングルOSならそれほど問題は大きくないが、マルチOS環境だと別。
そのOSでのユーザー権限すべてが削除されてしまっては、そのOSの管理者権限でも当然アクセスは拒否される。
今回はシステムファイル含むVistaドライブ上のすべてのファイルで、XPで使われるユーザーを除くすべてのアクセス権限が削除された。
よって、ログオンに必要なシステムファイルを読むことができずフリーズした。
予想だとこんなところ。
ドライバを読む段階では問題なかったってことは、その間だけアクセス権限が機能していないのか?
わからない部分も多いけど今のところ問題ないし、結果オーライだな。
この後 .net や VS2008 をインストールしようとすると原因不明のエラーで中止されてしまう状態に陥り、リカバリする運びとなりました。
やっぱり 問題なし では済まされなかった。
こんなことなら最初からリカバリしてればよかった。
まあいつものことですが。
今後同じようなことが起きても復旧できるように、リカバリ後のアクセス権限のデータをファイルとしてバックアップしておきました。
icacls c:\windows* /save d:\secu_bak.acl /T
復旧させるときはsaveスイッチをrecoveryスイッチに置き換えます。