スパースファイルにしてディスクイメージを縮めてみろ
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ぐらいディスク領域を捻出することができた。まぁ、とりあえず良かったと言うことで。
しかしながら、仮想ディスクイメージはサイズが大きくなる一方で、小さくなることはないという性質がある。例えば、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ぐらいディスク領域を捻出することができた。まぁ、とりあえず良かったと言うことで。

0 Comments:
コメントを投稿
Links to this post:
リンクを作成
<< Home