スパースファイルにしてディスクイメージを縮めてみろ

2011/06/19

Oracle Virtual Boxの仮想ディスクイメージは、他の仮想化ソフトと同じように可変サイズのディスクイメージというのをサポートしている。つまり、仮想OSに対して、例えば50GBのディスク領域を割り当てたとしても、実際に使用する分しかディスクイメージのファイルは割り当てられないというやつだ。これを使うと、物理ディスクの領域を節約することができて、何かといいことがある。

しかしながら、仮想ディスクイメージはサイズが大きくなる一方で、小さくなることはないという性質がある。例えば、50GBのうちある時40GB使っていたとすると、仮想ディスクイメージは少なくとも40GBのサイズになる。その後、仮想OSでのディスク使用量が少なくなって10GBまで減ったとしても、40GBまで膨れあがった仮想ディスクイメージが縮むことはない。

まぁ、仕方がないといえば仕方がないのだろう。だが、その領域は完全に無駄であり節約したくなってくる。ましてディスクが足りなくなる可能性があるときには尚更だ。

そういうことで、ちょっと安直な対応方法を思いついたのでやってみることにした。

まず、仮想OSを立ち上げて最適化する。次に、ディスクフルを引き起こすまで空き領域を0で塗りつぶす。具体的には下記のようなプログラムを実行する。

int _tmain(int argc, _TCHAR* argv[])
{
char buf[4096] = { 0 };
DWORD WroteSize = 0;
HANDLE h = CreateFile(
argv[1], GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
);
while ( ::WriteFile( h, buf, sizeof( buf ), &WroteSize, NULL ) );
CloseHandle( h );
DeleteFile( argv[1] );
return 0;
}

次に仮想OSを落として、ディスクイメージのファイルを直接スパースファイルにして0の部分をスキップするようにしてしまう。

そうすることで、「かつて使われていた部分」も含めて空き領域を全て排除することが可能になる。

実例を挙げるとこうなる。

まずは変換前の状態。



全部で152GBある。また、これらは通常のファイルであり、見た目のサイズと実際のサイズは同じである。



これらのファイルに対して、上記のような操作を加えてファイルの圧縮を図る。

するとこうなる。



論理的には何も変わっていないにもかかわらず、40GBぐらいディスク領域を捻出することができた。まぁ、とりあえず良かったと言うことで。

ディスプレイが大きい

2011/06/07

ディスプレイを新調した。DellのU3011である。前から欲しいと思っていたが、ついに買ってしまった。

とりあえずでかい。2560×1600である。




右上にある草原の壁紙を設定しているのが、1920×1080のWindows XP 32bitである。左上にあるのが1024×768のWindows XP 64bitである。

フルHDが小さく見えて笑えてくる。