更に高圧縮のバックアップを取るには

単にtarでbzip2を使ってバックアップ取るだけでも目的は達成できる。しかし、仮想マシンのファイルは大きいので、出来る限りコンパクトなバックアップを取りたい。そういう場合はbzip2の性質を活かして次のような方法が有効だ。

1. 仮想マシンWindows系であればデフラグをかける
2. 一旦、仮想マシンファイルシステムを「オールゼロ」のファイルで満たし、ファイルを削除する
3. 直ぐにシャットダウンしてバックアップする

仮想マシンファイルシステムが例えば60%使用済みで40%は未使用の場合、この40%部分にはゴミが入っている。一方、bzip2はパターンが繰り返すデータには非常に圧縮率が高く働くが、完全にランダムなデータに対しては殆ど圧縮することはできない。そこで、未使用の部分に「オールゼロ」のパターンを書き込んでおいて、その部分を限りなくゼロに近い大きさで圧縮してしまおうという方法である。(この方法はddなどでパーティションのイメージごとバックアップする場合も有効。)

上の2の具体的な方法として、仮想マシンLinuxであれば

# dd if=/dev/zero of=/tmp/dummy bs=82252800
# rm /tmp/dummy

とすればいい。(ここで、ブロックサイズは小さいと何回もディスクの書込みが発生するので時間がもの凄くかかってしまう。かと言って大きすぎると利用可能なメモリ以上になりスワップが発生するので効率が下がってしまう。freeコマンドなどで利用できる有効なメモリ量を確認の上、ブロックサイズは適当に決める。(上の例の82252800は、1シリンダの大きさが8225280(約8MB)でフリーメモリが140MB(仮想マシンとしては256MBの割り当て)だったので、82252800(約80MB)にしておいた。))

Windows環境の場合は、UNIX系のddに相当するコマンドを私は知らなかったので次のようにした。

2-1. ホストOS(Linux)上でddコマンドで約1GBのファイルを作る(下の例ではdummyとする)
2-2. 次のコマンドでISOイメージ(DVDイメージ)を作成する

# dd if=/dev/zero of=dummy bs=82252800 count=13
# genisoimage -o dummy.iso dummy
# rm dummy

2-3. 作成した dummy.iso を仮想マシンのDVDデバイスとして指定して仮想マシンを起動する。
2-4. DOSコマンドなどでファイルをコピーしてファイルシステムを一杯にする。

> copy D:\dummy dummy-1
> copy D:\dummy dummy-2
		:
> type D:\dummy > dummy-n

> del dummy-1
> del dummy-2
	:
> del dummy-n

(最後、copyではなくtypeを使っているのが、copyだとコピー先のファイルの容量が余っていないとコマンドを実行してくれない。例えは残りが900MBのときは1GBのファイルをコピーできない。そこで、端数分はtypeコマンドでコピーしている。)

### 後日記
最初から3GBとか4GBのisoファイルを作って、それを「type」すればいい。
### 後日記終

この方法でバックアップを取ると、

Virtual Machine Actual Size Compressed Size
Vyatta 1.0GB 90MB
Ubuntu 3.5GB 960MB
Windows 2000 4.2GB 900MB

(VyattaはVMwareのAppliance MarketplaceにあったVMware上で動く「ルータ・アプライアンス」のパッケージ。)

このように、結構コンパクトにバックアップを取ることが可能である。勿論、圧縮率は仮想マシン上で、どの程度のファイルシステムが未使用になっているかによって変わってくる。未使用の領域が少なければ圧縮率は低下する。(それでも経験的にはbzip2を使うと2/3〜1/2位には圧縮できるようだ。)

最後に、bzip2は圧縮に大変時間がかかる。上記のUbuntu仮想マシンを圧縮するのに数十分位はかかった。