👌

Windowsで他のPCのブートを直す方法

2022/12/05に公開

windowsをガチャガチャいじっていたり、何らかの不具合を起こした場合は、
ブート領域からブートできなくなることがある。

このWindowsのブート領域の修正のためにWindowsPEを用意するのは
かなり手間なので、不具合が起きたPCのディスクを取り外して、
別のPCの外付けとして接続してターミナルからブートの修正を行う方がよい。

日本語で検索するとやたらdiskpartを使いたがるが、
powershellの方が安全かつ、知識としてそっちのほうがつぶしが効くのでこっちで覚えた方がよい。

また、diskaprtには後述するバグっぽい動きがある事と、未だにちゃんとメンテされているかちょっと不安なのがね...

ESP領域のマウント

ESPとはwindowsのEFIパーティションの事である。
BIOS, UTFIはここからwindowsのブートローダを呼び出して、
windowsがインストールされているNTFSパーティションから

diskpartでも、powershellでもmountみたいなコマンドを打たないので不思議に思えるが、
MS語では

  • ドライブレターを与える=マウントを行う
  • ドライブレターを削除する=アンマウントを行う

ということである。もうワケわかんねぇな...😇

ESPはパーティションとしてもボリュームとしてもマウントを行うことができる。
しかし、ボリュームでマウントしようとすると、
自分が今起動しているディスクのESPと他のPCのESPが混ざって表示されるため、分かりづらい。

よってパーティションから判定しよう。

diskaprtの場合

diskpartを立ち上げよう。
powershellで下記のようにコマンドを打てば立ち上がる。

diskpart

対話形式で始まると思うので、

以下のようにコマンドを打っていけばよい。

ディスク一覧の表示

list disk

ディスク的にどれか確認。
容量を見れば大体区別がつくと思われる。

ディスクを選択

select disk <DiskNum>

<DiskNum>のところは数字に置き換えて実行。

パーティション一覧の表示

list partition

選択したディスクのパーティション一覧を出力して、他のPCのブート領域を探す。

パーティションの選択

select partition <PartitionNum>

<PartitionNum>のところは数字に置き換えて実行。

ドライブレターの割り当て

assign letter=x

diskpart終了

exit

ちなみにdiskpartでマウントしてもpwshには反映されません...
ただ、powershellでマウントするとdiskpartにも反映されます。
diskpartのバグっぽい動きいやん...😇

エクスプローラーには反映されるのとdiskpartに入りなおしたらちゃんと反映されます。

powershellでやる場合


# ディスク的にどれか確認。
# 容量を見れば大体区別がつくと思われる。
Get-Disk 

# ディスク番号が2だった時。
$DiskNum = 2
# パーティション番号を確認。
Get-disk $DiskNum | Get-partition

# パーティション番号が1だった場合。
$PartitionNum = 1

# ESP領域に割り当てたいドライブレターを与える。
$BootDriveLetter = "X"

# ドライブレター割り当て
Get-Partition -DiskNumber $DiskNum -PartitionNumber $PartitionNum |
    Set-Partition -NewDriveLetter $BootDriveLetter

ESPから起動するように修正

powershellから下記のように実行する


# WindowsDriveLetterはブート領域を修正したいディスクのWindowsがインストールされているドライブレター
# 今現在動いているwindowsから見たドライブレターになるのでCドライブ以外の場所にマウントされているはず。
$WindowsDriveLetter = "H"
$BootDriveLetter = "X"

# 他のPCのブート領域を修正
Start-Process "${WindowsDriveLetter}:\Windows\System32\bcdboot.exe" `
    -ArgumentList "${WindowsDriveLetter}:\Windows",/s,"${BootDriveLetter}:",/f,UEFI `
    -Confirm `
    -Wait

後片付け

EFPのアンマウントを行う。

diskpartの場合

diskpartで下記のように対話形式で実行。
ドライブレターが与えられたパーティションを選択して、
remove letterを実行すればよい。

diskpart
list disk
select disk <DiskNum>
select partition <PartitionNum>
remove letter=X

powershellの場合

Get-Partition -DiskNumber $DiskNum -PartitionNumber $PartitionNum |
    Remove-PartitionAccessPath -accesspath "${BootDriveLetter}:"

まとめ

powershellのほうが簡単かつ安全に触れる事が分かったと思う。
diskpartは後方互換のためにしばらくは残されるだろうが、今後は
WindowsPEで使うとかそれぐらいになると思う。
現時点ではdiskpartは使いづらく、pwshより危険なのでdiskpartを使うメリットははっきり言ってない。

Discussion