[Vagrant & VirtualBox] VirtualBox のディスクサイズを縮小する

肥大化した仮想ハードディスクを縮小します。

以下のバージョンで確認しています。

% vagrant version
Installed Version: 2.2.5
Latest Version: 2.2.5

You're running an up-to-date version of Vagrant!
% VirtualBox --help
Oracle VM VirtualBox VM Selector v6.0.10
(C) 2005-2019 Oracle Corporation
All rights reserved.

No special options.

If you are looking for --startvm and related options, you need to use VirtualBoxVM.

ディスクの縮小

vagrant up でゲスト OS を起動します。
ゼロ書き込みが完了した後、ホスト OS に戻ります。

% vagrant up
% vagrant ssh

$ dd if=/dev/zero of=zero bs=1M; \rm zero
dd: error writing 'zero': No space left on device
57607+0 records in
57606+0 records out
60404719616 bytes (60 GB, 56 GiB) copied, 775.581 s, 77.9 MB/s

$ exit

ホスト OS でディスクの Location を確認します。

% VBoxManage list hdds
UUID:           b59506c6-1152-4d68-a267-133f3b31cdd5
Parent UUID:    base
State:          locked write
Type:           normal (base)
Location:       /Volumes/WDHD/VirtualBox_VMs/deadwood2/box-disk001.vmdk
Storage format: VMDK
Capacity:       65536 MBytes
Encryption:     disabled

VMDK フォーマットは縮小ができないため .vmdk から .vdi のクローンを作成します。
VM を停止した後に実行します。

% vagrant halt

% VBoxManage clonehd /Volumes/WDHD/VirtualBox_VMs/deadwood2/box-disk001.vmdk /Volumes/WDHD/VirtualBox_VMs/deadwood2/box-disk001.vdi --format vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone medium created in format 'vdi'. UUID: b3a4b065-2357-4ed5-b3fa-320515852db8

変換したディスクの UUID を指定してサイズを縮小します。

%  VBoxManage modifyhd b3a4b065-2357-4ed5-b3fa-320515852db8 --compact
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

ディスクの入れ替え

VirtualBox の 仮想メディアマネージャーを開き、右クリックから変換前のディスクを「解放」して下さい。
後述の全ての確認が終わり不要になったら同じ手順で「除去」します。

マネージャーに戻り、対応する VM の設定を開きます。

ストレージが未指定となっています。

利用していたコントローラーを選択して変換した仮想ディスクを追加します。

以上で終了です。

参考ソース