Windows TIPS
[System Environment]
  Windows TIPS TOPへ
Windows TIPS全リストへ

仮想ハードディスクのデフラグに注意

デジタルアドバンテージ 打越 浩幸
2005/03/05
2005/03/15 更新
 
対象ソフトウェア
Virtual PC 2004
Virtual Server 2005
仮想マシン上のハードディスクの内容は、実際には仮想ディスク・ファイルに格納されている。このファイルは可変長であり、未使用領域に対する書き込みがあると、その分だけ拡大される。
仮想ハードディスクに対してデフラグを実行すると、仮想ディスク・ファイルのサイズが増えるので注意が必要だ。デフラグすると、未使用領域への新たな書き込みが発生するからである。
パフォーマンスを重視するなら、固定長の仮想ディスク・ファイルにするなどの対策も併用するとよい。
 
解説

仮想ディスクとその原理

 Virtual PC 2004やVirtual Server 2005では、コンピュータの中にさらに仮想的なハードウェア・システム(仮想マシン環境)を構築し、その上でさまざまなOSやアプリケーションを動作させる。仮想マシンにはハードディスクも用意されているが、これは「仮想ハードディスク」と呼ばれ、実際には、ホストOS上の1つのファイルで実現されている。例えば仮想マシンVM01に対して、16Gbytesのサイズの仮想ハードディスクを割り当てたとすると、仮想ハードディスクの内容はVM01.VHDというファイルに格納されることになる(.VHDは仮想ハードディスク・ファイルの拡張子)。そして、VM01の中でディスク入出力を行うと、それは実際にはファイルVM01.VHDというファイルに対する読み書きとなる。

 ところで仮想ハードディスクのサイズは16Gbytesだとしても、Virtual PC 2004やVirtual Server 2005の仮想ディスクでは、これをそのまま実際のファイルに割り当てたりはしない。ディスクには未使用領域が含まれるのが普通なので、これを考慮し、無駄にディスクを使用するのを防いだり、実際のディスク入出力を抑えたりするため、本当に必要な部分だけをファイルに記録するようにしているからだ。これを可変容量の仮想ハードディスクという(ほかに、固定長や差分タイプも選択できる)。

 では「本当に必要な部分」をどうやって判断するかというと、その原理は非常に単純である。全ディスク領域のうち、一度でも書き込んだことがあればそれを仮想ディスク・ファイルに書き込み、そうでなければ書き込まない、となっている。書き込んでいないディスク領域を読み出すことは通常ではありえないので、そのような領域は仮想ディスク・ファイルに記録しておく必要はない。仮想ディスクに対する書き込みがあった部分だけを仮想ディスク・ファイルに記録しておけば十分と考えられる。実際には、未使用部分には0(ゼロ・データ)が書き込まれているものとして扱われる。

 以上のような原理のため、可変容量の仮想ハードディスク・ファイルは、初期サイズはほとんど0だけれども(正確には、ディスク先頭にはブート・レコードなどの領域があるので、0ではない)、仮想マシンに対して、OSやアプリケーションをインストールしたり、ファイルを作成したりしていると、そのサイズはどんどん大きくなってくる。そして、ディスク・フルになるほどデータを書き込むと、最大サイズ(この場合なら16Gbytes)になる。サイズは拡大する一方で、小さくなることはない(どこが未使用になったのか、仮想マシン・ソフトウェアでは分からないから)。

仮想ディスクに対するデフラグ

 さてそれでは、仮想マシン上のOS(ゲストOS)上で、ディスク領域をデフラグするとどうなるだろうか。

 通常使っているコンピュータでは、OSやアプリケーションのインストール直後だけでなく、定期的にデフラグを実行して、ファイル・システムのフラグメントを除去するのは普通だろう。フラグメントが解消されると、ファイル・アクセスなどが高速に行えるようになり、パフォーマンスも向上するからだ。しかもVirtual PCやVirtual Serverでは、マスターとなる仮想マシンのイメージをコピーして利用することが多いため、最初に一回デフラグをかけておくだけで十分だと考えられる。

 だが実際に、ゲストOS上でディスク領域をデフラグすると、仮想ディスク・ファイルのサイズは何割か大きくなってしまう。例えば手元のVirtual Server 2005上で、Windows 2000 ServerをゲストOSとする仮想マシン環境を作成して実験したところ、デフラグする前は2Gbytes程度だった仮想ディスク・ファイルのサイズは、デフラグ後には3Gbytes弱になってしまった(仮想ディスクのサイズは16Gbytes)。イメージをバックアップなどの目的で保存しておいたり、コピーしたりして利用するには、サイズが大きくて都合が悪い。デフラグする前のイメージの方が扱いやすかった。

