ESXi5でシンプロビジョニングされた仮想ディスクを圧縮する

ESXi5.1にて、シンプロビジョニングで作成した仮想ディスクを圧縮しようとしたものの、圧縮されなかった問題に直面したのでメモ。

シンプロビジョニングで作成したディスクは、ゲストOSで容量を消費していくと膨らんでいく。

一旦膨らんだ仮想ディスクは、そのままでは元に戻らず、データストアの容量を消費したままになる。

ESXiにて、これを圧縮するには、SSHでESXiホストへログインし、仮想マシンが停止した状態で以下のようにする。

# vmkfstools --punchzero [仮想マシン.vmdk]


これを実行しても、思うようにディスクが圧縮されなかった。


調べてみると、「未使用領域が0で埋められている場合に、その領域を解放する」という事で、ゲストOS側で単にファイルを削除する等で使用量を減らすだけではダメだった。

参考;
http://pubs.vmware.com/vsphere-50/index.jsp#com.vmware.vsphere.storage.doc_50/GUID-CBF31A6B-B36F-4552-B512-CC92B1943902.html


という事で、ゲストOSで未使用領域に0を書き込む作業を実施。


Windowsの場合は、MSが無償提供しているSDeleteを使う。
http://technet.microsoft.com/ja-jp/sysinternals/bb897443.aspx

例) Cドライブの空き領域を0埋めする(回数は1回)

>sdelete -z c:


Linuxの場合、空き容量一杯に空のファイルを作成して削除する。
(ここでは、zeroというファイルを作成してdisk fullにする)

# dd if=/dev/zero of=./zerofile bs=4k; rm -f ./zerofile 
dd: writing `zero': No space left on device

上記のようにddコマンドを実行すると、容量を目一杯使ってしまい、その間にcronなどが何かファイルを生成しようものならエラーになると思われる。

0で埋め尽くした後、すぐに空ファイルを削除。



未使用領域を0で埋めたら、ESXiホストで圧縮コマンドを実行する。

# vmkfstools --punchzero [仮想マシン.vmdk]
vmfsDisk: 1, rdmDisk: 0, blockSize: 1048576
Hole Punching: 100% done.

これで膨らんだ仮想ディスクが縮小される。


なお、vmdkファイルは、ほとんど容量が無く、-flat.vmdk ファイルが実際の容量を持っているが、処理対象は vmdk ファイルである。

  • flat.vmdk に対してコマンドを実行すると、エラーになる。
# vmkfstools --punchzero 仮想マシン-flat.vmdk
Failed to open virtual disk '[仮想マシン.vmdk]': The file specified is not a virtual disk (15)


<追記>

試した環境は以下の通り。

ESXi:5.1(Update 2)
ゲストOS:「Windows XP/7」「CentOS 5.10/6.5」


続きを書きました(ゲストOSがLinuxの場合)。


ESXi5でシンプロビジョニングされた仮想ディスクを圧縮する・続き - しょぼんメモリ (´・ω・`)