VirtualBoxの可変サイズの仮想ストレージを詰めてコンパクトにする

VirtualBoxの仮想ストレージ*1.vdiファイルは、ゲストOS上で読み書きをしていると、次第にホストOSから見て無駄に容量を使います。
イメージとしては、ゲストOSから見てデフラグが発生している分、ホストOSからみて使用している容量の嵩が増える感じです。

手順

※全工程を完了するのに、かなり時間が掛かります。殆どはプログラムの処理完了の待ち時間ですが。

1. ゲストOS上で不要なデータを削除する。
2. ゲストOS上でデフラグをする。

Windows標準のデフラグだと、微妙に空白があいたりするので、http://kessels.biz/JkDefrag/ を使いました。
空白があいてても最適化されてればいいのか、データが詰まってるべきなのか、はっきりした事は分からないけど、たぶん詰まってたほうが良いはず。
jkDefragは名前を変えてMyDefragになっているみたいだけど、MyDefragはインストーラーでインストールするタイプで、面倒なのでやめました。

JkDefrag.exe -a 5

jkDefragをそのまま使っても、今回のデータを詰めるには意味がありません。
この引数を付けて起動すると、Force together モードとなって、データをなるべく近い位置に配置してくれます。

3. ゲストOS上で空き領域をゼロクリアする

SDelete - Windows Sysinternals | Microsoft Docs を使います。

sdelete.exe -c

sdeleteはコマンドラインから使います。

Usage: sdelete [-p passes] [-s] [-q]
sdelete [-p passes] [-z|-c] [drive letter]

  • c Zero free space (good for virtual disk optimization).
  • p passes Specifies number of overwrite passes.
  • s Recurse subdirectories.
  • q Don't print errors (quiet).
  • z Cleanse free space.
http://technet.microsoft.com/en-us/sysinternals/bb897443.aspx

http://d.hatena.ne.jp/kaze-kaoru/20120915/1347675604
sdelete 1.51と1.6の間で、オプションが変わり、-c と -zが入れ替わったみたいです。

-c Cleanse free space.
-z Zero free space (good for virtual disk optimization).

確かにこのほうがしっくりきますね。


一応、sdeleteが何をするかを理解してから使うことをお勧めします。

4. ゲストOSをシャットダウンする。

5. ホストOSでvdiファイルをコンパクトにする。

VBoxManage modifyhd example.vdi --compact

ゲストOSが入ってる仮想HDDファイルに対して、このコマンドを使うと、無駄に使っている分を詰めてくれます。
沢山読み書きするような、インストール作業を何度かした後とかだと、数GBくらいは取り戻せることもありました。

不要なデータをもっとしっかりと削除する

VirtualBox: VDI を圧縮する - no disturbado では、かなり周到に不要なファイルを消してました。
しっかりとやりたい人は参考になるかもしれません。

*1:イメージディスク