Vagrantで肥大化したファイルの縮小

macのTimeMachineで容量不足の警告が出ていたため調べて見ると、Vagrantのファイルがとんでもなく肥大化していた。
その容量なんと2.16TB。SSDの容量250GBなのになぜ。。。


どうやら仮想環境内で不要なファイルが蓄積しているのが原因らしい。
ファイルの情報を見ると、実際のファイルサイズは50GBぐらいのようだけど、TimeMachineで保存するときは展開して保存するから2TB使うとかなのかな??

そんなわけで仮想環境の不要なファイルを削除して、ファイルサイズを最適化します。
作業手順としては
・仮想環境のディスクの空き容量を0で埋める
・VMDK形式からVDI形式のディスクを複製
・仮想環境のディスクを圧縮
・作成したディスクを紐付け
・不要になった元のディスクを削除
こんな感じ。

仮想環境のディスクの空き容量を0で埋める

vagrant ssh で仮想環境に接続して、以下のコマンドでディスクの0埋めを実行。

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

VMDK形式からVDI形式に変更

vagrant で仮想環境を作るとVMDK形式で作られるのだけど、これだとディスクを圧縮させることができないので、VDI形式に変換します。デフォルトでVDIにするオプションとかないのだろうか。。
先ほど接続した仮想環境を vagrant halt で止めた上で、VirtualBoxのディスクのリストを取得。
該当のディスクを確認して、それをVDI形式でコピー。

$ vboxmanage list hdds
UUID: b6e9239d-680c-4dec-973c-2ec51d6b1000
Parent UUID: base
State: created
Type: normal (base)
Location: /path/to/box-disk001.vmdk
Storage format: VMDK
Capacity: 65536 MBytes
Encryption: disabled

$ vboxmanage clonehd b6e9239d-680c-4dec-973c-2ec51d6b1000 /patu/to/box-disk001.vdi --format vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone medium created in format 'vdi'. UUID: b9fb9580-6bb2-4e90-8612-99d5f68fd544

仮想環境のディスクを圧縮

VDI形式で作成したディスクを以下のコマンドで圧縮。

$ vboxmanage modifyhd /path/to/box-disk001.vdi --compact
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

作成したディスクを紐付け

仮想環境の情報を取得して、先ほど作成したディスクを紐付け。
マシンによってSATA ControllerではなくIDE Controller だったりするので、確認をして作業をしてください。

$ vboxmanage list vms
"vccw.test" {57fc230d-f0b3-42b2-b3fe-815848b73af5}

$ vboxmanage showvminfo 57fc230d-f0b3-42b2-b3fe-815848b73af5
...
Storage Controller Name (0):            IDE Controller
...
SATA Controller (0, 0): /path/to/box-disk001.vmdk (UUID: b6e9239d-680c-4dec-973c-2ec51d6b1000)
...

$ vboxmanage storageattach 57fc230d-f0b3-42b2-b3fe-815848b73af5 --storagectl 'SATA Controller' --port 0 --device 0 --type hdd --medium /path/to/box-disk001.vdi

不要になった元のディスクを削除

接続ができたかどうか、仮想環境を立ち上げて見て確認。大丈夫そうなら不要になった元のディスクを削除します。

$ vboxmanage closemedium disk b6e9239d-680c-4dec-973c-2ec51d6b1000 --delete

これで完了。ディスクの空きが増えて、無事TimeMachineへのバックアップができるようになりました。