目次

TPMを導入し、MBR2GPTを実行し、Windows10の仮想マシンをWindows11にするまでに行ったこと [Proxmox]


Proxmoxを導入して、TPMを追加しさえすれば、Windows11になると思っていました。

実際にはBIOSからUEFIに変更するために、MBR2GPTを実行する必要がありました。

その過程で、Cannot find room for the EFI system partition. や、Cannot find OS partition(s) for disk 0 などのエラーに遭遇し、2日程悩む期間が発生したので必要となった対象方法をまとめたいと思います。

Windowsの仮想マシンにTPMを追加する

これはとても簡単でした。ゲストVMの「ハードウェア」に「TPMの状態」を取り付けるだけでした。

TPMの追加

TPMの追加

TPMを追加してもWindows11に対応していないと言われる

正直これは予想外でした。TPMだけが問題なのだと思っていました。

TPMを追加してもNGな理由としては、「UEFIが有効でない」とのことでした。心当たりあります。前回設定したハードウェアの中に、確かにあったんですよね「BIOS」の項目。

BIOSを、SeaBIOSからOVMF(UEFI)にしても起動ドライブがないと怒られるだけだったんでスルーしていたのですが、そうか必要かぁ・・・

ここ10年くらい自作でPCを構築していなかったとはいえ、10年ほど前はギリギリUEFIがでてきていました。

あまり意識していませんでしたが、今の仮想マシンはBIOSベースで構築していた模様で、それをそのまま移行してきた訳なので、起動ディスクであるマスター・ブート・レコード(MBR)をGUID パーティション テーブル(GPT)に変換しないといけない訳です。

なんだかんだでこのWindowsの仮想マシン、

  • IntelのMacbookにBootcampでWindows7をインストール
  • P2VでESXiに移設
  • Windows7からWindows10に移設
  • ESXiからOVF形式でProxmoxに移設
  • Windows10からWindows11に移設

というなかなかの変遷だったはずです。何年使っているんだろう。ハードが交換されて続けているとはいえ、よく動いているな・・。

これが原因か、BIOSからUEFIに変換するためのツールである MBR2GPT の実行になかなかに難儀しましました。

Windowsの起動をBIOSからUEFIに変更する

まずは「Windows BIOS UEFI 変更」とかで適当に検索して調べました。

Windows 10 MBR2GPTでブートセクタをMBRからGPTに変換してレガシBIOSをUEFIモードに変換する

最新のWindows PCでは、ブートモード(Boot Mode)としてUEFIがサポートしています。更に2TB以上のハードディスクならGPT(GUID Partition Table)形式で効率よいWindows環境の構築ができます。しかし最新のPCでもBIOS(レガシBIOS)を使用したりする場合があります。従来はこれをUEFIに変換する場合、ハード ディスクのパーティションを再分割し、ファームウェアを再構成する必要がありました。ところがその過程で、度々ハードディスク(HDD)のデータを移行したり、削除したりする面倒な作業を行わえなければならない場合がありました

「ディスクユーティリティ」から、システム起動ディスクがどこのドライブに入っているかを確認します。

コマンドプロンプトを実行し

1
2
3
4
diskpart

list disk
list partition

こちらでWindows(通常Cドライブ)ディスクがどこにあるかを確認します。 自分の構成では、Cドライブしかないのでディスクは1つでした。 そのため、ディスクは0を選択し、mbr2gptコマンドを利用してまずはUEFIへの変換ができるかのチェック(validate)をします。

オプションのallowfullosは自作PCなどの場合に必須のようです。

1
mbr2gpt /validate /disk:0 /allowfullos

バリデーションはOKでした。

確認が取れ、validateが通ったら、

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
mbr2gpt /convert /disk:0 /allowfullow

MBR2GPT will now attempt to convert the default book disk.
If conversion is successful the disk can only be booted in GPT mode.
These changes cannot be undone!

MBR2GPT: Attempting to convert disk 0
MBR2GPT: Retrieving layout of disk
MBR2GPT: Validating layout, disk sector size is: 512 bytes
MBR2GPT: Trying to shrink the OS partition
Cannot find room for the EFI system partition.
MBR2GPT: Conversion failed

