仕事絡みで VMware Server 1.0 あたりからずっとお世話になってきた VMware 製品ですが、この度 Broadcom 社に買収されたことにより永続ライセンス廃止→サブスクリプション化することを決定したようで、その結果無償版の ESXi が使えなくなる!と界隈で大騒ぎとなりました。
VMware by Broadcom : 製品ラインアップとライセンスモデルを大幅に簡素化
CentOS の Stream 化(事実上のOSS版廃止?)の混乱と同じく、”おうちデータセンター“勢だけではなく、仮想アプライアンスなど検証用のイメージを VMware の *.ova ファイルで提供してきた各メーカーさん方にも激震が走っていることでしょう(ハナホジ
というわけで、いつまでも VMware vSphere なんだか ESXi なんだかにしがみついていられなくなりそうなので、今度こそ真剣に Proxmox 環境への移行を検証することにしました。
おおまか手順
- Windows10 VM の SCSI コントローラを LSI logic SAS -> VMware Paravirtual に変更
- MBR2GPTt.exe を使ってファームを BIOS -> UEFI に変換
- ovftool を使って Windows10 の VM を win10.ova にエクスポート
- エクスポートした ova ファイルを Proxmox(以降PVE)にコピー
- PVE 上で ova ファイルを展開しインポート
- VM を起動する前に BIOS を UEFI に、SCSI コントローラを pvscsi に変更
- windows10 VM の起動確認
SCSI コントローラの変更
デフォルトの「LSI logic SAS」ドライブにインストールされた Windows VMを PVE にコンバートし、(多くのサイトで説明されているように) SCSI コントローラを「pvscsi」に変更したところでドライブを認識できずブルースクリーン(BSOD)になってしまう。
なんでやねん!ネットで調べた通りにしたのに。ヽ(`Д´)ノ
これは Windows が VMware Paravirtual のドライバを持っていないことが原因なので、仮想マシンの設定を編集するだけでは回復することができない。
かと言って PVE 上で「LSI logic SAS」に対応する他のコントローラを選択すればいいじゃないか、と思うところですが残念ながらうまくいかず。(MegaRAID SAS を選択するとドライブは見えたがブートできず、やはり BSOD になった。)
ならば、PVE にコンバートする前に VMware Paravirtul に変換できないかと調べたところ、意外に簡単な方法でアダプタ変換ができることがわかった。
参考: https://kb.vmware.com/s/article/1010398?lang=ja
- VM 編集画面を開き、「その他のデバイスの追加」→「SCSI コントローラ」を追加する。
- 「新規 SCSI コントローラ 」ができたら、「VMware Paravirtual」に変更する。
- 「ハードディスクの追加」→「新規ハードディスク」でダミーのディスクを追加する。後で削除するので容量は最小で良い。(ここでは 1MBで作成)
- 作成した「新規ハードディスク」の設定画面を開き、「コントローラの場所」に「SCSI コントローラ 1」(新しく追加したコントローラ)を選択し、保存する。
- VM を起動し、追加したドライブが認識されていることを確認する。
※ エクスプローラには表示されないので、「ディスクの管理」を開いて確認。
※ ディスクの初期化を求められるが、何もせずに閉じて良い。 - VM を停止し、追加したダミーのディスクを削除してから SCSI コントローラ 1 を削除。
- 既存の SCSIコントローラ 0 を LSI logic SAS から VMware Paravirtual に変更して起動。
これで PVE へコンバートした後に SCSI コントローラ に「pvscsi」を選択して起動できるようになりました。
起動ファームウェア変更(BIOS->EFI)
ぶっちゃけ、ここが一番面倒くさかった。そもそも vsphere 上で動かしている Windows10の VM を、再インストールすることなく移行し、かつ Windows11 にアップグレードしたいというのが目的ですが、マシンスペック以上にハードルが高いのが TPM 2.0 対応と セキュアブートへの対応。
セキュアブート?何それ。
いずれにせよ、BIOS + MBR でインストールされた Windows を、UEFI + GPT に変更するためにドライブに手を加えないといけないようだ。幸い、windows 標準の MBT2GPT というツールをすれば変換できるようなので、早速試してみる。
手順はほぼ下記のサイトと同じ…で苦戦しました。原因は、
- システムドライブのパーティション数が4個以上ある
- 回復パーティションを削除したら、WinREが無くなった
- そもそもなんかディスクエラー出てない?
ハマった挙げ句、都度バックアップを取りながらひとつひとつ解決することに。
まず、diskpart を使って対象ディスクが「ディスク 0」であることを確認。
C:\WINDOWS\system32>diskpart Microsoft DiskPart バージョン 10.0.19041.3636 Copyright (C) Microsoft Corporation. コンピューター: WIN10-VM DISKPART> list disk ディスク 状態 サイズ 空き ダイナ GPT ### ミック ------------ ------------- ------- ------- --- --- ディスク 0 オンライン 100 GB 0 B DISKPART> exit
その辺のサイトに書いてある通り、「mbr2gpt.exe /validate /対象ディスク」して GPT への変更が可能かどうか、検証します。
C:\WINDOWS\system32>mbr2gpt /validate /disk:0 ERROR: MBR2GPT can only be used from the Windows Preinstallation Environment. Use /allowFullOS to override.
「/allowFullOS」を使えと怒られますので、言われたとおりにします。
C:\WINDOWS\system32>mbr2gpt /validate /disk:0 /allowFullOS MBR2GPT: Attempting to validate disk 0 MBR2GPT: Retrieving layout of disk MBR2GPT: Validating layout, disk sector size is: 512 bytes Disk layout validation failed for disk 0
出ました、「Disk layout validation failed for disk 0」エラー。
これはシステムドライブ(C:\があるディスク)のパーティションが 3個以内という要件を満たしていないと思われます。 確かに「ディスクの管理」で確認すると、4個のパーティションに分かれています。
なぜか回復パーティションが二つありますので、古い方(回復パーティション4?)を削除します。こちらは通常の操作ではパーティションを削除することができませんので、diskpart を使用して削除します。
C:\WINDOWS\system32>diskpart Microsoft DiskPart バージョン 10.0.19041.3636 Copyright (C) Microsoft Corporation. コンピューター: WIN10-VM DISKPART> list disk ディスク 状態 サイズ 空き ダイナ GPT ### ミック ------------ ------------- ------- ------- --- --- ディスク 0 オンライン 100 GB 0 B DISKPART> select disk 0 ディスク 0 が選択されました。 DISKPART> list partition Partition ### Type Size Offset ------------- ------------------ ------- ------- Partition 1 プライマリ 500 MB 1024 KB Partition 2 プライマリ 98 GB 501 MB Partition 3 回復 557 MB 98 GB Partition 4 回復 888 MB 99 GB DISKPART> DISKPART> DISKPART> select partition 4 パーティション 4 が選択されました。 DISKPART> delete partition override DiskPart は選択されたパーティションを正常に削除しました。 DISKPART> list partition Partition ### Type Size Offset ------------- ------------------ ------- ------- Partition 1 プライマリ 500 MB 1024 KB Partition 2 プライマリ 98 GB 501 MB Partition 3 回復 557 MB 98 GB DISKPART> exit DiskPart を終了しています...
これでシステムドライブのパーティション数は3個になりましたので、改めて mbr2gpt コマンドを実施してみます。
C:\WINDOWS\system32>mbr2gpt /validate /disk:0 /allowFullOS MBR2GPT: Attempting to validate disk 0 MBR2GPT: Retrieving layout of disk MBR2GPT: Validating layout, disk sector size is: 512 bytes Cannot find OS partition(s) for disk 0 C:\WINDOWS\system32>
今度は「Cannot find OS partition(s) for disk 0」エラー。出てきたメッセージで検索すると、どうやら回復環境の不整合やらが原因で発生するようでいろいろな情報が見つかります。
※ いろんなサイトで A◯MEI だの E◯seUS みたいなソフトを推してますが、ことごとく中華製ソフトなので…信頼するかどうかは貴方次第。
というわけで(?)、Windows のインストールディスクから winRE.wim をコピーすれば良さそうです。手順については こちら で説明されていますが、インストールディスクのイメージ(windows10.iso)を右クリック→「マウント」します。当方の環境では (F:) にマウントされました。
f:\sources\install.esd があることが確認できました。先ほどのサイトを参考に、コマンドラインでインデックスを確認します。コマンドプロンプトを「管理者として実行」し、Dism コマンドを実行します。
C:\WINDOWS\system32>Dism /Get-wiminfo /wimfile:"f:\sources\install.esd" 展開イメージのサービスと管理ツール バージョン: 10.0.19041.3636 イメージの詳細: f:\sources\install.esd インデックス: 1 名前: Windows 10 Home 説明: Windows 10 Home サイズ: 15,723,293,680 バイト インデックス: 2 名前: Windows 10 Education 説明: Windows 10 Education サイズ: 16,070,767,260 バイト インデックス: 3 名前: Windows 10 Pro 説明: Windows 10 Pro サイズ: 16,065,427,911 バイト 操作は正常に完了しました。 C:\WINDOWS\system32>
移行対象の VM は Windows 10 Pro なので、インデックス:3 であることがわかります。
それでは、f:\sources\install.esd を 7-zipで開きます。
F:\sources\install.esd\3\Windows\System32\Recovery\ にWinre.wim がありました。これを「コピー」ボタンを使って任意の場所に保存します。
保存した Winre.wim を、Windows VM の c:\Windows\System32\Recovery\ にコピーし、winre機能の再起動を行います。
C:\WINDOWS\system32>reagentc /disable REAGENTC.EXE: Windows RE は既に無効です。 C:\WINDOWS\system32>reagentc /enable REAGENTC.EXE: 操作は成功しました。
それでは、再度 mbr2gpt コマンドを試してみます。
C:\WINDOWS\system32>mbr2gpt /validate /disk:0 /allowFullOS MBR2GPT: Attempting to validate disk 0 MBR2GPT: Retrieving layout of disk MBR2GPT: Validating layout, disk sector size is: 512 bytes MBR2GPT: Validation completed successfully C:\WINDOWS\system32>
validate(検証) はうまくいったようです。/validate を /convert に変えて GPT への変換を実行します。
C:\WINDOWS\system32>mbr2gpt /convert /disk:0 /allowFullOS MBR2GPT will now attempt to convert disk 0. 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 MBR2GPT: Creating the EFI system partition MBR2GPT: Installing the new boot files MBR2GPT: Performing the layout conversion MBR2GPT: Migrating default boot entry MBR2GPT: Adding recovery boot entry MBR2GPT: Fixing drive letter mapping MBR2GPT: Conversion completed successfully Call WinReReapir to repair WinRE MBR2GPT: Failed to update ReAgent.xml, please try to manually disable and enable WinRE. MBR2GPT: Before the new system can boot properly you need to switch the firmware to boot to UEFI mode! C:\WINDOWS\system32>
「Failed」の文字にドキっとしますが、この時点ではまだ BIOS モードで起動しておりますので WinRE の構成変更が完了できない、ということだと思われます。一度 VM を停止し、「起動オプション」→「ファームウェア」を「EFI」に変更して起動しなおします。
なんだかうまく行ったようなうまく行っていないような…とりあえずは正常起動できているので問題なしとしています。WinRE を再構成した影響なのか、「システムで予約済み (D:)」ができていたり、回復ドライブが「557MB」しかなかったり何かおかしいです…。
diskpart で見るかぎり回復パーティションであることは間違いなさそうですが、不要なので (D:) と共に削除します。
C:\WINDOWS\system32>diskpart Microsoft DiskPart バージョン 10.0.19041.3636 Copyright (C) Microsoft Corporation. コンピューター: WIN10-VM DISKPART> sel di 0 Microsoft DiskPart バージョン 10.0.19041.3636 DISK - ディスクにフォーカスを移動します。例: SELECT DISK PARTITION - パーティションにフォーカスを移動します。例: SELECT PARTITION VOLUME - ボリュームにフォーカスを移動します。例: SELECT VOLUME VDISK - 仮想ディスクにフォーカスを移動します。たとえば、SELECT VDISK と指定します。 DISKPART> sel disk 0 ディスク 0 が選択されました。 DISKPART> list part Partition ### Type Size Offset ------------- ------------------ ------- ------- Partition 1 プライマリ 500 MB 1024 KB Partition 2 プライマリ 98 GB 501 MB Partition 3 システム 100 MB 98 GB Partition 4 回復 557 MB 98 GB DISKPART> sel part 4 パーティション 4 が選択されました。 DISKPART> delete part override DiskPart は選択されたパーティションを正常に削除しました。 DISKPART> list part Partition ### Type Size Offset ------------- ------------------ ------- ------- Partition 1 プライマリ 500 MB 1024 KB Partition 2 プライマリ 98 GB 501 MB Partition 3 システム 100 MB 98 GB DISKPART> sel part 1 パーティション 1 が選択されました。 DISKPART> delete part override DiskPart は選択されたパーティションを正常に削除しました。 DISKPART> DISKPART> exit DiskPart を終了しています... C:\WINDOWS\system32>reagentc /disable REAGENTC.EXE: 操作は成功しました。 C:\WINDOWS\system32>reagentc /enable REAGENTC.EXE: 操作は成功しました。 C:\WINDOWS\system32>
ova エクスポート
※ エクスポートする前に、対象の VM が停止されていること、スナップショット作成されていないことを確認します。また VMware Tools がインストールされている場合は、proxmox へ移行する前にアンインストールしておきましょう。
Windows のように仮想ディスクが大きな VM は、Web コンソールからのエクスポートに失敗することがあるので、ovftool を導入してコマンドラインからエクスポートを実施します。ovftool の導入手順については公式含め参考サイトがたくさんあるので割愛します。
VM を OVF にエクスポートするには、以下のフォーマットで ovftool.exe を実行します。
ovftool.exe vi://ログインユーザ名:パスワード@ESXiのアドレス/対象のVM名 ファイル名
以下の情報で VM を OVF エクスポートする例
VM名 | win10-vm |
ovftoolのインストール場所 | c:\ovftool |
esxi のログインユーザ名 | root |
esxi のログインパスワード | password |
esxi のアドレス | 192.168.1.254 |
エクスポート先 | e:\ |
c:\ovftool\ovftool.exe vi://root:password@192.168.1.254/win10-vm e:\
e:\ に 4つほどファイルが出力されますので、これを リムーバブルディスクや NAS ストレージを使って proxmox のシェルで操作できる場所に配置します。
- *.mf … ハッシュファイル
- *.ovf … 仮想サーバの構成情報ファイル
- *.vmdk … 仮想ディスクイメージ
- *.nvram … 仮想メモリファイル
余談ですが、エクスポート先を「e:\ファイル名.ova」のようにすると ova 形式(*ovf や *.vmdk などを tar でまとめたもの)で単一のファイルにエクスポートしてくれます。インポート先が同じ vmware 製品である場合や、VM のバックアップも目的であれば *.ova 形式の方が管理しやすいです。
c:\ovftool\ovftool.exe vi://root:password@192.168.1.254/win10-vm e:\win10-vm.ova
ova ファイルを proxmox へコピーする
エクスポートした*.ova ファイルを proxmox にインポートするわけですが、残念ながら windows OS の巨大な ova ファイルを保管する場所が proxmox にはありません。(/var/lib/vz/ などのスペースはあるのですが、VM やコンテナの置き場なので作業スペースとしては不適切です) USBリムーバブルディスクがある場合は、そこに ova ファイルを入れて proxmox でマウントするのが良いでしょう。
# リムーバブルディスクを USB接続し、USB デバイスとして認識されていることを確認する $ lsusb Bus 004 Device 002: ID 04bb:0141 I-O Data Device, Inc. I-O DATA HDPC-UT #「HDPCーUT」が認識されている Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub root@pve:~# fdisk -l | grep -3 -i HDPC Disk /dev/sdb: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors # 「/dev/sdb」として認識 Disk model: HDPC-UT Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes # マウントポイントを作成 (「pve」はホスト名) root@pve:~# mkdir /mnt/pve/pve_backup # HDPC-UT を /mnt/pve/pv_backup にマウント root@pve:~# mount /dev/sdb /mnt/pve/pve_backup
もし Windows で共有している NAS がある場合はもう少し簡単です。proxmox の webUI で「Datacenter」→「Storage」を開き、[Add]ボタンをクリックすることで NAS ストレージを追加することができます。
NAS ストレージの接続情報を入力し「Share:」をクリックすると、共有されているフォルダを検索してくれます。また、今後も ISO イメージやバックアップファイルの保管場所として NAS を利用するのであれば、「Content:」のドロップダウンメニューで「ISO image」「Container template」「VZDump backup file」等を選択しておくと良いです。(あとで変更することも可能)
NAS ストレージが追加され、「/mnt/pve/pve_backup」にマウントされていることがわかります。
proxmox の「>_ Shell」ボタンでシェルを開いて、NAS ストレージを参照します。
root@pve:~# df -h Filesystem Size Used Avail Use% Mounted on udev 16G 0 16G 0% /dev tmpfs 3.2G 1.3M 3.2G 1% /run /dev/mapper/pve-root 94G 5.4G 84G 6% / tmpfs 16G 46M 16G 1% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock efivarfs 128K 45K 79K 36% /sys/firmware/efi/efivars /dev/sda2 1022M 344K 1022M 1% /boot/efi /dev/fuse 128M 16K 128M 1% /etc/pve /dev/sdb 916G 27G 844G 3% /mnt //192.168.xx.xx/pve_backup 3.7T 1.9T 1.8T 52% /mnt/pve/pve_backup tmpfs 3.2G 0 3.2G 0% /run/user/0 root@pve:~#
「/mnt/pve/pve_backup」がマウントされていることが確認できました。
ova ファイルの展開 & インポート
「/mnt/pve/pve_backup」で共有した*.ovf ファイルを使って VM を proxmox へインポートします。
root@pve:~# cd /mnt/pve/pve_backup/ root@pve:/mnt/pve/pve_backup# ls -l total 13653456 drwxr-xr-x 2 root root 0 Mar 2 01:29 dump drwxr-xr-x 2 root root 0 Feb 27 20:11 images drwxr-xr-x 2 root root 0 Feb 23 10:18 template -rwxr-xr-x 1 root root 13980844544 Feb 22 16:18 win10-vm-disk1.vmdk -rwxr-xr-x 1 root root 270840 Feb 22 16:18 win10-vm-file1.nvram -rwxr-xr-x 1 root root 285 Feb 22 16:08 win10-vm.mf -rwxr-xr-x 1 root root 10584 Feb 22 16:08 win10-vm.ovf root@pve:/mnt/pve/pve_backup#
インポートコマンドの書式は以下のとおりです。
qm importovf [VM ID] [ovfファイル] [格納先ストレージ] –format [ディスクフォーマット]
以下は VM ID を「300」、qcow2 形式でインポートしています。格納先ストレージは、デフォルトの「local-lvm」です。
root@pve:/mnt/pve/pve_backup# qm importovf 303 win10-vm.ovf local-lvm --format qcow2 Logical volume "vm-303-disk-0" created. transferred 0.0 B of 96.0 GiB (0.00%) transferred 983.0 MiB of 96.0 GiB (1.00%) transferred 1.9 GiB of 96.0 GiB (2.00%) transferred 2.9 GiB of 96.0 GiB (3.00%) transferred 3.8 GiB of 96.0 GiB (4.00%) . . . . transferred 94.1 GiB of 96.0 GiB (98.01%) transferred 95.0 GiB of 96.0 GiB (99.01%) transferred 96.0 GiB of 96.0 GiB (100.00%) transferred 96.0 GiB of 96.0 GiB (100.00%) root@pve:/mnt/pve/pve_backup#
正常にインポートが完了すると、VM ID で仮想マシンが表示されます。CPU、BIOS、SCSI Controller はデフォルト設定になっていますので、それぞれ「host」、「OVMF(UEFI)」、「VMware PVSCSI」に変更してから起動します。
まず起動ファームを BIOS から EFI に変更します。EFI ディスクを追加しろと言われてますので、併せてEFI ディスクを追加します。
メニューの「追加」→「EFIディスク」を選択すると、編集画面が表示されます。EFI ディスクは VM とおなじ「local-lvm」に作成しました。
CPU はデフォルトの「規定(kvm64)」のままでも起動しますが、Windows 11 のアップグレード要件を満たせないため「host」(proxmox機の実CPU) を指定します。
※ 古い AMD機 (AMD Ryzen1700)では残念ながら「host」では起動できず BSOD になりました。
(kvm64では起動可能) というかそもそも Ryzen1700は Windows11 非対応なので…
これで Windows 10 VM の移行が完了しました。ただ、機器構成の大幅な変更を伴っていますのでライセンス認証は必要ですのでご注意ください。(認証する前に Windows11にアップグレードしたらどうなるんだろう??)