VMware 仮想マシンを Hyper-V へ移行する

これまで、Windows の開発環境で VMware Workstation Player (個人利用では無償バージョンを利用することができる) を使って開発用の仮想化環境 (Ubuntu Linux マシン等) を用意していましたが、 新しい PC の購入に伴い、開発環境を引っ越しすることにしました。 この引っ越しに伴って、仮想化マシンも Hyper-V へ引っ越しすることにしました。

Ubuntu OS の VMware 仮想マシンを Hyper-V へ移行するには以下の手順で行います。

  1. VMDK 形式の仮想ディスクを VHD/VHDX 形式への変換
  2. 新しい仮想マシンを作成 (変換した仮想ディスクをアタッチする)
  3. open-vm-tools のアンインストール
  4. (オプション) 第2世代 Hyper-V 仮想マシン用の仮想ディスクへ変換
  5. (オプション) Secure Boot の有効化
  6. Hyper-V 統合サービスのインストール

ステップ 1: VMDK ディスクを VHD/VHDX ディスクへ変換する

VMware 仮想マシンでは仮想ディスクに VMDK 形式を利用しているため、Hyper-V 仮想マシンで利用できる仮想ディスク形式 (VHD/VHDX) とは異なります。 Hyper-V で同じ仮想ディスクを利用するためには、VMDK 形式を VHD/VHDX 形式に変換する必要があります。

仮想ディスク VMDK 形式は、マイクロソフトが 2014 年にリリースした MVMC (Microsoft Virtual Machine Converter) 3.0 を利用して、VHDX 形式に変換することができました。

詳細な手順については、こちらの記事 を参照ください。

ステップ 2: 新しい Hyper-V 仮想マシンを作成

ほとんどの場合、VMware で作成した Ubuntu Linux の仮想マシンは BIOS ブートとなっています。

BIOS ブートとなっているかどうかを確認するには、移行前に VMware 仮想環境で以下のコマンドを実行してください。

sudo fdisk -l

コマンドの出力結果は以下の通りです。 /dev/sda のディスクに BIOS boot のパーティションが表示されています。

Disk /dev/loop0: ... (中略)
   :
Disk /dev/sda: 32 GiB, 34359738368 bytes, 67108864 sectors
Disk model: Virtual Disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 9DB29DC2-4F7D-4E2A-B917-31BE798E6613

Device       Start      End  Sectors Size Type
/dev/sda1     2048     4095     2048   1M BIOS boot
/dev/sda2     4096  4198399  4194304   2G Linux filesystem
/dev/sda3  4198400 67106815 62908416  30G Linux filesystem


Disk /dev/mapper/ubuntu--vg-ubuntu--lv: 15 GiB, 16101933056 bytes, 31449088 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes

BIOS ブートのディスクを正しく起動するには、「第 1 世代」の Hyper-V 仮想マシンを作成する必要がありますので、注意してください。

Hyper-V 仮想マシンの詳細な作成方法はこの記事を参照してください (ここでは割愛します)。 「既存の仮想ハード ディスクを使用する」を選択して変換した仮想ディスクを指定してください。

Hyper-V 仮想マシンを作成する際のフォルダ構成は、以下のような構成がおすすめです。

仮想マシンの名前のフォルダー
├─Virtual Machines
├─Virtual Hard Disks : ここに変換した VHD/VHDX ファイルをコピーする
└─Snapshots

ステップ 3: open-vm-tools のアンインストール

VMware 仮想マシンに Ubuntu Linux をインストールすると、自動的に open-vm-tools パッケージがインストールされています。 このパッケージのアンインストールをします。

アンインストールの実行:

sudo apt remove open-vm-tools -y

削除されたか確認する:

sudo apt list | grep "open-vm-tools/"

以下のように residual-config と表示されている場合、パッケージの残骸 (構成ファイルなど) が残っている状態を表しています。

open-vm-tools/jammy-updates,now 2:12.1.0-1~ubuntu0.22.04.1 amd64 [residual-config]

以下のコマンドで構成ファイルを削除します。

sudo apt purge open-vm-tools -y

以下のコマンドを実行して、open-vm-tools に依存するパッケージで不要なパッケージを自動的に削除します。

