VMwareゲストの論理ボリュームを圧縮する方法

私はVMwareのゲストとしてLinuxをインストールする際に特に理由がない限り論理ボリュームマネージャ(LVM)は使わない。少しでもゲストOSの負担を減らすため。そのためにズーっと気がつかなったのだけども、ゲストのLVMを使ったファイルシステムvmware-toolboxを使っても仮想ディスクをあまり効率的に圧縮できないようだ。

例えば、次のlsの結果はLVMを使ったゲストOS(Fedora 8)の仮想ディスクを圧縮している状態(圧縮終わった瞬間の状態)のものだ。(ホスト上でゲストの仮想ディスクの大きさを確認している。)

[vmware@vmhost Fedora-8]$ ls -l
-rw------- 1 vmware vmware 5892145152 2008-08-18 17:12 Fedora-8.vmdk
-rw------- 1 vmware vmware 5618270208 2008-08-18 17:20 Fedora-8.vmdk.dfgshkgrw-tmp

圧縮前のディスクサイズは5.9GB、圧縮後は5.6GBで約300MBしか圧縮できていない。
この圧縮直後、ゲスト上である操作をして、再度vmware-toolboxを使って圧縮すると次のようになる。

[vmware@vmhost Fedora-8]$ ls -l
-rw------- 1 vmware vmware 5642321920 2008-08-18 17:25 Fedora-8.vmdk
-rw------- 1 vmware vmware 4670095360 2008-08-18 17:32 Fedora-8.vmdk.dfgshkgrw-tmp

5.6GBの仮想ディスクが4.6GBと約1GB圧縮できている。ちなみに、このゲストは約8GBの仮想ディスクを持ち、3.5GBをLVM上のファイルとして、2GBをスワップとして使っている。(更にどの程度圧縮できるかは環境によってことなる。例えば“卸したて”のHDDのように空き領域が綺麗な場合は最初から圧縮率が高くなっているので、この操作をしても劇的な追加圧縮にはならない可能性がある。)

そのゲストOSで行うある操作とは次の2つのコマンドだ。

[root@Fedora-8 ~]# dd if=/dev/zero of=/zero bs=512M
[root@Fedora-8 ~]# rm /zero

余りLVMは使っていないので、他の環境でもこの方法でこの程度の効果あるかまでは計測していないが、ある程度の効果はあるのではないかと思う。

この2つのコマンドはファイルシステムの中で使っていない部分をゼロで埋め尽くす、ということを行っている。

(この図は分かりやすくするため、使用領域と空き領域とに分けて書いてあるが、実施にはこの2つのエリアがディスクの中に混在している。)
最初のコマンドで、内容がゼロの巨大ファイルを空き領域に作成してファイルシステムを一杯にして、2番目のコマンドでそのファイルを消去している。こうすることによって、空き領域はほぼゼロで埋め尽くされる。

この方法は別に仮想マシンの仮想ディスクだけではなく、実際のHDDや、HDDイメージファイルを効率良く圧縮して保存しておく時にいつも使っている方法だ。例えば次のように。

# mount -o loop hdd.img /mnt
# dd if=/dev/zero of=/mnt/zero
# rm /mnt/zero
# umount /mnt
# bzip2 hdd.img

この方法は、固定サイズの仮想ディスクをtar等で圧縮アーカイブする際にも使える。しかし、可変サイズのディスクではわざわざこのコマンドを使わなくてもVMwareToolsが圧縮の前処理として同様のことをやっている、と推測できる。これはゲストがLinuxでもWindowsで同じことをやっているようで、例えば次のようにWindowsゲストでVMwareToolsを使って“圧縮の準備”をすると、圧縮の準備の終わる瞬間にはディスクの空き領域は0になっている。(デフラグツールの“空き領域”と“空き領域の割合”で確認。)このゲストのディスクは実際には2.3GBの空き領域がある。

ところが、Linuxゲストで論理ボリュームを使っている場合には、vmware-toolboxではこのような前処理はしないようである。(なぜだか分からないが。何か理由があるのだろうか???)仕方ないので、手動で強制的にゼロで埋め尽くしてみたところ、上のようにそれなりの効果が認められた。

関連セルフリンク

仮想マシンの効率的バックアップ