デフラグでサイズが増える理由

 デフラグは、ファイルの内容を改変するものではないし、ファイル・サイズを変更するようなものでもない。ただファイルの配置を変更して、空き領域を詰めているだけである。だがこれが原因で仮想ディスク・ファイルのサイズが拡張されてしまう。その原理はこうである。

 デフラグとは簡単にいえば、既存のファイルを、どこか別の空き領域を見つけてコピーし、元の領域を空き領域にする、という動作の繰り返しである。移動先の空き領域は、もともとはディスク上の「未使用領域」だった可能性が高い。特にディスクの利用率が低い初期の段階では、デフラグで移動する先は、デフラグの開始時点では未使用だった領域の場合がほとんどだろう。未使用だった領域に新たにデータを書き込むということは、それは結局、仮想ディスク・ファイルの拡大をもたらすことになる。

デフラグによる新たな領域への書き込み
仮想ディスクのドライバにとっては、ファイル・システム上の未使用領域(図中の[未使用領域]の部分)は分からないので、結局、書き込みがあった部分をすべて物理的なディスクに保存するしかない。デフラグを行うと、以前は未使用だった領域に新たにデータを書き込むことになり、それが結局、仮想ディスク・ファイルの拡大につながる。

 これを実際のデフラグ管理ツールの画面で見ると、次のようになっている。デフラグ前には未使用だった領域に新たにファイルが書き込まれている。その分だけ仮想ディスク・ファイルのサイズが拡大している。

デフラグの前後の状態
デフラグを実行すると、以前未使用だった領域にデータが移動してきている。
  このあたりのデータが、一カ所にまとめられている。
  このサイズの分だけ、仮想ディスク・ファイルのサイズが拡大された。
  ここは未使用になったが、仮想ディスク・ファイルから削除されることはない。

仮想ディスクはデフラグするべきか?

 仮想ディスクは、実際にはホストOS上のファイルとして実現されている。そのため、ゲストOS上でフラグメントが大量に発生すると、それは最終的にはファイル・アクセス時のランダム性(アクセスのちらばり具合)が多少増える程度であると考えられる。ファイル・アクセスはホストOSによって高度に管理・最適化されているため、実際の物理的なコンピュータとは比較にならないくらい、影響は小さくなるだろう。よって、特にデフラグしなくてもよいと思われるが、仮想ディスク・ファイルが拡大しても問題がないのであれば、実行しても特に問題はないし、その方が望ましい。

 ただ、フラグメントが大量に発生していると、ゲストOS内部でのファイル・キャッシュ管理などに影響が及び、ゲストOS上のアプリケーションのパフォーマンスが低下することも考えられる。パフォーマンスを重視するなら、可変長の仮想ディスク・ファイルをやめて固定長の仮想ディスク・ファイルを利用したり、仮想マシンに割り当てるメモリを増やすなどの対策も必要だろう。

仮想ディスク・ファイルの未使用領域を解放するには?

 以上のように、仮想ディスク・ファイルのサイズは拡大する一方である。だが何らかの手段でファイル・システム中の未使用領域を見つけ出し、それらを解放するような方法があれば、仮想ディスク・ファイルのサイズを縮小させ、必要最小限のサイズにすることが可能となる。以下、その方法についていくつか紹介する。

