ESXi8 から Proxmox へのお引越し

仕事絡みで VMware Server 1.0 あたりからずっとお世話になってきた VMware 製品ですが、この度 Broadcom 社に買収されたことにより永続ライセンス廃止→サブスクリプション化することを決定したようで、その結果無償版の ESXi が使えなくなる!と界隈で大騒ぎとなりました。

VMware by Broadcom : 製品ラインアップとライセンスモデルを大幅に簡素化

CentOS の Stream 化(事実上のOSS版廃止?)の混乱と同じく、”おうちデータセンター“勢だけではなく、仮想アプライアンスなど検証用のイメージを VMware の *.ova ファイルで提供してきた各メーカーさん方にも激震が走っていることでしょう(ハナホジ

というわけで、いつまでも VMware vSphere なんだか ESXi なんだかにしがみついていられなくなりそうなので、今度こそ真剣に Proxmox 環境への移行を検証することにしました。

おおまか手順

  1. Windows10 VM の SCSI コントローラを LSI logic SAS -> VMware Paravirtual に変更
  2. MBR2GPTt.exe を使ってファームを BIOS -> UEFI に変換
  3. ovftool を使って Windows10 の VM を win10.ova にエクスポート
  4. エクスポートした ova ファイルを Proxmox(以降PVE)にコピー
  5. PVE 上で ova ファイルを展開しインポート
  6. VM を起動する前に BIOS を UEFI に、SCSI コントローラを pvscsi に変更
  7. 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

  1. VM 編集画面を開き、「その他のデバイスの追加」→「SCSI コントローラ」を追加する。
  2. 「新規 SCSI コントローラ 」ができたら、「VMware Paravirtual」に変更する。
  3. 「ハードディスクの追加」→「新規ハードディスク」でダミーのディスクを追加する。後で削除するので容量は最小で良い。(ここでは 1MBで作成)
  4. 作成した「新規ハードディスク」の設定画面を開き、「コントローラの場所」に「SCSI コントローラ 1」(新しく追加したコントローラ)を選択し、保存する。


  5. VM を起動し、追加したドライブが認識されていることを確認する。
    ※ エクスプローラには表示されないので、「ディスクの管理」を開いて確認。
    ※ ディスクの初期化を求められるが、何もせずに閉じて良い。


  6. VM を停止し、追加したダミーのディスクを削除してから SCSI コントローラ 1 を削除。
  7. 既存の 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が無くなった
  • そもそもなんかディスクエラー出てない?

Windows11への移行に苦戦した話(MBR2GPT)

ハマった挙げ句、都度バックアップを取りながらひとつひとつ解決することに。

まず、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にアップグレードしたらどうなるんだろう??)

カテゴリー: 未分類   パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です