ブートをぶっ飛ばしたWindowsを修正する
ある日電源をいれたらWindowsが起動しなくなってて、泣きそうになったけど、Cドライブは生きていたのでブートが死んだとわかったのでEFIブートを必死で直した。
回復コンソール(コマンドプロンプト)を実行する
Windowsのインストールディスクから起動する、WinReから起動する、USBに作成した回復ドライブで起動するなどをして、修復する→トラブルシューティング→オプション→コマンドプロンプトで回復用のコマンドプロンプトを起動します。
diskpart でドライブの様子を確認する。
diskpart
Cドライブの割り当てを確認します。
DISKPART > list vol
もし、c:ドライブが意図したディスクと違うディスクに割り当てらているときはc:ドライブの割り当てを削除して別のボリュームにC:を割り当てます。
list vol select vol 0 remove letter=c select vol 3 assgin letter=c
EFIブートパーティションにドライブ文字割り当て
list vol select vol 1 assign letter=s list vol
bcdboot で起動の修正
bcdboot /l ja-JP /s S: /f UEFI
S:ドライブはDISKPART、EFIブートパーティションへAssign Letter=s
してあります。
/l ja-JP
は省略してもいいみたいですが、合わせた方がすんなり起動する様です。
DISKPARTで確認したC:ドライブを起動ドライブとしてUEFIを再構成する例です。
だいたいの場合はこれで治ります。
EFIパーティションがない場合
DISKPARTで作成します。
DISKPARTでFAT32パーティションを100M-300M程度作ります。
私はgdiskで作っちゃうし diskpartでのやり方は知らない。
sgdisk -n '1::+100M' /dev/loopX sgdisk -t 1::ef00 /dev/loopX
DISKPARTの使い方はこの記事の本題でないので割愛。
ブートオーダーを修正する。
bcdeditでEFIの登録を修正
bcdeditを確認すると、なんか大量にIDが含まれているとき、bdceditでブートドライブのUUID登録を修正するとブートが治りました。
ディスクを交換した、ddした、gdiskでリサイズしたとかディスクのIDが変化した時にこのようなエラーが起きます。BDCbootで修正可能ならいいんですが、バックアップのUSBドライブ複数接続していて、複数のC:ドライブがあったりデュアルブートだと、EFIブート順がグチャる可能性がある。
EFIのブートローダーを確認する
bcdedit /enum bcdedit /enum {firmware}
次の例は、ブート破損したWindowsで確認できたブート順序です。
余計なものを消してスッキリさせる。
次の様に、ファームウェアのbootmgrのオーダーから余計なのをサクサク消していき bootmgrだけにしておきました。
bcdedit /set {fwbootmgr} displayorder {bootmgr} /remove bcdedit /set {fwbootmgr} displayorder {e05xxxx-11-xxxx} /remove
最後に先頭にEFIブートマネージャーを登録します。
bcdedit /set {fwbootmgr} displayorder {bootmgr} /addfirst
スッキリ
bcdbootを修正
bcdeditでIdentifierを修正した後に、再びbcdboodでブート登録する
bcdboot /l ja-JP /s S: /f UEFI
S:ドライブはDISKPART、EFIブートパーティションへAssign Letter=s
してあります。
/l ja-JP
は省略してもいいみたいですが、合わせた方がすんなり起動する様です。
enum を見てみると
enum を見ていると、多分こういうことなんだろうなと思います。
- UEFIファームウェアが
/EFI
を探す - UEFIが登録した
*.EFI
を起動する .EFI
がブートマネージャである。- ブートマネージャはマルチブート設定を読み出す
- C:にWindowsのブートローダーがが登録されている。
.EFI
がC:\
からブートローダーを起動する- ブートローダーが C:\Windowsを起動する
個人的に設定を見て解釈しただけで、公式マニュアルを読んでないので間違ってるかもしれません。
よく見かける次のコマンド
このコマンドだとEFIブートになるかならないか、運です。
bcdboot C:\Windows /l ja-jp bootrec /rebuildbcd
リカバリ用USBメモリ起動する際にUEFIブートしていればこれでいいとおもうけど、うっかりCSMでMBRからブートしていたらUEFIブートにはならないよね。bcdbootはEFIだし、rebuilbcdの前にEFIパーティションの状態がわからないことには辛い。
次のfixboot関連のコマンドも見かけるけど、EFIパーティションの有無で変わるよね。
bootrec /Rebuildbcd bootrec /fixboot
BCDが壊れていたばあい。RebuidBCDでマイクロソフトのEFIパーティションを修復できていいけど、/fixbootはどれくらい効果があるかはわからないCドライブどこだよって思う。
いまどきUEFI必須でGPTでTPM必須なWindowsでMBRの記事を使うこともないと思うんだけどさ。リカバリに課金するのも癪だよね。
ブートセクタの記述
ブートセクタで番号指定して起動していたMBRはGPT+UEFIでは使いません。
GPT関連でブートセクタと書いてたらその人の記事は怪しいと思う