Ubuntu VM の移行 (VMware から Hyper-V へ)

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

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

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

1. [VMDK 形式の仮想ディスクを VHD/VHDX 形式への変換](#ステップ-1-vmdk-ディスクを-vhdvhdx-ディスクへ変換する)
2. [新しい仮想マシンを作成 (変換した仮想ディスクをアタッチする)](#ステップ-2-新しい-hyper-v-仮想マシンを作成)
3. [open-vm-tools のアンインストール](#ステップ-3-open-vm-tools-のアンインストール)
4. (オプション) [第2世代 Hyper-V 仮想マシン用の仮想ディスクへ変換](#ステップ-4-オプション-第2世代-hyper-v-仮想マシン用の仮想ディスクへ変換)
5. (オプション) [Secure Boot の有効化](#ステップ-5-オプション-secure-boot-の有効化)
6. [Hyper-V 統合サービスのインストール](#ステップ-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](https://techcommunity.microsoft.com/t5/system-center-blog/microsoft-virtual-machine-converter-3-0-is-now-available-for/ba-p/349874)
を利用して、VHDX 形式に変換することができました。

詳細な手順については、[こちらの記事](https://shigeyf.dev/posts/migrate-ubuntu-vm-from-vmware-to-hyper-v/../convert-vmdk-to-vhdx/) を参照ください。

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

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

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

```bash
sudo fdisk -l
```

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

```text
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 仮想マシンの詳細な作成方法は[この記事](https://learn.microsoft.com/ja-jp/windows-server/virtualization/hyper-v/get-started/create-a-virtual-machine-in-hyper-v?tabs=hyper-v-manager)を参照してください (ここでは割愛します)。
「既存の仮想ハード ディスクを使用する」を選択して変換した仮想ディスクを指定してください。

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

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

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

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

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

```bash
sudo apt remove open-vm-tools -y
```

削除されたか確認する:

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

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

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

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

```bash
sudo apt purge open-vm-tools -y
```

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

```bash
sudo apt autoremove -y
```

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

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

詳細な手順については、[こちらの記事](https://shigeyf.dev/posts/migrate-ubuntu-vm-from-vmware-to-hyper-v/../convert-ubuntu-disk-from-bios-to-efi/) を参照ください。

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

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

詳細な手順については、[こちらの記事](https://shigeyf.dev/posts/migrate-ubuntu-vm-from-vmware-to-hyper-v/../enable-secure-boot-in-ubuntu-vm/) を参照ください。

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

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

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

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

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

```bash
lsmod | grep hv_
```

出力結果:

```text
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 用デーモンの確認のコマンド:

```bash
compgen -c hv_
```

出力結果:

```text
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`) を
(例えば 以下のように) 正しく変更してください。

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

### /dev/fd0 に関するエラー

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

```text
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 カーネルモジュールが読み込まれています。

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

```bash
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 仮想マシンでセキュアブートを有効にした仮想マシンを
自動的にインストールすることができるようになっていますが、既存の資産を活用したい場合などは、このガイドを参考に移行をしてみてください。