VMDK縮小の極意:VMware ESXiとWorkstationで数百GBのディスク容量を取り戻す方法

VMware tutorial - IT technology blog
VMware tutorial - IT technology blog

午前2時、私の電話が激しく震えました。監視システムのZabbixが真っ赤なアラートを表示しています。社内のSANシステム上にある10TBのストレージLUNの空き容量が、残り150GBを切っていました。これは非常に危機的な状況です。物理ディスクがいっぱいになると、すべての仮想マシン(VM)が即座に一時停止(サスペンド)され、全システムのサービスが停止してしまいます。

急いで調査したところ、1台のWindows Server 2019がSAN上の実容量を500GBも占有していることが判明しました。しかし、不可解なことにWindows内部のデータ量はわずか120GBと報告されています。なぜ300GB以上もの差が生じているのでしょうか? OSを再インストールせずに、このストレージ容量を取り戻すにはどうすればよいか。8台のESXiホストクラスターを管理してきた経験から、この問題を根本的に解決する方法を伝授します。

なぜVMDKファイルは肥大化するのに自動で縮小されないのか?

主な原因はThin Provisioning(シン・プロビジョニング)の仕組みにあります。これを風船に例えてみましょう。空気を吹き込む(データを書き込む)のは簡単ですが、空気を抜いても(データを削除しても)、風船の皮(VMDKファイル)は伸びきったサイズのまま残ります。WindowsやLinuxでファイルを削除した際、OS側ではそのブロックをソフトウェア層で「空き」としてマークするだけです。しかし、下位層のVMware(ハイパーバイザー)からは、それらのブロックにまだ古いデータが残っているように見えるため、容量が解放されません。

解決するには、2つのステップが必要です。まずは**Zero-out**(空き領域に「0」を書き込む)を行い、次に**Shrink**(「0」が書き込まれた領域をカットして容量を回収する)を実行します。

方法1:VMware WorkstationでVMDKを縮小する(個人用PC向け)

ラップトップやPCで仮想マシンを動かしている場合、VMware Workstationにはグラフィカルなツールが標準搭載されており、迅速に作業が行えます。

まず、仮想マシン内部をクリーンアップします。 Windowsを起動し、一時ファイルの削除、ゴミ箱を空にする、または「ディスクのクリーンアップ」を実行してください。これにより、縮小を行う前に古いデータブロックが最大限解放されます。

次に、「ディスクのクリーンアップ」機能を使用します。

  1. 仮想マシンを完全にシャットダウン(Power Off)します。
  2. 仮想マシン名を右クリックし、設定(Settings)を選択します。
  3. ハードディスクを選択し、右側の**ユーティリティ(Utilities)**ボタンから**ディスクのクリーンアップ(Clean Up Disks)**を選択します。

システムがスキャンを行い、空きブロックを回収します。ただし、ディスクの断片化が激しい場合、このツールでは期待通りの効果が得られないことがあります。

方法2:Windows用VMDKの縮小(ESXiとWorkstationの両方で100%効果的)

これは「力技」ではありますが、私が頻繁に活用している非常に効果的な手法です。MicrosoftのSysinternalsスイートに含まれる**SDelete**というツールを使用します。

ステップ1:空き領域を「0」で埋める。 仮想マシン内にSDeleteをダウンロードし、管理者権限でコマンドプロンプト(CMD)を開き、以下のコマンドを実行します。

sdelete.exe -z c:

このコマンドは、Cドライブの空き領域全体に「0」を書き込みます。この際、.vmdkファイルのサイズが最大まで膨れ上がっても驚かないでください。これは、後続の「切り詰め」作業の準備として、あえて領域を埋めているのです。

ステップ2:ファイルの縮小(Shrink)を実行する。 SDeleteの完了後、仮想マシンをシャットダウンします。Workstationを使用している場合は、ホストOS側でコマンドプロンプトを開き、以下のコマンドを実行します。

"C:\Program Files (x86)\VMware\VMware Workstation\vmware-vdiskmanager.exe" -k "ファイルへのパス.vmdk"

ESXi環境の場合: ホストにSSHで接続し、仮想マシンが保存されているディレクトリに移動して、vmkfstoolsコマンドの-Kオプション(Punching holes)を使用します。

cd /vmfs/volumes/対象의データストア/VMディレクトリ/
vmkfstools -K 対象のディスク.vmdk

-Kコマンドは「0」が含まれるブロックを探し、それらをストレージプールに解放します。あの日、このコマンドのおかげで、わずか20分で300GB以上の容量を取り戻すことができました。

方法3:ddコマンドを使用してLinux仮想マシンを処理する

UbuntuやCentOSなどのLinuxディストリビューションでは、SDeleteの代わりに、魔法のコマンドddを使用して「0」を含むダミーファイルを作成します。

Linux仮想マシン内部での操作:

dd if=/dev/zero of=/wipefile bs=1M
rm /wipefile

上記のコマンドは、ディスクの空き容量をすべて使い果たすwipefileというファイルを作成し、その後に削除します。これにより、空きブロックが「0」で埋め尽くされます。最後に、仮想マシンを停止し、前述のESXiホスト上でのvmkfstools -Kコマンドを実行するだけです。

実戦経験から:見逃せない注意点

仮想ディスクファイルの構造に手を加える作業には、常にリスクが伴います。私が常に守っている3つのルールを紹介します。

  • バックアップは必須: 作業前に仮想マシンのクローンを作成するか、Veeamなどでバックアップを取ってください。縮小作業中に停電やホストのフリーズが発生すると、.vmdkファイルの構造が破損する恐れがあります。
  • スナップショットの全削除: スナップショットが残っている状態では、ディスクを縮小することはできません。開始前にすべてのスナップショットを統合(Consolidate)してください。
  • 物理容量の確認: SDeleteを実行すると、VMDKファイルは一時的に最大サイズ(Maximum Provisioned)まで膨らみます。物理ディスクに、この一時的な増加を受け入れる十分な空き容量があることを確認してください。

ESXi 6.7以降を使用しており、SANがVAAIをサポートしている場合は、**UNMAP**コマンドについても調べてみてください。これにより、Windowsが手動操作なしで自動的に容量を回収できるようになります。ただし、古いシステムや複雑な構成の場合、上記の手動テクニックが依然として最も信頼できる方法です。

この記事が、容量不足に悩むストレージを救う一助となれば幸いです。もし「Failed to open the disk」などのエラーが発生した場合は、下のコメント欄で教えてください。サポートさせていただきます!

Share: