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