■ディスク事前圧縮ツールを利用する
 Virtual PC 2004 SP1およびVirtual Server 2005 R2には、「Microsoft バーチャル ディスク事前圧縮ユーティリティ」という追加ツール(precompact.exe)が用意されている。これをゲストOSのWindowsシステム上で実行すると(あらかじめデフラグしておくとよい)、ファイルとして利用していない領域にすべて「0(バイナリ・データのゼロ)」が書き込まれる。つまり仮想ディスク・ファイル中の未使用領域の内容をゼロ・クリアするのである。ゲストOSを停止・終了後、仮想ディスク・ファイルを「圧縮」すると、ゼロ・クリアされた部分が削除され、その分だけファイル・サイズが縮小する。このツールの具体的な使い方については、TIPS「仮想ハードディスクを圧縮する(Virtual PC 2004編)」「仮想ハードディスクを圧縮する(Virtual Server 2005 R2編)」を参照していただきたい。

Virtual PC 2004 SP1/Virtual Server 2005 R2付属の事前圧縮ツール
事前圧縮ツールを実行すると、(仮想)ディスク上の未使用領域にゼロ・データが書き込まれる。その後ディスク・ファイルを圧縮すると、ゼロ・データ部分が削除され、ファイル・サイズが縮小する。

■サードパーティ製のディスク・コピー・ツールを利用する
 サードパーティ製のディスク・トゥ・ディスクのコピーを行うツールなどを利用すれば、未使用領域を除外して、仮想ディスク・ファイルのサイズを縮小させることができる(やはり、事前にデフラグしておくとよい)。例えばSymantec Ghostのようなツールでは、ファイル・システムを認識してファイル部分だけをコピーする機能を持っている。このようなツールを使って、既存の仮想ディスク・ファイルから新しい仮想ディスク・ファイルへでコピーを行えば(もちろん仮想マシン上で実行する)、ファイルが使用している部分だけをコピーすることができる。先ほどの環境で実験したところ、2Gbytesから3Gbytesに拡大した仮想ディスク・ファイルは、この方法で1.5Gbytes程度にまで縮小した。ただしファイルとしてではなく、単にディスクのセクタの内容を丸ごとコピーするタイプのツールでは、コピーされた仮想ディスク・ファイルのサイズは変わらない。

■ゲストOSにマウントしてファイル・コピーする
 別のゲストOSに仮想ディスク・ファイルをマウントし、その内容を、新しく作成した空の仮想ディスクへエクスプローラなどでファイル・コピーを行えば、必要な部分だけを含む仮想ディスク・ファイルを作ることができる。ただしこの方法では、OSからはアクセスできないようなデータ領域(ブート・セクタなど)や特殊なファイルはコピーできないので、注意が必要である。End of Article

関連記事(Windows Server Insider)
Windows TIPS:仮想マシンの実行優先度を調整する(Virtual PC 2004編)
Windows TIPS:仮想マシンの実行優先度を調整する(Virtual Server 2005編)
Windows TIPS:仮想マシンの終了方法を理解する(Virtual Server 2005編)
Windows TIPS:起動するプログラムの優先度を変更する方法
Windows TIPS:Virtual PCの仮想マシンへのショートカットを素早く作成する
Windows TIPS:仮想ハードディスクのデフラグに注意
Windows TIPS:仮想ハードディスクを圧縮する(Virtual PC 2004編)
Windows TIPS:仮想ハードディスクを圧縮する(Virtual Server 2005 R2編)
製品レビュー:デスクトップOSのマイグレーションを支援するVirtual PC 2004
製品レビュー:サーバ・システムの統合/マイグレーションを推進するVirtual Server 2005
 
関連リンク
  Virtual PC 2004製品情報(マイクロソフト)
  Virtual PC 2004 Service Pack 1(マイクロソフト)
  Virtual Server 2005製品情報(マイクロソフト)
     
更新履歴
【2005/03/15】最後の「仮想ディスク・ファイルの未使用領域を解放するには?」の部分において、Virtual PC 2004 SP1の「Microsoft バーチャル ディスク事前圧縮ユーティリティ」に関する記述を追加しました。
 
「Windows TIPS」


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間