VirtualBox Linux ゲストファイルシステムの圧縮

VMware の VMDK 形式のまま VirtualBox でつかっている仮想 HDD、 Linux ゲスト内では 11GB 程度の使用量なのにホストファイルシステム上では 47GB も占有している。

いかん、これではいかんよ。

ということで、 VBoxManage modifyhd で --compact しようとしたところ、 VMDK はサポートしていないというにべもないお告げ。そこで VBoxManage clonehd で --format=VDI でネイティブ形式のコピーをつくったところ 65GB に膨れ上がった。なんの、これを modifyhd --compact して圧縮するのさ!と試したところ、ぴくりとも大きさが変わらない。

マニュアルを読んでみたところ、 --compact オプションはファイルシステム内のゼロ領域を圧縮するのだそうで、んー、ゴミが残っているのかねえ…。

で、対処法。 Debian には zerofree というパッケージがあるので、これを使う。(ほかのディストリビューションを使っている場合、ソースパッケージを拾ってきて make して使う)

$ sudo init 1            # シングルユーザーモードに移行
# mount -o ro,remount /  # / をリードオンリーで再マウント。 zerofree のため必要
# zerofree -v /dev/hda1  # zerofree を配置したディレクトリーにパスを通しておくこと

zerofree の実行にはとてもとてもとても時間がかかるので覚悟して臨むべし。
それから zerofree に与えるファイルシステムは / としてマウントされるデバイスを指定すること。 / が /dev/hda1 なのか /dev/sda1 なのか、もっと別のデバイスなのかは /etc/fstab を見ればわかる。

zerofree が完了したら / を rw で再マウントしてシャットダウンする。

# mount -o rw,remount /
# shutdown -h now

VM が終了したら、こんどはホストのコマンドラインで --compact を実行。

> "%PROGRAMFILES%\Oracle\VirtualBox\VboxManage"^
 modifyhd <path.to>\<file.vdi> --compact

うまくいったらおなぐさみ。

追記

Fedora 7 では /dev/VolGroup00/LogVol00 に対して zerofree することで、 inode の 0 埋めができました。

ほかのマウントポイントに rw マウントされていると、全体として ro リマウントしたことにならないだとか、ハマりポイントがほかにもあるので注意しましょう。 mount コマンドで、対象のデバイスがほかにマウントされていないか要チェックや!
(マウントされていたら umount してはずすとか、あるいはそちらも ro マウントするか。)