[Vagrant][Windows][VirtualBox] Vagrantで作成したVMのディスクサイズを拡張する

Ubuntuの公式boxからVagrantでイメージを作成したが、容量が40GBのためディスクサイズが足りなくなりました。
そのため、VMの容量の拡張を行った手順のメモになります。（Vagrantというよりは、VirtualBoxのディスクサイズ拡張の手順です）

※操作を `Git Bash` 上で行ったため、一部 bash 固有の操作が含まれていますのでご注意下さい

# 検証環境
今回の検証環境は以下になります。

| パッケージ名| バージョン          |
|------------|--------------------|
| Host OS    | Windows 7  64bit   |
| Vagrant    | 1.9.1              |
| VirtualBox | 5.1.12 r112440     |
| base box   | ubuntu/trusty64    |

# 実行手順（簡易版）

1. ディスクのフォーマットを vmdk => vdi に変換
2. vdi のディスクサイズを拡張
3. ディスクフォーマットを vdi => vmdk に変換
4. ゲストOSの仮想ディスクを差し替える
5. ディスクサイズが拡張されていることを確認する
6. 生成したvdiと、変更前の仮想ディスクを管理下から外す

# 実行手順（詳細）
## 事前準備

以降の手順は、`VBoxManage.exe` が存在しているディレクトリにPATHが通っていることを前提とします。
インストール時の設定によって違いますが、基本的には以下のような場所に存在しているはずです。

```text:VBoxManage.exeが存在するディレクトリにPATHを通す
C:\Program Files\Oracle\VirtualBox
```

また、実行前には `vagrant halt` 等で、VMを停止させて下さい。

今回は、Atlasで公開されている `ubuntu/trusty64` をベースとしています。

```console:拡張前のディスクサイズ
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            241M   12K  241M   1% /dev
tmpfs            49M  348K   49M   1% /run
/dev/sda1        40G  1.4G   37G   4% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
none            5.0M     0  5.0M   0% /run/lock
none            245M     0  245M   0% /run/shm
none            100M     0  100M   0% /run/user
none            921G  818G  104G  89% /vagrant
```

## 1. ディスクのフォーマットを vmdk => vdi に変換

```console:ディスクフォーマットの変更
$ VBoxManage.exe clonehd box-disk1.vmdk box-disk1.vdi --format vdi
```

追記:
今回の例のように ディスクの使用率が少ない場合は変換はすぐ終わりましたが、使用率が高い場合はけっこう時間がかかります。20GB使用しているディスクの場合は、自分の環境だと変換が20~30分ぐらいかかりました。

## 2. vdi のディスクサイズを拡張

```console:ディスクサイズの変更(40GB=>80GB)
$ VBoxManage.exe modifyhd box-disk1.vdi --resize 81920
```

数値の単位はMBになります。 Bashの場合は `$((80 * 1024))` としたほうがわかりやすいかも。

## 3. ディスクフォーマットを vdi => vmdk に変換
※vmdkに一応戻してますが、vdiのままでも良いかもしれないです。

```console:拡張したvdiをvmdkに変更
$ VBoxManage.exe clonehd box-disk1.vdi box-disk2.vmdk --format vmdk
```

## 4. ゲストOSの仮想ディスクを差し替える

```console:既存の仮想ディスクの情報を確認
$ VBoxManage.exe showvminfo vagrant_ubuntu_server_base_default_1482910721535_34537 | grep ".vmdk"
SATAController (0, 0): C:\Users\XXXX\VirtualBox VMs\vagrant_ubuntu_server_base_default_1482910721535_34537\box-disk1.vmdk (UUID: 39fb6706-24c6-4737-bca9-7ca0490d21c1)
```

```console:仮想ディスクの差し替え
$ VBoxManage.exe storageattach vagrant_ubuntu_server_base_default_1482910721535_34537 --storagectl "SATAController" --port 0 --device 0 --type hdd --medium box-disk2.vmdk
```

```console:差し替わっていることの確認
$ VBoxManage.exe showvminfo vagrant_ubuntu_server_base_default_1482910721535_34537 | grep ".vmdk"
SATAController (0, 0): C:\Users\XXXX\VirtualBox VMs\vagrant_ubuntu_server_base_default_1482910721535_34537\box-disk2.vmdk (UUID: 0ed226d7-3cc1-4042-bdb7-15f4e0e7f520)
```

## 5. ディスクサイズが拡張されていることを確認する

```console:VMを起動してディスクサイズが変更されていることを確認する
# vagrant ssh
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            241M   12K  241M   1% /dev
tmpfs            49M  348K   49M   1% /run
/dev/sda1        79G  1.4G   75G   2% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
none            5.0M     0  5.0M   0% /run/lock
none            245M     0  245M   0% /run/shm
none            100M     0  100M   0% /run/user
none            921G  819G  103G  89% /vagrant
```

※1-4の手順で拡張を行った後にパーティションを変更するというような手順がある記事もありましたが、今回自分が行った場合にはバーティションの変更は特にありませんでした。`/dev/sda2` などが追加されている場合は、パーティションの変更を行って下さい。

```console:一旦VMを閉じる。
# vagrant halt
```

確認後は一旦VMを停止させて下さい。

# 6. 生成したvdiと、変更前の仮想ディスクを管理下から外す

```console:生成したvdiと、変更前の仮想ディスクを管理下から外す
$ VBoxManage.exe closemedium box-disk1.vdi
$ VBoxManage.exe closemedium box-disk1.vmdk
```

必要なければ上記のファイルは削除しても構いません。

# 別解
本記事は、既存の仮想ディスクを拡張する方法を記載していますが、拡張ではなく別のディスクを追加したい場合もあるかと思います。その場合は以下の記事などを参照して下さい。

[[Vagrant] VirtualBox作成時にストレージを追加 - Qiita](http://qiita.com/maueki/items/c4ce7c2b7834e3f4ad7d#_reference-e760b14b293e01d4be34)

# 関連
[WindowsでVagrantを使用してVM環境を作成する - Qiita](http://qiita.com/koara-local/items/e5d1226e2942cf36ef42)

# 参考
[Vagrant(Virtualbox)のディスク(ストレージ)容量を増やす方法 - Qiita](http://qiita.com/koitaro/items/c8bf8eb1e67e78890a5c)
[vagrantの既存boxにディスク容量を追加する - Qiita](http://qiita.com/teratsyk/items/de8e6386ec2e1ed4ed73)
[Vagrantのディスク容量を増やす - 作業ノート](http://te2u.hatenablog.jp/entry/2015/08/01/115346)