前回の方法では、dd コマンドで空き領域に0を書き込み、vmkfstools でその領域を解放するものでした。
ESXi5でシンプロビジョニングされた仮想ディスクを圧縮する - しょぼんメモリ (´・ω・`)
dd コマンドで何度か0を書き込んでも、vmkfstools でVMDKを縮小できないケースがありました。
そこで、dd コマンドではなく、zerofree というコマンドを使用して、空き領域に0を書き込んで試してみました。
【環境】
ESXi-5.1(Update 2)
ゲストOS:CentOS 5/32bit
zerofree のソースコードの入手はここから。
http://intgat.tigress.co.uk/rmy/uml/index.html
RPMファイルの入手はここから。
RPM Search
http://rpm.pbone.net/
「Advanced RPM Search」をクリックして詳細検索のフォームを表示し、RedHat EL5/CentOS 5にチェックを入れて、「zerofree」で検索する。
「RedHat EL 5」用のRPMしか検索結果に表示されないけれど、CentOSでも使えるのでダウンロードする。
RPMファイルを入手してインストール。
# wget ftp://ftp.pbone.net/mirror/download.fedora.redhat.com/pub/fedora/epel/5/i386/zerofree-1.0.1-5.el5.i386.rpm # rpm -ivh zerofree-1.0.1-5.el5.i386.rpm
内容を確認。
# rpm -ql zerofree
/usr/sbin/sparsify
/usr/sbin/zerofree
/usr/share/doc/zerofree-1.0.1
/usr/share/doc/zerofree-1.0.1/COPYING
/usr/share/doc/zerofree-1.0.1/index.html
manが無いので、ヘルプを表示・・・されず構文が表示されるだけ。
# /usr/sbin/zerofree --help /usr/sbin/zerofree: invalid option -- - usage: /usr/sbin/zerofree [-n] [-v] filesystem
Ubuntu だけど、manをネットで発見。
http://manpages.ubuntu.com/manpages/lucid/man8/zerofree.8.html
- n:テスト実行。
- v:詳細表示。進捗が表示される。
シングルユーザモードで、読み取り専用で再マウントして実行する。
# init 1 # mount -o remount,ro / # zerofree -v /dev/sda2
/home のパーティションを分けている等、複数のパーティションがある場合は、全てのパーティションで繰り返す。
完了したら再マウントして、仮想マシンを停止。
# mount -o remount,rw / # poweroff
不安だったので、ここで仮想マシンを一度起動してみて、正常に起動するのを確認後、再び仮想マシンを停止。
この後、以前と同じく vmkfstools コマンドで圧縮すると、今度はVMDKのサイズが減ったのを確認できた。
ところで、
dd がバッファにキャッシュされていた可能性があるので、dd の後に以下を実行して縮小を試してみれば良かったかもしれない(先に zerofree したので未検証)。
# sync; echo 3 >/proc/sys/vm/drop_caches
あるいは、dd にオプションの「iflag=direct」「oflag=direct」を付けてキャッシュしないようにするとか?(未検証)