筆者のチームではHyper-Vホストサーバーを共有マシンとしており、ゲストマシンを各自の検証環境として使用しています。各自が検証環境を作成したり、スナップショットをとったりしていると、ホストマシンの容量が枯渇する問題に直面することがあります。ホストマシンのストレージが圧迫されると、全体のパフォーマンスの低下やシステムの不安定化、最悪、ゲストマシンが立ち上がらないといった問題を引き起こす可能性があります。
まずは、ディスク容量を監視し、容量逼迫時にはアラートで知らせ、すぐにメンテナンスができるような環境にしておくことが肝要です。
※ Windows Serverで容量枯渇時にアラートを上げる方法については、以前に記事を投稿しています。こちらの記事もご確認ください。
別のアプローチとして、そもそも、各ゲストマシンの利用する容量を抑える方法がないか、という観点でも調査したところ、仮想ディスクの容量最適化を行う方法が見つかりましたので紹介します。
手順
-
Hyper-VホストマシンでPowerShellを管理者権限で開く
Windowsスタートメニューより、Windows PowerShellを右クリックして「管理者として実行」 -
VHDXファイルを読み取り専用でマウントする
Mount-VHD -Path '仮想マシンVHDXファイルのフルパス' -ReadOnly -
最適化する
Optimize-VHD -Path '仮想マシンVHDXファイルのフルパス' -Mode Full※ 下記のような画面表示で圧縮が行われます。
※ 「-Mode Full」以外に、Pretrimmed、Prezeroed、Quick、Retrimといった、オプションがありますが、Fullが最も容量削減の効果を期待できるオプションとなります。Fullオプションを利用する場合、仮想マシンを読み取り専用でマウントする必要があるため、手順2.で「-ReadOnly」オプションを付加しています。
※ このコマンドを複数回実行すると、効果がさらに得られることがあります。 -
マウントを外す
Dismount-VHD -Path '仮想マシンVHDXファイルのフルパス'
以上の手順で、容量の最適化を行うことができました。
効果
以下のような結果となりました。
もともとこの容量の仮想マシンが……
■ Optimize-VHDコマンド1回目
■ Optimize-VHDコマンド2回目
■ Optimize-VHDコマンド3回目以降(変わらず)
なぜこんなに減るの?
Optimize-VHDコマンドは、Hyper-V環境で使用される仮想ハードディスク(VHDおよびVHDXファイル)の容量を最適化するためのPowerShellコマンドです。大きくは仮想ディスク内の空き容量となっている使われていない領域を削除することで、容量を圧縮しています。そのほかにも内部的にデフラグなどの最適化処理が行われるようです。
容量固定の仮想ディスクに対しては効果を得られないため、ご注意ください。
今回の記事は以上となります。