この疑問に回答します。
一度大きくなったディスクは、ずっと大きいままです。縮小するには手動で操作する必要があります。
- 仮想ディスクのファイルサイズが違う理由
- シンプロビジョニングされた仮想ディスクを縮小する
- 仮想ディスクの空き領域を「0」で埋める
- 仮想ディスクを収縮
仮想ディスクのファイルサイズが違う理由
OSはファイルを削除したあとも、書き込んだ領域のインデックスを削除しているだけで、実態は残っています。そのため、VMware ESXi ホストからみるとゲストOSが仮想ディスクを「利用している」と認識し仮想ディスクが肥大化します。
結果、「シンプロビジョニングされたディスクサイズ」と「ゲストOSが認識しているディスクサイズ」が違ってきます。
シンプロビジョニングされた仮想ディスクを縮小する
ESXi ホスト上で動作する仮想マシンの仮想ディスクがシンプロビジョニング(Thin Provisioning)で作成されているとき、使用していないディスク領域を縮小する方法について説明します。
仮想ディスクの空き領域を「0」で埋める
ESXi ホストに未使用領域と認識させるには、仮想ディスクの空き領域を「0」で埋めることです。Windows、Linux共に対応が可能です。
- ゲストOSでツールかコマンドを実行し、空き領域ディスクに対してゼロ埋めを行う
- ESXiホストからコマンドを実行しゼロ領域が圧縮する
Windowsの場合
マイクロソフトが空き領域を「0」で上書きする sdeleteツール を無料で提供しています。このツールを利用するだけでゼロ埋めが出来るようになります。
Linuxの場合
Linuxの場合、空き容量に空のファイルを作成してスグに削除します。
今回は、zeroというファイルを作成してdisk fullし、直後に削除します。
# dd if=/dev/zero of=./zero bs=4k; rm -f ./zero dd: writing `zero': No space left on device
当然ですが、ディスクの容量が一杯になりワーニングが出てきますが問題はありません。
仮想ディスクを縮小
ESXi サーバーで仮想ディスクを圧縮する操作を実施します。
- ゲストOSをシャットダウン
- ESXiサーバーにSSH接続する
- 仮想ディスクの圧縮コマンドを実行
ゲストOSをシャットダウン
残念ながらオンラインで仮想ディスクを圧縮できません。
ゲストOSをシャットダウンしてください。
ESXiサーバーにSSH接続する
ESXiサーバーにSSH接続し、ゲストOSがあるディレクトリに移動します。
仮想ディスクの収縮コマンドを実行
仮想ディスクの圧縮コマンドを実行します。
# vmkfstools -K ./<仮想マシン名>.vmdk
実行中の進捗具合が表示されます。
# vmkfstools -K ./<仮想マシン名>.vmdk vmfsDisk: 1, rdmDisk: 0, blockSize: 1048576 Hole Punching: 11% done.
最後まで完了したら仮想ディスクが圧縮作業は完了です。忘れずにESXiサーバーのサービス(SSH、シェル)を停止させてください。
ゲストOSの起動
あとは、ゲストOSを起動させるだけです。
以上、「VMwareの仮想ディスクを縮小する」という記事でした。