だいぶ昔の記事になりますが、本連載第67回で仮想マシンの容量可変タイプのVHDまたはVHDXファイルを効果的に縮小する方法を解説しました。今回は、そのときの方法でも期待したほど縮小されない場合にやってみる価値のある追加手順を紹介します。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
Hyper-V仮想マシンの容量可変タイプのVHDおよびVHDXファイルは、ゲストOSがディスクに書き込むに従って、必要なサイズに拡張されます。別の言い方をすれば、仮想マシンの記憶域のシンプロビジョニングを可能にし、物理ディスク領域の効率的な使用を実現します。
ただし、VHD/VHDXファイルであるディスクからファイルが削除され、領域が解放されたとしても、自動的にサイズが縮小されることはありません。例えば、仮想マシンのゲストOSに対して「Windows 10」や「Windows 11」の機能更新プログラムによってインプレースアップグレードが行われると、VHD/VHDXファイルのサイズは逆に一気に増え、その後、前バージョンのWindowsへの回復用ファイルがクリーンアップされ、数十GBの空きができたとしてもサイズは肥大化したままとなります。手動でVHD/VHDXファイルの「最適化」を実行することで、使用されていない領域を解放し、ファイルサイズを縮小することができます。
本連載第67回では、「デフラグ」などの事前処理はあまり効果が期待できないばかりか、「Hyper-Vマネージャー」から利用できる「仮想ハードディスクの編集ウィザード」の「最適化」を実行してもほとんど最適化されない場合があることを指摘しました。後者の問題はWindows 11や「Windows Server 2022」に搭載された最新のHyper-Vでも改善されていません。
効果的にVHD/VHDXファイルのサイズを最適化するには、PowerShellウィンドウを管理者として開き、以下の3つのコマンドラインを実行するだけでよいと書きました。
Mount-VHD "VHD/VHDXファイルのパス" -NoDriveLetter -Readonly Optimize-VHD "VHD/VHDXファイルのパス" -Mode Quick(またはFull) Dismount-VHD "VHD/VHDXファイルのパス"
「チェックポイント」が存在する場合は、ファイルを削除して親VHD/VHDXファイルに結合してから親VHD/VHDXファイルに対して実行します。これらのコマンドラインは、“読み取り専用”でVHD/VHDXファイルをローカルマウントし、「Optimize-VHD」コマンドレットで最適化して、マウントを解除します。「読み取り専用でVHD/VHDXファイルをマウントした状態」で、Optimize-VHDを実行することがポイントです。
筆者は長年、繰り返しこの方法を使用して、VHD/VHDXファイルのサイズをメンテナンスしてきました。しかし、その後に登場したHyper-Vの新しいバージョンでは、この方法でも期待通りのサイズに縮小されない場合があることに前々から気付いています。
そのような場合は、だまされたと思って、2つ目のOptimize-VHDのコマンドラインを2回連続して実行してみてください。次のように全てのコマンドラインを1行で実行することもできます(画面1)。
$targetvhd = "VHD/VHDXファイルのパス"; Mount-VHD $targetvhd -NoDriveLetter -Readonly; Optimize-VHD $targetvhd -Mode Quick; Optimize-VHD $targetvhd -Mode Quick; Dismount-VHD $targetvhd
Windows 10 バージョン2004から「イネーブルメントパッケージ」(機能更新プログラムではなく)を使用してバージョン21H2まで更新してきた仮想マシンを例に実証してみましょう。
ゲストOS側でのディスクの使用領域をできるだけ減らすため、管理者として「ディスククリーンアップ(Cleanmgr.exe)」の「Windows Updateのクリーンアップ」を実行したり、「DISM」コマンドでコンポーネントストアの最適化(DISM /Online /Cleanup-Image /StartComponentCleanup /ResetBase)を実行したりします。クリーンアップと最適化の実行後、ゲストOSから見たC:ドライブの使用領域は約43GBとなりました(画面2)。
この仮想マシンに存在するチェックポイントを全て削除し、親VHDXファイルに完全に結合されたことを確認します(「状況」列の「結合処理を実行中−成功」で確認できます)。試しに、このVHDXファイルを「Hyper-Vマネージャー」の「仮想ハードディスクの編集ウィザード」の「最適化」を実行してみたところ、サイズはほとんど変化しませんでした(画面3)。
次に、VHDXファイルを読み取り専用でマウントし、Optimize-VHDを2回実行してから、マウントを解除するという操作を、管理者として開いたPowerShellウィンドウで実行します(画面4)。
1回目のOptimize-VHDではサイズは変化しませんでしたが、2回目のOptimize-VHDで約45GBまで縮小されました。これは、ゲストOS側から見える使用領域(約43GB)と矛盾しないサイズです。
筆者はサポートが終了し、更新プログラムが提供されなくなったWindows 10や古いバージョンのWindows Serverの仮想マシンも幾つか維持しています。それらの仮想マシンでは、この方法でVHDXファイルのサイズを縮小して、ディスク使用量をできるだけ少なく抑えるのに役立っています。
岩手県花巻市在住。Microsoft MVP 2008 to 2023(Cloud and Datacenter Management)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。Microsoft製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『Windows版Docker&Windowsコンテナーテクノロジ入門』(日経BP社)、『ITプロフェッショナル向けWindowsトラブル解決 コマンド&テクニック集』(日経BP社)。
Copyright © ITmedia, Inc. All Rights Reserved.