mbr2gpt /convert /disk:0 /allowfullowを実行して変換は終了ですが・・・失敗しました。 エラーの内容は、**Cannot find room for the EFI system partition.**です。

なんでや、バリデーションチェック通ったやんけ!

原因は回復ディスクとMBRが同一のディスクに存在するから?

再度ググっていると、回復パーティションとMBRが同一のディスクに存在するとき、かつ、なんらかの要因で回復パーティションがパーティション上、システムドライブの後ろにある場合に発生する、といった情報を見つけました。

Windows10の[mbr2gpt.exe]で変換時に[Cannot find room for the EFI system partition.]表示される場合の対処法

Windows10/Windows11のディスク管理スタイルを「MBR」から「GPT」形式に変換する際に利用す…

パーティションサイズは拡大縮小が可能ですが、回復パーティションが間にあるとできない時があるようです。

また、Windowsを新規にインストールした場合、

システム > 回復 > OS

といった形のパーティション構成になるようですが、私の場合

システム&OS > 回復

という構成になっているようでした。

試しに一度、回復パーティションを別ディスクに移動させ、戻してみる。

どうせ仮想マシンなのだしと、バックアップをとった上で、回復パーティションを削除し、現在のOSディスクを拡張した上で、回復パーティションを再度復旧させてみることにしました。

【Windows】回復パーティションを移動する方法を参考に、まずは回復パーティションの内容を別のディスクにバックアップします

まずは一度電源を切って、仮想マシンにハードディスクを追加します。

TPMと同じように、「追加」からハードディスクを追加し、電源を入れます。

電源を入れたら、「PC」>「管理」>「ディスクの管理」から新規のディスクに対して、ドライブ文字を設定します。今回は、「D」にしました。

また、16GBのUSBディスクを装着してこちらには別途回復ドライブを作成しておくことにします。

回復ドライブを作成する - Microsoft サポート

ハードウェア障害などの大きな問題が発生した場合に備えて、Windows 10またはWindows 11を再インストールできるように復旧ドライブを作成します。

コマンドプロンプトを管理者モードで立ち上げ、diskpartを起動します。

回復パーティションを調べます。回復パーティションはシステムディスクと同じディスクにあったとしましょう。

以下のようになります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#diskpartを起動する。
diskpart

#ディスク一覧を出力
list disk

#ディスク 0 を選択
select disk 0 

#選択中のディスク(ディスク0)に対してパーティション出力
list partition 

#(ディスク0の)回復パーティションである2を選択
select partition 2

#(ディスク0の)パーティション2に対して、Dドライブでマウント
assign letter=D
diskpartでディスクとパーティション状況を確認

diskpartでディスクとパーティション状況を確認

新規に追加したハードディスクをEドライブとしてマウントしたとしましょう。

その場合、まずは先ほどの回復パーティションの中身をDからEにコピーした上、Dドライブの中身を消します。

その後、Cドライブを(ディスクの残り容量を2GBほど残して)拡張した後、残りの2GBに回復パーティションを戻します。

もしかしたら、ここで戻す必要はなかったかもしれません。(その時は思いつきませんでした。)

回復パーティションの中身をコピーするためのディレクトリを作る。

回復パーティションには不可視フォルダRecovery\WindowsREがあるようです。 以下を実行することでDドライブにマウントした回復パーティションの中身を確認することができます。

1
dir D: /a:h /b /s

全てのファイルをコピーしても良いのですが、全てはRecovery\WindowsREにまとまっているため、このディレクトリの中身をコピーすることにします。

まずは、コピー先のEドライブに同じディレクトリを作ります

1
mkdir E:¥Recovery¥WindowsRE

回復パーティションの中身のコピー

xcopyというコマンドを利用してコピーします。隠しファイルも全てコピーするための/hオプションもつけます

1
2
3
4
5
6
7
8
9
# DドライブのRecovery¥WindowsREからEドライブのRecovery¥WindowsREにコピーする
# /hオプションをつけ、隠しファイルもシステムファイルもコピーする

C:\Windows\system32> xcopy /h D:¥Recovery¥WindowsRE E:¥Recovery¥WindowsRE

E:\Recovery\WindowsRE\boot.sdi
E:\Recovery\WindowsRE\ReAgent.xml
E:\Recovery\WindowsRE\Winre.wim
3 個のファイルをコピーしました