sudo apt autoremove -y

ステップ 4: (オプション) 第2世代 Hyper-V 仮想マシン用の仮想ディスクへ変換

第 2 世代 Hyper-V 仮想マシンで Ubuntu Linux を起動するには、 Ubuntu Linux の起動ディスクを BIOS ブートから EFI ブートへ変更する必要があります。

詳細な手順については、こちらの記事 を参照ください。

ステップ 5: (オプション) Secure Boot の有効化

第 2 世代 Hyper-V 仮想マシンの Ubuntu Linux でセキュアブートを有効にするには、 セキュアブートに対応したカーネルと Grub ブートローダーをインストールする必要があります。

詳細な手順については、こちらの記事 を参照ください。

ステップ 6: Hyper-V 統合サービスのインストール

以下のコマンドを実行して、Hyper-V 統合サービスをインストールします。

sudo apt update
sudo apt install linux-virtual linux-cloud-tools-virtual linux-tools-virtual -y
sudo reboot -f

再起動後、以下のコマンドを実行して、Hyper-V 統合サービスが実行しているか確認することができます。

Hyper-V 用のカーネルモジュールの確認のコマンド:

lsmod | grep hv_

出力結果:

hv_balloon             36864  0
hv_storvsc             24576  3
hv_netvsc              98304  0
scsi_transport_fc      98304  1 hv_storvsc
hv_utils               45056  3
hv_vmbus              135168  8 hv_balloon,hv_utils,hv_netvsc,hid_hyperv,hv_storvsc,hyperv_keyboard,hyperv_drm,hyperv_fb

Hyper-V 用デーモンの確認のコマンド:

compgen -c hv_

出力結果:

hv_fcopy_daemon
hv_vss_daemon
hv_set_ifconfig
hv_get_dhcp_info
hv_get_dns_info
hv_kvp_daemon
hv_fcopy_daemon
hv_vss_daemon
hv_set_ifconfig
hv_get_dhcp_info
hv_get_dns_info
hv_kvp_daemon

移行後のその他の作業

仮想化環境の変更により、仮想マシンのハードウェアの変更が発生しています。 以下の作業を行います。

ネットワークインターフェースの変更

VMware 仮想マシンでは、ネットワークインターフェースは ens33 と認識されましたが、 Hyper-V 仮想マシンでは eth0 と認識されます。

ネットワーク接続の構成ファイル (/etc/netplan/00-installer-config.yaml) を (例えば 以下のように) 正しく変更してください。

# This is the network config written by 'subiquity'
network:
  ethernets:
    eth0:
      dhcp4: true
  version: 2

/dev/fd0 に関するエラー

コンソール出力に以下のようなエラーが表示されたり、sudo dmesg コマンドの実行結果に以下のエラーが表示される場合があります。 起動している Hyper-V の仮想マシンにフロッピーデバイスがないため、表示されるエラーです。

floppy0: disk absent or changed during operation
blk_update_request: I/O error, dev fd0, sector 0 op 0x0:(READ) flags 0x80700 phys_seg 1 prio class 0
floppy0: disk absent or changed during operation
blk_update_request: I/O error, dev fd0, sector 0 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
Buffer I/O error on dev fd0, logical block 0, async page read

VMware 仮想マシンでは、仮想マシンにフロッピードライブを接続していなくても、 仮想マシンのマザーボードにフロッピードライブのインターフェースが用意されているため、 floppy カーネルモジュールが読み込まれています。

以下のコマンドで、フロッピーデバイスを無効化します。

sudo rmmod floppy
echo "blacklist floppy" | sudo tee /etc/modprobe.d/blacklist-floppy.conf
sudo dpkg-reconfigure initramfs-tools

まとめ

VMware 仮想化環境でインストールした Ubuntu Linux 仮想マシンを Hyper-V 仮想化環境に移行することができました。

最新の Ubuntu Linux インストーラーでは、第 2 世代の Hyper-V 仮想マシンでセキュアブートを有効にした仮想マシンを 自動的にインストールすることができるようになっていますが、既存の資産を活用したい場合などは、このガイドを参考に移行をしてみてください。