Disk2VHDで作成した可変VHDXを（比較的簡単に）固定サイズにする

# 背景
Disk2VHDは物理ディスクを可変VHDXで作成してくれるので、バックアップ時には最低限の容量ですみ大変便利ですが、それを再利用する際に以下の問題がありました。

:::note warn
**問題1:**
**作成時は最小限サイズだが、利用していくと肥大化していく。**
（例）物理サイズ256GB・実利用量10GBのディスクを変換すると10GBのVHDXですむが、それをHyper-VでマウントしたりVHDブートで起動すると肥大化していき、最終的には256GBに到達してしまう。

理由として、**VHDXファイルは物理ディスク時代のトータルサイズ（例では256GB）を保持しつづける**ことが原因です。数台のPCなら問題ありませんが、これが情シスの仕事として数十台以上となってくると、NASのサイズがいくらあっても足りません。
:::

:::note warn
**問題2:**
**VHDブートでは、ベースPCの容量を超えるサイズでブートができない。**
（例）ベースOSが30GBほど消費するので、たとえば256GBのSSDはかならず226GB以下のVHDXファイルを作成する必要がある。

もしVHDXファイルがベースOSの物理ディスクサイズを超えると、ブルースクリーンになって起動できません。このため**VHDXファイルが保持しているトータル物理サイズを縮小する必要**（ややこしいですが）があります。サードパーティソフトやdiskpartコマンドが必要になるため、毎回となると結構大変という認識でした。
:::
:::note warn
**問題3:**
**可変VHDXでの運用はマイクロソフトも推奨していない。**
https://learn.microsoft.com/ja-jp/windows-server/virtualization/hyper-v/best-practices-analyzer/vhd-format-dynamic-virtual-hard-disks-not-recommended-in-production

速度低下は10%程度であまり気にならないものの、Hyper-Vで動かすとたまにプチフリのような挙動になることがあります（Win7など古いOSで顕著）。固定サイズVHDXではこの問題は起きません。
:::

# 結論
:::note
今回、Hyper-V（Windows Server版）の「仮想ハードディスクの新規作成ウィザード」のGUIで比較的簡単に変更する方法がわかりましたので共有いたします。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/7362270d-5a9c-4e2c-3002-0512a6d70d20.png)

# VHDX内の物理領域を縮小する
まず、Disk2VHDで作成した可変VHDXファイルから、未使用の部分をカットします。
Cドライブのサイズは30GBですが、内部では物理ディスクトータルの256GBを保持しているので、226GBをカットすることになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/dc0938b7-4f6e-da87-ac17-08f4cedeb0fa.png)

VHDXをダブルクリックでマウントし、Cドライブより後方のパーティションを削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/bbfabbe2-740a-d6e6-040f-119402f50c7b.png)
回復パーティションの削除はdiskpartで以下のコマンドを使います。
```.ps1
diskpart
list disk #確認
select disk 1 #VHDXディスクを選択
list partition #確認
select partition 4 #回復パーティションを選択
delete partition override #削除
```
未割り当てになればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/cb6bd841-11f5-6770-2b8e-b82e6213bd2f.png)

Hyper-Vマネージャの「ディスクの編集」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/94eee120-2aaf-ec76-168a-b1e1a3b1d27d.png)

Disk2VHDで作成したVHDXファイルを選択し、「縮小」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/1441d1d1-19a6-39b5-105a-cc2d0c904135.png)

上記でちゃんと後方データをカットできていれば、Cドライブのみの最小サイズが選択できるようになります。（この場合は30GB）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/b3156cb4-5877-d7bf-811e-19c9989ed088.png)

再度VHDXファイルをダブルクリックでマウントし、30GBの物理領域になっていれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/3be9bede-0e91-6cb3-ef41-04be0369d493.png)


# 固定VHDXへの変換

VMの編集画面から仮想ハードディスクの「新規」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/b21f5174-9375-fd5c-ce4a-ecf482c6d1ff.png)

容量固定を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/ef041df3-1edc-4975-3a0a-532f89387a82.png)

変換先となる場所とファイル名を決定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/6fe66708-b6ae-b0ad-7ce5-c7b546482624.png)

「変換した仮想ハードディスクの内容をコピーします」を選択します。ここが今回、発見した箇所となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/7362270d-5a9c-4e2c-3002-0512a6d70d20.png)

変換が開始されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/f3ee67b0-e5c9-8ab0-3639-a45fa4d7b820.png)

完了後、以下のコマンドで正常に固定VHDXとして作成できたかを確認します。
```.ps1
Get-VHD -Path <VHDXのパス> | ft vhdtype,size
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/3120b7ee-0801-48df-414e-f68cfa7a469f.png)


# まとめ
・Hyper-Vのディスクの編集ウィザードの一番下にあったのですが、長年気づきませんでした。。。
・Disk2VHDを業務用PCのバックアップやP2Vで利用している企業もあると思いますが、Hyper-VやVHDブートで再利用する場合は、この方法で固定サイズにすることをおすすめいたします。
・以前のエントリで書いたProxmoxでの"qemu-img convert"コマンドの利用時にもメリットがあるかもしれません。また確認してみたいと思います。