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を追加しても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 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/Windows11のディスク管理スタイルを「MBR」から「GPT」形式に変換する際に利用す…
パーティションサイズは拡大縮小が可能ですが、回復パーティションが間にあるとできない時があるようです。
また、Windowsを新規にインストールした場合、
システム > 回復 > OS
といった形のパーティション構成になるようですが、私の場合
システム&OS > 回復
という構成になっているようでした。
試しに一度、回復パーティションを別ディスクに移動させ、戻してみる。 どうせ仮想マシンなのだし と、バックアップをとった上で、回復パーティションを削除し、現在のOSディスクを拡張した上で、回復パーティションを再度復旧させてみることにしました。
【Windows】回復パーティションを移動する方法 を参考に、まずは回復パーティションの内容を別のディスクにバックアップします
まずは一度電源を切って、仮想マシンにハードディスクを追加します。
TPMと同じように、「追加」からハードディスクを追加し、電源を入れます。
電源を入れたら、「PC」>「管理」>「ディスクの管理」から新規のディスクに対して、ドライブ文字を設定します。今回は、「D」にしました。
また、16GBのUSBディスクを装着してこちらには別途回復ドライブ を作成しておくことにします。
ハードウェア障害などの大きな問題が発生した場合に備えて、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でディスクとパーティション状況を確認
新規に追加したハードディスクをEドライブとしてマウント したとしましょう。
その場合、まずは先ほどの回復パーティションの中身をDからEにコピーした上、Dドライブの中身を消します。
その後、Cドライブを(ディスクの残り容量を2GBほど残して)拡張した後、残りの2GBに回復パーティションを戻します。
もしかしたら、ここで戻す必要はなかったかもしれません。(その時は思いつきませんでした。)
回復パーティションの中身をコピーするためのディレクトリを作る。 回復パーティションには不可視フォルダRecovery\WindowsRE
があるようです。
以下を実行することでDドライブにマウントした回復パーティションの中身を確認することができます。
全てのファイルをコピーしても良いのですが、全ては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 の章にありました。
UEFI/GPT-based hard drive partitions
回復パーティションのIDのようですが、そもそもこのページは、「UEFI/GPT-based hard drive partitions」です。
つまり、de94bba4-06d1-4d40-a16a-bfd50179d6acは、UFFIモードの時の回復パーティションのIDなのです
この先、UEFI/GPTに変更したい のであってまだこの時点では、BIOS/MBRの状態 です。
MSのサイトの左側のツリーからBIOS(MBR)の項目を探し、回復パーティションに関する記載がないか を確かめます。
BIOS/MBR-based hard drive partitions
ありますね。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」が発生してしまいました。
さて、再度検索です。幸いこちらも同じような事例 が見つかりました。
今の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 { 6 ebf3b22 - bfce - 11e1 - a005 - d264bd4354c5 }
device ramdisk = [ unknown ] \Recovery \6 ebf3b22 - bfce - 11e1 - a005 - d264bd4354c5 \Winre . wim ,{ 6 ebf3b23 - bfce - 11e1 - a005 - d264bd4354c5 }
path \windows \system32 \winload . exe
description Windows Recovery Environment
inherit { bootloadersettings }
osdevice ramdisk = [ unknown ] \Recovery \6 ebf3b22 - bfce - 11e1 - a005 - d264bd4354c5 \Winre . wim ,{ 6 ebf3b23 - bfce - 11e1 - a005 - d264bd4354c5 }
systemroot \windows
nx OptIn
winpe Yes
このdevice ramdisk=[unknown](以下略
が問題でした。しかも度重なるOSのアップデートが原因か、回復パーティションの移動が原因か、 device unknown
なものが5つも6つも出てくる始末・・・
手順に従い、device unknown
なidentifier
を{}
ごと値を控え、一つ一つ、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
ReAgent.xmlはさっき見ましたね。回復パーティションです。回復パーティションに何かあったのかもしれません。
これに関しては、こちらの記事 を参考にしました。
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 /disable
とreagentc /enable
を実行して、回復パーティションを再認識させるだけのようです。
ただ、どうにもreagentc /info
を実行すると、失敗していたので 念の為OSを再起動した後に再度実行することにしました。
OS再起動ではなくて仮想マシンの電源を切り、BIOSをUEFIに変更する さて、これで次回の起動時には、BIOSブートではなくUEFIになっているはずです。
そこでProxmoxの画面で当該のVMのハードウェアをBIOS(seaBIOS)からOVMF(UEFI)に変更します。
UEFIに変更する際にEFIディスクが必要、といわれるので、そちらも追加します。
追加したのち、起動を確認して、reagentc /disable
とreagentc /enable
を実行して「PC正常ツール(Windows11インストール要件確認)」を実行してみると・・・
Windows11がインストールできます!
無事、Windows11をインストールすることができる条件をクリアすることができました!