VirutalBox の仮想ディスクファイルのサイズの圧縮

2016年5月18日

はじめに

VirtualBox の仮想ディスクファイルの圧縮についてのメモ。

可変サイズの仮想ディスクファイルのサイズ

VirtualBox において、仮想ディスクのタイプを可変サイズにしておくと、たとえばディスク容量を 50GB にしたとしても、仮想ディスクファイルのサイズは 50GB にはならず、ディスクの使用量に合わせてファイルサイズが拡張される。ただし、仮想マシンでディスク内のデータを削除しても、仮想ディスクファイルのサイズは小さくならない。

これを小さくするにはどうしたらよいか?

仮想ディスクファイルの圧縮

こちら によると、空いているところに 0 を書き込んで、vboxmanage で圧縮すればよいらしい。ゲスト OS (Linux) で以下のように実行。

cfd@cfd-VirtualBox:~$ dd if=/dev/zero of=zero bs=4k; \rm zero
dd: `zero' の書き込みエラー: デバイスに空き領域がありません
10270910+0 レコード入力
10270909+0 レコード出力
42069643264 バイト (42 GB) コピーされました、 270.406 秒、 156 MB/秒

ホスト OS (Windows) でハードディスクの UUID を調査。

C:\Program Files\Oracle\VirtualBox>vboxmanage list hdds
UUID:           78726925-ee8e-40c8-8d86-bf76b88d704b
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       C:\Users\xxxx\VirtualBox VMs\Ubuntu 14.04 LTS\Ubuntu 14.04 LTS
-disk1.vmdk
Storage format: VMDK
Capacity:       51200 MBytes

以下のように実行。

C:\Program Files\Oracle\VirtualBox>vboxmanage modifyhd 78726925-ee8e-40c8-8d86-b
f76b88d704b --compact
0%...
Progress state: VBOX_E_NOT_SUPPORTED
VBoxManage.exe: error: Compact hard disk operation for this format is not implem
ented yet!

フォーマットが VMDK ではダメらしい。VDI でないといけないらしい。

フォーマットを変更して対応する

こちら を参考に、フォーマットを VDI に変更して圧縮し、また VMDK に戻す手をとる。

VDI に変換 (クローン)。

C:\Program Files\Oracle\VirtualBox>vboxmanage clonehd "C:\Users\xxxx\VirtualBox VMs\Ubuntu 14.04 LTS\Ubuntu 14.04 LTS-disk1.vmdk" "C:\Users\xxxx\VirtualBox VMs\Ubuntu 14.04 LTS\Ubuntu 14.04 LTS-disk1.vdi" --format vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'vdi'. UUID: c453dfe3-832b-47be-9bab-ebff2f9dda85

圧縮。

C:\Program Files\Oracle\VirtualBox>vboxmanage modifyhd "C:\Users\xxxx\VirtualBox VMs\Ubuntu 14.04 LTS\Ubuntu 14.04 LTS-disk1.vdi" --compact
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

VMDK に変換。"Ubuntu 14.04 LTS-disk1.vmdk" に戻すために、オリジナルをリネームして実行。

C:\Program Files\Oracle\VirtualBox>vboxmanage clonehd "C:\Users\xxxx\VirtualBox VMs\Ubuntu 14.04 LTS\Ubuntu 14.04 LTS-disk1.vdi" "C:\Users\xxxx\VirtualBox VMs\Ubuntu 14.04 LTS\Ubuntu 14.04 LTS-disk1.vmdk" --format vmdk
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...
Progress state: E_INVALIDARG
VBoxManage.exe: error: Failed to clone hard disk
VBoxManage.exe: error: Cannot register the hard disk 'C:\Users\xxxx\VirtualBox VMs\Ubuntu 14.04 LTS\Ubuntu 14.04 LTS-disk1.vmdk' {8b949140-6a30-488c-827d-52af02aff0f9} because a hard disk 'C:\Users\xxxx\VirtualBox VMs\Ubuntu 14.04 LTS\Ubuntu 14.04 LTS-disk1.vmdk' with UUID {78726925-ee8e-40c8-8d86-bf76b88d704b} already exists
VBoxManage.exe: error: Details: code E_INVALIDARG (0x80070057), component VirtualBox, interface IVirtualBox
VBoxManage.exe: error: Context: "int __cdecl handleCloneHardDisk(struct HandlerArg *)" at line 743 of file VBoxManageDisk.cpp

ダメだった。とりあえず "disk2" として変換。

C:\Program Files\Oracle\VirtualBox>vboxmanage clonehd "C:\Users\xxx\VirtualBox VMs\Ubuntu 14.04 LTS\Ubuntu 14.04 LTS-disk1.vdi" "C:\Users\xxxx\VirtualBox VMs\Ubuntu 14.04 LTS\Ubuntu 14.04 LTS-disk2.vmdk" --format vmdk
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'vmdk'. UUID: 2862c86c-865c-421a-a22f-b505a2c0de1d

仮想マシンの設定で仮想ディスクを "disk2" に入れ替えて起動できることを確認。"disk2" を "disk1" にクローン (フォーマット変更なし) してみたが、ダメだった。

VirtualBox メニュー [ファイル]-[仮想メディアマネージャー] で仮想ディスクの登録を一旦すべて除去してからクローニング、仮想マシンに割り当てでうまくいった。

参考