2014年6月24日火曜日

ブートしなくなったWindows 8.1の復旧

最近、またThinkPad Edge E430を使い始めています。やはり、「U」版のCPUとはキビキビ感が違いますから。

そのE430ですが、なぜか起動しなくなりました。UEFI BIOS画面が出て、Windowsの旗が表示されたところで、すぐに電源が落ちてしまいます。玉がグルグル回るアニメーションが出る直前のことです。
見た目の症状としては、以前の「休止状態から復帰しない」と同じですが、今度はもっと重症です。以前は、再度電源を入れると「休止状態からの復帰」ではなく「コールドブート」で起動していたのですが、今回は何回やってもまったく起動しません。

このThinkPadはシステム用のSSDと、データ用のHDDのデュアルドライブで運用しているのですが、不思議なことにデータ用HDDを外すと起動するようになります。その後、そのHDDを再びつけても、ちゃんと起動できます。しかし、「何かの拍子」にまた起動しなくなってしまいます。その都度HDDを外したりつけたりしていましたが、あまりにも不便です(その後気づいたのですが、修復ディスクやWindows8インストールディスクから起動して、「Windows8(8.1)へ進む」とすることでも、起動できるようです)

試行錯誤していくうちに、その「何かの拍子」が何か分かりました。「高速スタートアップ」を有効にしてシャットダウンした場合と、休止状態にした場合です。その操作をしたあとは、Windows8.1が起動しなくなることに気づきました。一方、「再起動」と「SHIFTキーを押しながらシャットダウン(=完全シャットダウン)」のときは、ちゃんと起動できます。

これに気づいてgoogleって見ますと、皆さん同じ症状で困っているようですね。しかも、外付けUSB-HDDの内容が飛ぶとか、怖い話もあるではありませんか!
しかし、どのページを見ても「高速スタートアップは無効する」というような対処療法的な解決策しか載っていませんでした。確かに、SSDを使っていると高速スタートアップのご利益はあまり無さそうですが、高速スタートアップを無効にしたところで、休止状態から復帰できないことに変わりはないので、私としては全然問題解決になっていないです。

いろいろと調査&試行錯誤した結果、ようやく解決策を見つけました!
私のThinkPadの場合は、BCDストアを少しいじってやると直りましたので、紹介します。


  • 修正ポイントその1-bootmgrのあるボリュームが明示的に指定されていなかった

    もともとそうだったのか、何かのタイミング(怪しいのはWindows8.1 Updateのとき?)にそうなったのかは定かではありませんが、BCDストアの「Windows ブート マネージャ」に存在すべき(だと思う)deviceエントリがありませんでしたので、下記のように追加しました。

    Windows ブート マネージャー                                    
    --------------------------------                             
    identifier              {bootmgr}                            
    device                  partition=\Device\HarddiskVolume1    
    path                    \EFI\Microsoft\Boot\bootmgfw.efi     
    description             Windows Boot Manager                 
    locale                  ja-JP                                
    inherit                 {globalsettings}                     
    integrityservices       Enable                               
    default                 {current}                            
    resumeobject            {e47973bb-8254-11e3-9794-f7a2787aa3d1}
    displayorder            {current}                            
    toolsdisplayorder       {memdiag}                            
    timeout                 5                                    
    HarddiskVolumeのあとの数値は、PCによって異なる可能性が高いです。ここには、EFIパー ティションを指定します。
    正しく指定されているかを確認する方法の一つは、そのEFIパーティションにドライブレターを与える方法です。diskpartを起動して、EFIパーティションをselectしたら、assign LETTER=sなどのようにドライブレターを割り振ります。その後、bcdedit /set {bootmgr} device partition=\Device\HarddiskVolume? コマンドで適当な番号を設定した後、再度bcdedit /enum コマンドで確認した時に、device  partition=S:と表示されていたら正解です。

  • 修正ポイントその2-「休止状態からの再開」にあるinheritエントリを削除する

    これについては、こちらの情報を参考にしました。Windows Vista SP1での情報ですが、症状は似ています。Microsoftは、Vistaでの間違いをまたWindows8でも繰り返したのでしょうか?

    bcdedit /enum bootappコマンドなどで、ブートアプリケーション一覧を表示させて、「休止状態からの再開」に対するidentifier(GUID)を覚えておきます。
    そして、bcdedit /deletevalue {GUID} inheritコマンドを実行します。

このトラブル解析のおかげで、BCDに関する知識がだいぶん深まった気がします。
いままで気付かなかったのは、BCDは単に「エントリ=値」の関係を覚えているだけに過ぎないこと、いくつかの「エントリ」は起動すべき実行ファイルを指すなど重要な意味を持っているけれど、それ以外のエントリはブートするアプリに固有の情報でしかないこと、です。できれば、個々のエントリについてもう少し詳しい意味・解説が知りたいところですが、今はなんとかブートできるようになっただけで「おなかいっぱい」なので、後日調査することにします。


