VirtualBox の仮想ディスクのサイズを変更する


Vagrant + VirtualBox を使用していて、
実際に動かしている途中で仮想ディスクのサイズが不足してくること、ありますよね。
うんうん。あるある。よくあるよくある。

VirtualBoxのGUIから仮想マシンを作成していたりすると分かりますが、仮想マシンのディスクにはいくつか形式があります。
Vagrantを使用していると仮想ディスクは **VMDK** 形式になりますが、実はこの形式、作成後のサイズ変更がサポートされていません。
サイズ変更をサポートしている形式は **VDI** です。
そこでVMDK形式の仮想ディスクを一旦VDI形式に変換し、サイズを変更した後でVMDK形式に戻せば
結果オーライ的に仮想ディスクのサイズを変更することが可能になります。

## ざっくり手順

* VMDK形式のディスクをVDI形式にクローン
* クローンしたVDI形式の仮想ディスクのサイズを変更
* 変更したVDI形式の仮想ディスクをVMDK形式に再度クローン
* クローンしたVMDK形式の仮想ディスクを仮想マシンに設定
* おそうじ

## 仮想マシンを確認

`VBoxManage list hdds` で仮想メディアマネージャーのハードドライブ一覧っぽい出力を得られます。

```
$ VBoxManage list hdds
UUID:           47ab0f40-a26b-4243-a4aa-61f00994c9da
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /Users/niwashun/VirtualBox VMs/MyProject/Ubuntu 13.10 Saucy/ubuntu-saucy.vmdk
Storage format: VMDK
Capacity:       81920 MBytes

UUID:           6d467c6a-ec18-4c90-ab26-bf3503fa57f3
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /Users/niwashun/VirtualBox VMs/MyProject/Elasticsearch/Elasticsearch.vmdk
Storage format: VMDK
Capacity:       81920 MBytes

UUID:           692e2de9-26e7-42d8-b61a-b8e951d306da
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /Users/niwashun/VirtualBox VMs/MyProject/Couchbase03/disk/Couchbase03.vmdk
Storage format: VMDK
Capacity:       81920 MBytes

UUID:           d1985caf-91e6-44cf-abed-fb11f906115c
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /Users/niwashun/VirtualBox VMs/MyProject/Couchbase04/Couchbase04.vmdk
Storage format: VMDK
Capacity:       81920 MBytes

```

UUIDを指定すると詳細を確認できます。

```
$ VBoxManage showhdinfo 692e2de9-26e7-42d8-b61a-b8e951d306da
UUID:           692e2de9-26e7-42d8-b61a-b8e951d306da
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /Users/niwashun/VirtualBox VMs/MyProject/Couchbase03/disk/Couchbase03.vmdk
Storage format: VMDK
Format variant: dynamic split2G
Capacity:       81920 MBytes
Size on disk:   30531 MBytes
In use by VMs:  Couchbase03 (UUID: c72602f8-7f78-47ff-ad57-eac4a648d3c2)
```

サイズを変更しようとすると怒られますね。

```
$ VBoxManage modifyhd 589ecfc5-5e76-4658-ad6e-a890294c1aa8 --resize 16384
0%...
Progress state: VBOX_E_NOT_SUPPORTED
VBoxManage: error: Resize hard disk operation for this format is not implemented yet!
```

## クローン＆サイズ変更

それではVMDK形式の仮想ディスクから、サイズ変更が可能なVDI形式のクローンを作成してみましょう。

```
$ VBoxManage clonehd "/Users/niwashun/VirtualBox VMs/MyProject/node1.elasticsearch/box-disk1.vmdk" "/Users/niwashun/VirtualBox VMs/MyProject/node1.elasticsearch/clone.vdi" --format vdi

0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'vdi'. UUID: 3ff29e54-a934-486f-8d42-432a954031b8
```

VDI形式の仮想ディスクのサイズを変更します。

```
$ VBoxManage modifyhd "/Users/niwashun/VirtualBox VMs/MyProject/node1.elasticsearch/clone.vdi" --resize 16384
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
```

先ほどとは逆に、VDI形式からVMDK形式のクローンを作成します。
特に深い意味はありませんが、2GB単位でファイルを分割して管理するオプションを指定するようにしてみます。

```
$ VBoxManage clonehd "/Users/niwashun/VirtualBox VMs/MyProject/node1.elasticsearch/clone.vdi" "/Users/niwashun/VirtualBox VMs/MyProject/node1.elasticsearch/box-disk2.vmdk" --format vmdk --variant Split2G
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'vmdk'. UUID: 4b603057-ced4-40d0-9156-f5ded0b52f01
```

できました。
この仮想ディスクを仮想マシンに設定すれば完了です。

```
$ VBoxManage showhdinfo 4b603057-ced4-40d0-9156-f5ded0b52f01
UUID:           4b603057-ced4-40d0-9156-f5ded0b52f01
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /Users/niwashun/VirtualBox VMs/MyProject/node1.elasticsearch/box-disk2.vmdk
Storage format: vmdk
Format variant: dynamic split2G
Capacity:       16384 MBytes
Size on disk:   1146 MBytes
```

最後に不要になったディスクを解放しておきましょう。

```
VBoxManage closemedium disk 3ff29e54-a934-486f-8d42-432a954031b8
```