Windowsで他のPCのブートを直す方法
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