もやし日誌

日記のようなもの

Windows10のUEFIブートローダーを修復してみた

先日Windows10 Pro x64を再インストールしたところ何故かUEFIブートローダー(Windows Boot Manager)がLinuxを入れている方のSSDに入ってしまい、それを取り外した際にWindowsが起動しなくなったのでUbuntuのLiveDVDとWindowsのインストールメディアを使って修復してみたのでメモ。

構成

f:id:kazuki09:20160703224758p:plain
SSD1にはWindows、SSD2にはArch Linuxという構成で運用していたが、SSD1の中身を全て削除した上でパーティショニングを全てWindowsインストーラーに任せてWindowsのインストールをしたところSSD1にはEFI領域が作られず勝手にSSD2の方のEFI領域にブートローダーが入ってしまった模様。

パーティションを弄る

Windowsのdiskpartコマンドがあまりにも使いづらいので今回はUbuntuのLiveDVD上のGPartedを使ってパーティションを操作します。
f:id:kazuki09:20160703225601p:plain
最終的には上記のようなパーティション構成にしたいので

  1. Windowsが入っている領域を100MB縮小し、右に寄せる
  2. 元々あった16MBのMSRパーティション(Microsoft予約パーティション)を消す
  3. 100MBのFAT32パーティション(EFIパーティション)を作り、boot,espフラグを付ける
  4. EFIパーティションの後ろに16MB分のパーティションを作成し、clearedでフォーマットし、msftresフラグを付ける

f:id:kazuki09:20160703191828j:plain
f:id:kazuki09:20160703191816j:plain
作業完了後にはこんな感じになるはずです。
パーティションの縮小と移動に1時間程要するのでお茶でも飲みながらのんびりやりましょう。

UEFIファームウェアからWindows Boot Managerを消す

UbuntuのLiveDVDのターミナルを立ち上げ、root権限で

[root@HogeHost ~]# efibootmgr
BootCurrent: 0002
Timeout: 2 seconds
BootOrder: 0002,0000,0017,0001,0018,001A,001B,001C,0019,0021
Boot0000* Windows Boot Manager
Boot0001 grub
Boot0002* rEFInd Boot Manager
Boot0010 Setup
Boot0011 Boot Menu
Boot0012 Diagnostic Splash Screen
Boot0013 Lenovo Diagnostics
Boot0014 Startup Interrupt Menu
Boot0015 Rescue and Recovery
Boot0016 MEBx Hot Key
Boot0017* USB CD
Boot0018 USB FDD
Boot0019* NVMe0
Boot001A* ATA HDD0
Boot001B* USB HDD
Boot001C* PCI LAN
Boot001D* IDER BOOT CDROM
Boot001E* IDER BOOT Floppy
Boot001F* ATA HDD
Boot0020* ATAPI CD
Boot0021* PCI LAN

efibootmgr -B -b 0000

Windows Boot ManagerはBoot0000に割り当てられているみたいなのでこれを削除します。
EFIパーティションに残骸が残っていると勝手に再登録されることがあるので、Microsoft関連のものは削除しておきます。
(適当にマウントしてEFI/Boot/bootx64.efiEFI/Microsoft/*を削除)

Windowsインストールメディアを使ってブートローダーを再構築する

f:id:kazuki09:20160704001913j:plain
Windowsインストーラーを起動後、"コンピューターを修復する"からコマンドプロンプトを起動します。

X:\Sources>diskpart
DISKPART>list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン          2794 GB      0 B        *
  ディスク 1    オンライン           931 GB  5120 KB   *
  ディスク 2    オンライン           232 GB      0 B        *
  ディスク 3    オンライン           111 GB      0 B        *

Windowsが入ってるディスクを選択します。ここでは例として2を選択します。

DISKPART>select disk 2

ディスク選択後、パーティションのリストを出力しドライブレターを割り当てます。

DISKPART>list part

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    システム               100 MB  1024 KB
  Partition 3    予約                  16 MB   101 MB
  Partition 2    プライマリ              232 GB   117 MB

この場合だと1番目のパーティションEFIパーティション、2番目のパーティションWindowsが入っているパーティションになります。

DISKPART>select part 1
DISKPART>assign letter=S
DISKPART>select part 2
DISKPART>assign letter=C

CドライブにするとわかりやすいのでCに割り当ててますが、既に割り当てられている場合もあるでしょう。その時は、

DISKPART>list vol
DISKPART>select vol 4
DISKPART>remove letter=C

のようにドライブレターの割り当てを解除すればおkです。もしくは別の割り当てられていないドライブレターに割り当てましょう。
ドライブレターを割り当てたらexitでdiskpartを抜けます。

X:\Sources>bcdboot C:\Windows /s S: /f UEFI

最後にbcdbootコマンドでブートローダーのインストールUEFIファームウェアへの登録をします。
BCDboot のコマンド ライン オプション
コマンドライン引数についてはMSDNの方参照お願いします。
f:id:kazuki09:20160703200658j:plain
問題無さそうならコマンドプロンプトを閉じてPCを再起動しましょう。