古い回復パーティションを削除する

回復パーティションはシステム的なセーフガードがかかっているのか、一度解除をしないといけないそうです。

解除をするために以下を実行します

1
2
C:\Windows\system32>reagentc /disable
REAGENTC.EXE: 操作は成功しました。

解除後、delete partition overrideを利用して古い回復パーティションを削除します。

ここで誤った場合、別のパーティションを消しかねないため、注意します。 以下は、ディスク0のパーティション2を削除する場合の方法です。

1
2
3
4
5
C:\Windows\system32>diskpart

DISKPART> select disk 0
DISKPART> select partition 2
DISKPART> delete partition override

Cドライブを拡張し、パーティションを整理し再度、同じディスクに回復パーティションを持ってくる

ここで一旦Cドライブのハードディスクを拡張しました。

前述の通り、回復パーティションがあるとディスクが縮小できても拡張ができませんでしたが、回復パーティションがなくなったことで拡張できるようになっています。 (正確には同じディスクの中で「拡張したい」パーティションの後ろに別パーティションが存在しないため)

拡張時に、回復パーティションの再移設用のディスクとして2GBほど残しました。 これをFドライブとして再度マウントしておきます。

先ほど同様、xcopyを利用してEドライブの回復パーティションのバックアップからFドライブに回復パーティションを持ってきます。

1
xcopy /h E:¥Recovery¥WindowsRE F:¥Recovery¥WindowsRE

Fドライブを再度回復パーティションとして設定

戻ってきたFドライブを回復パーティションとして設定します。

1
2
3
4
5
6
7
8
C:\Windows\system32> reagentc /setreimage /path F:¥Recovery¥WindowsRE

ディレクトリは次に設定されています: \\?\GLOBALROOT\device\harddisk0\partition2\Recovery\WindowsRE

REAGENTC.EXE: 操作は成功しました。

C:\Windows\system32>reagentc /enable
REAGENTC.EXE: 操作は成功しました。

マウント時に設定したE,Fのドライブレターを削除する

diskpartで当該のパーティションを選択してremoveします

1
2
3
4
C:\Windows\system32>diskpart

DISKPART> remove letter=F
DISKPART> remove letter=E

これでEやFでのマウントが外れるはずです。

回復パーティション用のIDを設定する

ここで少し詰まりました、多くのサイトではset id=de94bba4-06d1-4d40-a16a-bfd50179d6acを設定しているようですが、そんなIDはない、とエラーが戻ります。

そもそもset id=de94bba4-06d1-4d40-a16a-bfd50179d6acとはなんなのでしょうか。

答えはMSのサイトのRecovery tools partitionの章にありました。

回復パーティションのIDのようですが、そもそもこのページは、「UEFI/GPT-based hard drive partitions」です。

つまり、de94bba4-06d1-4d40-a16a-bfd50179d6acは、UFFIモードの時の回復パーティションのIDなのです

この先、UEFI/GPTに変更したいのであってまだこの時点では、BIOS/MBRの状態です。

MSのサイトの左側のツリーからBIOS(MBR)の項目を探し、回復パーティションに関する記載がないかを確かめます。

ありますね。set id=27だそうです

先ほどまでFとしてマウントしていた、ディスク0のパーティション2をdiskpartで選択してset id=27をします

1
2
3
4
5
C:\Windows\system32>diskpart

DISKPART> select disk 0
DISKPART> select partition 2
DISKPART> set id=27

これで回復パーティションとして認識されたはずです。

再度、MBR2GPTを試みるも、「Cannot find OS partition(s) for disk 0」がでてしまう。

さて、これでMBR2GPTで変換ができる・・・と思っていました。

試しにバリデーションチェックをしてみます。

1
C:\Windows\system32>mbr2gpt /validate /allowfullos

結果として「Cannot find OS partition(s) for disk 0」が発生してしまいました。

さて、再度検索です。幸いこちらも同じような事例が見つかりました。

MBR2GPTがようやくできた話(Cannot find OS partition(s) for disk 0エラー) - とある人の長いつぶやき

