内容サイズよりも大きな実サイズを持つ VirtualBox の仮想 HDD のサイズを小さくする方法

仮想マシン VirtualBox がいつの間にやらバージョン 4 になっていますね!

それはともかく、私の環境において VirtualBox の仮想 HDD (ハードディスクドライブ) の実サイズ (ホスト OS 上の VDI ファイルのサイズ) が内容サイズ (ゲスト OS 上で実際に HDD に格納されているファイルのサイズ) よりも明らかに大きくなってしまっており、なんとかして実サイズを小さくできないかなーと思って調べたので、まとめておきます。

状況

うちの環境は以下のとおり。

  • VirtualBox のバージョン : 4.0.2
  • ホスト OS : Windows 7 Home Premium (64-bit)
  • ゲスト OS : Ubuntu Desktop Edition 10.04 LTS (64-bit)

仮想 HDD はサイズ可変の VDI フォーマットで作成したものです。 ゲスト OS で大きなサイズのファイルを作ったり消したりしていたので、ゲスト OS 上でのディスクの使用済容量が 30 GB ぐらいなのに VDI ファイルのサイズが 90 GB、という状態になってしまいました。

今回の目的は、この VDI ファイルのサイズを小さくする (サイズの最適化? 最小化?)、ということです。

方法

VDI ファイルのサイズを小さくするための方法を述べます。

ゲスト OS 上の作業

まずゲスト OS 上で、仮想 HDD の不要な領域のビットを全て 0 にします。 すなわち、ビット 0 が続くファイルを空き容量いっぱいに作り、それを削除します。 Ubuntu の場合、次のコマンドを実行すればよいでしょう *1。 (別の方法でももちろん大丈夫です。)

$ dd if=/dev/zero of=zero bs=4M; rm zero

複数のパーティションに分けている場合、それぞれのパーティションで実行しなければいけません。 パーティションごとのディスク使用容量は df コマンドなどで確認できます。 また、一度ファイルシステムをいっぱいいっぱいまで使うことになるので、ホスト OS 側のディスク容量にそれだけの空き容量がある必要があります。

ホスト OS 上での作業

次に、ホスト OS 上での作業を行います。 VDI ファイルを小さくするには、VBoxManage modifyhd コマンドを --compact オプションを付けて使用します。 コマンドの説明は以下のとおり。

VBoxManage コマンドは、VirtualBox と一緒に配布されるものです。 もしかするとパスが通っていないかもしれません。 ここではパスが通っているものとして説明しますので、パスが通っていない場合はパスを通しておいてください。

VDI ファイルは "C:\VirtualBox\HD" においてあり、処理対象の VDI ファイルを "hd.vdi" とします。 次のようにコマンドを実行することで処理を行うことができます。

C:\> VBoxManage modifyhd C:\VirtualBox\HD\hd.vdi --compact

これで作業は終了です。 コマンドが問題なく終了すると、VDI ファイルは無駄が省かれて最小の状態になっているはずです。 (当然ながら元々無駄が少なければあまり小さくはなりません。)

*1:このコマンドはカレントディレクトリに "zero" という名前のファイルを作るので、同名の名前のファイルがないことを予め確認しておいてください。