VirtualBox の Guest OS 上で不使用部分を 0 で埋めてから、Host OS 上で VBoxManage.exe を使って不使用部分を圧縮することにより、Host OS 上の VMI のファイルサイズを縮小する事ができます。
ただ、UUID を調べたりなんやりで結構面倒です。そこで、私の環境では Bash on Git for Windows があったので、ここで動作する Shell Script を作成してみました。
存在する VMI をすべて一括で圧縮します。
vmi-compact.sh
#!/bin/bash
#
# Vurtula Box のドライブの 空白部分を圧縮する。
#
# Guest OS (Linux) で以下のコマンドを実行し、未使用領域を 0 で埋めてから実行
# もしも、細かくパーティションを分けていたら、それぞれのパーティション上で
# 実行が必要になる
#
# dd if=/dev/zero of=/tmp/zero bs=4k; rm /tmp/zero
#
# bs の値はファイルシステムに依る
# 環境に合わせて実行ファイルへのパスを調整
VMAN='/c/Program Files/Oracle/VirtualBox/VBoxManage.exe'
uuids=`"${VMAN}" list hdds | sed -n 's/^UUID:[ ]*//p' | xargs`
for id in ${uuids[@]}; do
"${VMAN}" showmediuminfo $id
"${VMAN}" modifymedium $id --compact
"${VMAN}" showmediuminfo $id
done
要は VBoxManage list hdds
で取得した UUID で modifymedium
を回しているだけですが。
私は、Windows PowerShell は思想が違いすぎてついて行けないので、自動化についてはやっぱり MS-Windows よりも Unixen の方が便利ですね。