Hyper-V の容量可変の仮想ディスク (VHD/VHDX) のファイルサイズを小さくする

Hyper-V の容量可変の仮想ディスク (VHD/VHDXファイル) のファイルサイズを小さくする手順を紹介します。

概要

Hyper-Vで仮想ディスク(VHD/VHDXファイル)を容量可変で作成すると、作成直後のファイルサイズは小さく、ディスクを使用するとファイルサイズが増えます。しかし、不要なファイルを削除してディスクの空き容量を増やしても、VHD/VHDXファイルのファイルサイズは自動では縮小されません。この記事では、容量可変のVHD/VHDXファイルで空き容量が増えた際に、VHD/VHDXファイルのサイズを小さくする手順を紹介します。

手順1:Optimize-VHDのみを利用する方法

Hyper-VやOSのバージョンアップにより、SDeleteを利用しなくてもVHDの容量縮小ができるようになっているようです。

Hyper-VホストのOSにログインします。今回はこちらのVHDXファイルを圧縮します。


PowerShellまたは、コマンドプロンプトを開き、次のコマンドを実行します。
Mount-VHD -Path (圧縮するVHD, VHDXファイル名) -ReadOnly
今回の場合は以下のコマンドになります。
Mount-VHD -Path 'F:\VHD\Windows 10 Pro Operation.vhdx' -ReadOnly



コマンドを実行すると仮想ディスクのマウントが実行されます。下図の進捗ゲージが表示されます。


マウントが完了すると、コマンドプロンプトに戻ります。メッセージなどは表示されません。


続いて、下記の最適化のコマンドを実行します。
Optimize-VHD -Path (圧縮するVHD, VHDXファイル名) -Mode Full
今回の場合は以下のコマンドになります。
Optimize-VHD -Path 'F:\VHD\Windows 10 Pro Operation.vhdx' -Mode Full



コマンドを実行するとディスクの圧縮が始まります。



一度のコマンド実行では圧縮がされない場合がありますので、複数回実行したほうが良いです。


VHDファイルをアンマウントします。下記のコマンドを実行します。
Dismount-VHD -Path (圧縮するVHD, VHDXファイル名)
今回の場合は以下のコマンドになります。
Dismount-VHD -Path 'F:\VHD\Windows 10 Pro Operation.vhdx'



VHDディスクがアンマウントできました。正常終了した場合でもメッセージなどは表示されません。


VHDXディスクのファイルサイズを確認します。処理前よりサイズが減少しており、圧縮ができていることが確認できます。

手順2:SDeleteを利用する方法

SDeleteによるゼロフィル

ゲストの仮想PCにログインします。ログイン後、"SDelete"と呼ばれるツールをダウンロードします。
ダウンロードのURLは下記となります。
https://technet.microsoft.com/ja-jp/sysinternals/bb897443.aspx



ファイルを展開します。今回は "C:\Tools\SDelete" ディレクトリに展開しました。

展開後下記のコマンドを実行します。
sdelete.exe -Z (ドライブ名):
容量を縮小するVHDファイルのドライブがCドライブである場合は、下記のコードとなります。
  sdelete.exe -Z C:


コマンドを実行すると下図の[License Agreement]のダイアログボックスが表示されます。[Agree] ボタンをクリックして実行を開始します。


SDelete コマンドのZeroフィルの処理が始まります。


%の数値が増えてゆきます。


Zeroフィルが完了すると下図の画面となります。

未使用領域の最適化

SDeleteが完了したのちゲストPCをシャットダウンします。
ゲストPCのディスクを確認します。今回処理をするディスクは、下図の"ed.vhdx"ファイルです。VHDファイルのファイルサイズが 280GB あることが確認できます。


管理者として、PowerShellのコンソールを起動します。PowerShellのコンソールで下記のコマンドを実行します。
Optimize-VHD -Path (VHD/VHDXファイルのパス) -Mode Full
今回のVHDXファイルの場合は以下のコマンドとなります。
 Optimize-VHD -Path C:\VHD-F\ed.vhdx -Mode Full



実行すると下図のプログレスバーの画面が表示されます。仮想ディスクの圧縮の進行状況が表示されます。


圧縮が完了すると下図の状態となります。


"sd.vhdx"ファイルのファイルサイズを確認します。280GBのサイズであったファイルが36GBになっています。未使用領域を切り捨てることができました。

補足

Optimize-VHD(VHD最適化)コマンドでは、以下のオプションも利用できます。

Full

Fullオプションを指定すると、ゼロのブロックをスキャンし、未使用のブロックを再利用します。
 Optimize-VHD -Path (VHDファイルのパス) -Mode Full

Quick

Quickオプションでは、未使用のブロックを再利用しますが、ゼロブロックのスキャンはしません。
 Optimize-VHD -Path (VHDファイルのパス) -Mode Quick

Retrim

Retrimオプションではブロックの整理のみを実行します。
 Optimize-VHD -Path (VHDファイルのパス) -Mode Retrim

Pretrimmed

Pretrimmed オプションは、Quick モードとして動作しますが読み取り専用でのマウントが不要です。その分効率や速度は落ちます。VHDXファイルが、Retrimオプションでブロックの整理された状態になっていると効率が良いです。
 Optimize-VHD -Path (VHDファイルのパス) -Mode Pretrimmed 

Prezeroed

Prezeroed オプションは、Quick モードとして動作しますが読み取り専用でのマウントが不要です。事前にツールを実行して仮想ディスク上のすべての空き領域をゼロにしてある場合に利用します。
 Optimize-VHD -Path (VHDファイルのパス) -Mode Prezeroed 

著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
作成日: 2015-09-11
Copyright © iPentec all rights reserverd.