5 件のコメント:

  1. 上の操作で一時的には治っていたのですが、やはり2~3日経つと、休止状態からの復帰ができずに、電源がすぐ落ちてしまう現象が発生するようになりました。
    その都度、USBメモリ(Windows8のインストールディスクを移したもの)から起動して、コールドブート相当の起動方法をさせるとちゃんと起動するようになるので、もう焦ることはないのですが、それにしても毎度毎度、面倒です。

    どうも、休止状態(または、「高速スタートアップ」有効時のシャットダウン状態)からの復帰時に実行されるBCDエントリで目的のドライブorパーティションが見つけられていないのではないか?と推測しているのですが、ブートログすら残せない状態なので確認のしようがありません。
    どなたか、休止状態からのブートシーケンスについて詳しい人がこの書き込みをご覧になりましたら、何かアドバイスをいただけないでしょうか?おそらくUEFI BIOSは、「ファームウェアのブートマネージャ」→「休止状態からの復帰」とBCDエントリをたどって、winresume.efiをロードするのだと考えています。いまざっとbcdeditで確認して見る限りでは、問題無さそうなのですが・・・。

    返信削除
  2. どうもブート設定の問題ではなく、休止状態へ入る(または、シャットダウン時)に問題が起きているようです。コールドブート後にイベントビューアーを見ると、

    「イベントID 20:前回のシャットダウンの成功状態は false でした。前回のブートの成功状態は true でした。」

    「イベントID 6008:以前のシステム シャットダウン ( ‎2014/‎07/‎03 0:22:29) は予期されていませんでした。」

    「イベントID 41:システムは正常にシャットダウンする前に再起動しました。このエラーは、システムの応答の停止、クラッシュ、または予期しない電源の遮断により発生する可能性があります。」

    というようなエラーが残っていました。完全なシャットダウン(「高速スタートアップ」が有効でないシャットダウン)のときは、こんなエラーは発生しませんでした。

    いつからこんなことになったのだろう。しばらく、格闘が続きそうです。

    返信削除
  3. このコメントは投稿者によって削除されました。

    返信削除
  4. こちらでも同様の不具合が確認されましたので、色々と試していました。

    先ず「一度でも休止やハイバネートに失敗するとhiberfil.sysがファイルシステム上で壊れる」という状況があります。

    確認方法は POWERCFG /A です。
    壊れている hiberfil.sys に保存しようとしているので正しく保存できないパターンです。
    一度 POWERCFG /HIBERNATE OFF とし、POWERCFG /HIBERNATE ON とする事でhiberfil.sys「は」正常化します。

    毎回ですと面倒なので、テスト環境には起動時に以下のVBSを走らせています。

    objShell.run """%SystemRoot%\System32\powercfg.exe"" /HIBERNATE OFF",0,True
    objShell.run """%SystemRoot%\System32\powercfg.exe"" /HIBERNATE ON",0,True

    仮に hiberfil.sys が壊れても、毎起動時に強制的に修復します。


    次に、システムの設定である起動と回復から「システムログにイベントを書き込む」と「再起動する」のチェックを外します。

    これはドライバとの相性により「hiberfil.sysが書き込んでいる途中で(または書き込む前に)HDDの電源が落ちている」事を確認する目的があります。

    エラー発生→エラーを書き込むぞ→書き込むHDDが無いぞ!→もういい!再起動だ!→再起動用のルーチンは止まっている→電源が落ちるだけ

    という流れがシャットダウン時に存在する場合、ログを書き込む事も再起動も設定されていなければ「PCの電源が落ちなくなる」からです。
    落ちない場合、ほぼ確実にドライバ起因です。


    書き込み失敗が原因だと推測出来た場合、ドライバをOS標準の物、今現在標準ならメーカーの物に変更します。
    HDDの電源が早く落ちてしまう状態が回避できる可能性があります。



    最後にマザーボードのCMOSの初期化を試します。
    マザーボードの持つ機器構成情報とOSの持つ機器構成情報に齟齬があり、それが原因でHDDの電源が早く落ちてしまうケースで改善の可能性があります。

    返信削除
  5. コメント、どうも。
    この件、貴方のところと私のところとでは原因が異なるかも知れませんが、私のところではこの問題は解決済みです。

    原因は仮想メモリを0に設定していたことでした。

    手元のすべてのPCにおいて、仮想メモリの設定をWindowsのデフォルトに戻すか、少なくとも400MByte程度は確保しておけば、休止状態への移行・復帰時のこの問題は完全になくなりました。
    Windowsは休止状態への移行だけでなく、高速スタートアップについても、何故か仮想メモリを一部利用しているのではないかと何となく推測しています。

    返信削除