今のPCのCドラがあるディスクがMBRという古い形式でBIOSを使うものだったので、windows11を見据えてGPTというUEFIを使う今の形式に変換しようと思いました。 今はwindowsがMBR2GPTというものを用意してくれているのでそれのコマンドを打てば簡単!!!って感じに終わるはずだったのですが……そうもいかなかったので備忘録として残します。 OSをHDDからSSDへ換装した時のミス エラー文を検索しても何か違う 悪さをしていた回復パーティションと解決 今回のを簡単にまとめると?(これだけ見れば大丈夫) OSをHDDからSSDへ換装した時のミス 以前 CドライブをHDDからM.2S…

特に上記でも紹介されている

ページが見つかりませんでした

                </div>
            </div>
        </div>
        <div class="embed-footer">
            <a href="https://www.diskpart.com" target="_blank">
                <img src="https://www.google.com/s2/favicons?domain=www.diskpart.com" alt="" title="ページが見つかりませんでした" class="favicon">
                https://www.diskpart.com
            </a>
        </div>
    </div>
</div>

こちらの手順が参考になりました。

起動に必要となるディスクの状態に不正なものがあることが原因

結論からいうと、上記の手順で、私の場合は、OSがインストールされているディスクはCドライブとわかっていたので、以下のコマンドを実行しました。

1
C:\Windows\system32> bcdedit /store C:\boot\bcd /enum all

その結果出てきたのは、以下のような出力。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Windows ブート ローダー
--------------------------------
identifier              {6ebf3b22-bfce-11e1-a005-d264bd4354c5}
device                  ramdisk=[unknown]\Recovery\6ebf3b22-bfce-11e1-a005-d264bd4354c5\Winre.wim,{6ebf3b23-bfce-11e1-a005-d264bd4354c5}
path                    \windows\system32\winload.exe
description             Windows Recovery Environment
inherit                 {bootloadersettings}
osdevice                ramdisk=[unknown]\Recovery\6ebf3b22-bfce-11e1-a005-d264bd4354c5\Winre.wim,{6ebf3b23-bfce-11e1-a005-d264bd4354c5}
systemroot              \windows
nx                      OptIn
winpe                   Yes

このdevice ramdisk=[unknown](以下略が問題でした。しかも度重なるOSのアップデートが原因か、回復パーティションの移動が原因か、 device unknownなものが5つも6つも出てくる始末・・・

手順に従い、device unknownidentifier{}ごと値を控え、一つ一つ、bcdedit /store C:\boot\bcd /delete {6ebf3b22-(以下略)}といった形で実行していきます。

実行後、再度bcdedit /store C:\boot\bcd /enum allを実行し、device unknownなものが出てこないことを確認します。

cannot find OS partition for disk 0を解消させた後、再度、mbr2gptを実行

3度目の正直です。ようやく、成功しました。が・・・

Failed to updated ReAgent.xmlの文字が・・・orz

UEFIにはなったものの、Failed to updated ReAgent.xml

UEFIにはなったものの、Failed to updated ReAgent.xml

ReAgent.xmlはさっき見ましたね。回復パーティションです。回復パーティションに何かあったのかもしれません。

これに関しては、こちらの記事を参考にしました。

MBR2GPT Failed to Update ReAgent.xml on Windows 10? [Full Fix] - MiniTool Partition Wizard

Are you still troubled by the failed to update ReAgent.xml? How to fix the MBR2GPT error? This post analyzes the error and provides corresponding fixes.

なんのことはありません reagentc /disablereagentc /enableを実行して、回復パーティションを再認識させるだけのようです。

ただ、どうにもreagentc /infoを実行すると、失敗していたので念の為OSを再起動した後に再度実行することにしました。

OS再起動ではなくて仮想マシンの電源を切り、BIOSをUEFIに変更する

さて、これで次回の起動時には、BIOSブートではなくUEFIになっているはずです。

そこでProxmoxの画面で当該のVMのハードウェアをBIOS(seaBIOS)からOVMF(UEFI)に変更します。

UEFIに変更する際にEFIディスクが必要、といわれるので、そちらも追加します。

追加したのち、起動を確認して、reagentc /disablereagentc /enableを実行して「PC正常ツール(Windows11インストール要件確認)」を実行してみると・・・

Windows11がインストールできます!

Windows11がインストールできます!

無事、Windows11をインストールすることができる条件をクリアすることができました!