仮想ディスクの変換 (VMDK 形式から VHD/VHDX 形式への変換)

## はじめに

この記事では、[記事: Ubuntu VM の移行 (VMware から Hyper-V へ)](https://shigeyf.dev/posts/convert-vmdk-to-vhdx/../migrate-ubuntu-vm-from-vmware-to-hyper-v/)
で説明した以下の移行手順の ステップ 1 について説明します。

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

## VMDK ディスクを VHD/VHDX ディスクへ変換する

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

### MVMC (Microsoft Virtual Machine Converter) のインストール

仮想ディスク 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 形式に変換することができました。

2023-03-16 現在、リリース記事内のリンクは無効となっていてダウンロードすることはできませんが、
以下のマイクロソフトのダウンロード URL からダウンロードすることができます。

[http://download.microsoft.com/download/9/1/E/91E9F42C-3F1F-4AD9-92B7-8DD65DA3B0C2/mvmc_setup.msi](http://download.microsoft.com/download/9/1/E/91E9F42C-3F1F-4AD9-92B7-8DD65DA3B0C2/mvmc_setup.msi)

インストーラー ファイルのハッシュ値は以下の通りです。

```text
SHA256 = 520B0D08E0B9D2D95206369E56461D3873FB208F507FBCCC28651D43ABA37F33
SHA-1 = F67812339083376507F51A0B28853C38A3488CF7
```

### 仮想ディスク変換ツールの実行

MSMC 変換ツールには、GUI 変換ツールも付属しますが、
この記事では PowerShell コマンドを使って仮想ディスクの変換を行います。

以下のコマンドを実行して、
`Import-Module` コマンドで MVMC PowerShell コマンドレットをロードし、
`ConvertTo-MvmcVirtualHardDisk` コマンドで VMDK 形式の仮想ディスクファイルを VHDX 形式に変換します。

以下の例では、VMDK 形式のファイルは `Ubuntu_OsDisk.vmdk` という名前で、`OsDisk.vhdx` という名前の VHDX 形式（ダイナミック）に変換します。

```powershell
Import-Module 'C:\Program Files\Microsoft Virtual Machine Converter\MvmcCmdlet.psd1'
```

```powershell
ConvertTo-MvmcVirtualHardDisk -SourceLiteralPath Ubuntu_OsDisk.vmdk -VhdType DynamicHardDisk -VhdFormat Vhdx -DestinationLiteralPath OsDisk.vhdx
```

| オプション | 説明 |
| --- | --- |
| -SourceLiteralPath | 変換元の VMDK ファイルのパス |
| -VhdType | VHD のタイプ (FixedHardDisk または DynamicHardDisk) |
| -VhdFormat | VHD の形式　(Vhd または Vhdx) |
| -DestinationLiteralPath | 変換先の VHD/VHDX ファイルのパス |

> コマンドレットの詳細な説明については
> [MVMC_cmdlets.doc](https://download.microsoft.com/download/9/1/E/91E9F42C-3F1F-4AD9-92B7-8DD65DA3B0C2/MVMC_cmdlets.doc)
> ファイルを参照してください。

`ConvertTo-MvmcVirtualHardDisk` コマンドは管理者権限が必要となるため、
管理者権限に昇格していない PowerShell コマンドラインで実行すると以下のエラーが表示されます。
管理者権限で昇格済みの PowerShell コマンドラインで実行してください。

```text
ConvertTo-MvmcVirtualHardDisk: Local administrator privileges are required.
ConvertTo-MvmcVirtualHardDisk: One or more errors occurred. (Local administrator privileges are required.)
```

### Disk Database Entry に関する変換エラーが出る場合

現在 MVMC 変換ツールのメンテナンスが行われていないため、`ConvertTo-MvmcVirtualHardDisk` コマンドの実行で以下のエラーが出る場合があります。

> 手持ちの仮想ディスクの変換を実行した際にも、最近作成した VMware 仮想ディスクでエラーが出ました。

```text
ConvertTo-MvmcVirtualHardDisk: The entry 4 is not a supported disk database entry for the descriptor.
ConvertTo-MvmcVirtualHardDisk: One or more errors occurred. (The entry 4 is not a supported disk database entry for the descriptor.)
```

このエラーは、MVMCツールがサポートしていない DDB (Disk Database) エントリ情報が VMDK に設定されている場合に発生します。
サポートしていないエントリーを無効にするために、VMDK ファイルを編集します。

1. VMDK ファイルが分割されている場合
    * VMDK DDB エントリは、マスターファイル (`*-sXXX.vmdk` という名前規則でない `*.vmdk` ファイルでテキスト形式となっている) に格納されているため、テキストエディタで直接編集します。
2. VMDK ファイルが単一ファイルの場合
    * VMDK DDB エントリは、VMDK ファイル (バイナリ形式) に埋め込まれています。このエントリ情報の書き換えについては、[DSFOK ツール](http://sanbarrow.com/files/dsfok.zip
    ) を利用して行います。
    * DSFOK ツールの詳細については、[こちらの記事 (英語)](http://sanbarrow.com/vmdk-howtos.html#editvmdk)を参照しました。
    * 以下のコマンドを利用して、DDB エントリ情報 (ファイルの先頭から 512 バイトの位置から 1024 バイト) を取り出します。

    ```cmd
    dsfo.exe Ubuntu_OsDisk.vmdk 512 1024 descriptor.txt
    ```

    * 取り出した DDB エントリ情報 (`descriptor.txt`) をテキストエディタで編集したら、
    以下のコマンドを利用して、DDB エントリ情報 (ファイルの先頭から 512 バイトの位置から 1024 バイト) を書き出します。

    ```cmd
    dsfi.exe Ubuntu_OsDisk.vmdk 512 1024 descriptor.txt
    ```

DDB エントリ情報は以下のような内容になります。

```
# Disk DescriptorFile
version=1
encoding="windows-1252"
CID=a48f63c4
parentCID=ffffffff
createType="monolithicSparse"

# Extent description
RW 134217728 SPARSE "Ubuntu-LTS-x64.vmdk"

# The Disk Data Base
#DDB

ddb.adapterType = "lsilogic"
ddb.geometry.cylinders = "8354"
ddb.geometry.heads = "255"
ddb.geometry.sectors = "63"
ddb.longContentID = "3bf70afaa672951de3328531a48f63c4"
ddb.toolsInstallType = "4"
ddb.toolsVersion = "12320"
ddb.uuid = "60 00 C2 97 7a d0 13 78-1f e0 18 0f 03 1f 8f ff"
ddb.virtualHWVersion = "19"
```

上記のエラーの場合、該当部分を以下のようにコメントアウトする (`#` を追加する) ことで、
変換コマンドのエラーを回避することができました。

変換前：

```text
ddb.toolsInstallType = "4"
```

変換後：

```text
#ddb.toolsInstallType = "4"
```

![コマンド実行のスクリーンショット](https://shigeyf.dev/posts/convert-vmdk-to-vhdx/./convert-vmdk-to-vhd-powershell-screenshot.jpg)

VMDK DDB エントリ情報を編集後にコマンドを実行すると、正常に変換が開始します。変換が完了すると以下の結果のメッセージが表示されます。

```text
Destination                     Source
-----------                     ------
Z:\shigeyf\VMs\work\OsDisk.vhdx .\Ubuntu-LTS-x64.vmdk
```

## 最後に

この手順ガイドは、VMware 仮想マシンを Hyper-V に変換するときに得た経験と、Google 検索で得られた記事等に基づいて作成しました。

この記事に記載されている情報に基づいて行った結果についての損失や損害について責任を負いません。
仮想ディスクの変換を行う際には、十分な容量を確保した環境で、必ず仮想ディスクファイルのバックアップを必ず行ってから、自身の責任の元で実行してください。