VitualBoxのイメージファイルのストレージサイズが肥大化しているときの対応

#【イメージファイルの肥大化の原因】
VirtualBox VMs/ の .vmdk ファイルは仮想マシーン側のストレージ使用量に併せて肥大化する。
しかし仮想マシーン側で使用量が小さくなっても併せて圧縮はされないので、ひとたび肥大化してしまうと手動で圧縮しない限りストレージを確保したまま居座るのでやっかい。

#【対処方法】
上のような経緯で VirtualBox VMs/ 内の .vmdk ファイルを手動で圧縮することでストレージの枯渇に対応することにした。

#【備忘録】
VBoxManage.exeのパス → C:\Program Files\Oracle\VirtualBox\VBoxManage.exe
VMディスクのパス → C:\Users\{ユーザー}\VirtualBox VMs\{ディスク名称}

#【作業手順】
※仮想ディスクの形式が VDI形式 の場合は「③VirtualBoxホスト上で、新たに作られたVDI形式の仮想ディスクの情報を取得し、仮想ディスクの縮小をする」だけ行えばよい筈。

##①ゲスト OS(Ubuntu) 側で「0埋め」

```
# ▼ゲスト OS(Ubuntu) 上の作業
#   まずゲスト OS(Ubuntu) 側で「0埋め」と言われるストレージの空き容量を 0 で初期化するための作業を行う。
#   つまりは、仮想 HDD の不要な領域のビットを全て 0 にして（ビット 0 が続くファイルを空き容量いっぱいに作る）、それを削除します。 
#   ※一度ファイルシステムをいっぱいいっぱいまで使うことになるので、ホスト OS 側のディスク容量にそれだけの空き容量がある必要があります。

# ▼Ubuntuで以下のコマンドで空き容量を初期化する
$ dd if=/dev/zero of=zero bs=4M; rm zero
```

##②縮小可能な仮想ディスク形式に変換する

```
# ▼ホスト OS(Windows) 上の作業
#  Vagrantでマシンを生成するとVMDK形式の仮想ディスクになりますが、このVMDK形式だとディスクサイズを縮小することが出来ません。
#  そこで縮小が可能なVDI形式の仮想ディスクへ変換してやる必要があります。

# ▼VirtualBoxホスト上で、該当の仮想ディスクの情報を取得し、VDI形式に変換した仮想ディスクを新たに作成

# ▼該当の仮想ディスクの UUID の確認
$ "C:\Program Files\Oracle\VirtualBox\vboxmanage" list hdds
     ※以下のように出力されるので、圧縮したいイメージのUUIDを確認する
      ｜..(略)
      ｜UUID:           {VMDKディスクのUUID}
      ｜Parent UUID:    base
      ｜State:          created
      ｜Type:           normal (base)
      ｜Location:       C:\Users\{ユーザー}\VirtualBox VMs\{ディスク名称}\ubuntu-disk001.vmdk
      ｜Storage format: VMDK
      ｜Capacity:       65536 MBytes
      ｜Encryption:     disabled
      ｜..(略)

# ▼VMDK形式 から VDI形式 に変換した仮想ディスクを新たに作成
$ "C:\Program Files\Oracle\VirtualBox\vboxmanage" clonehd {VMDKディスクのUUID} "C:\Users\{ユーザー}\VirtualBox VMs\{ディスク名称}\ubuntu-disk001.vdi" --format vdi
```

##③VirtualBoxホスト上で、新たに作られたVDI形式の仮想ディスクの情報を取得し、仮想ディスクの縮小をする

```
# ▼該当の仮想ディスクの UUID の確認
$ "C:\Program Files\Oracle\VirtualBox\vboxmanage" list hdds
    ※以下のように出力されるので、圧縮したいイメージのUUIDを確認する
      ｜..(略)
      ｜UUID:           {VBIディスクのUUID}
      ｜Parent UUID:    base
      ｜State:          created
      ｜Type:           normal (base)
      ｜Location:       C:\Users\{ユーザー}\VirtualBox VMs\{ディスク名称}\ubuntu-disk001.vdi
      ｜Storage format: vdi
      ｜Capacity:       65536 MBytes
      ｜Encryption:     disabled
      ｜
      ｜Storage format: vdi
      ｜..(略)

# ▼仮想ディスク(VBI形式)の縮小
$ "C:\Program Files\Oracle\VirtualBox\vboxmanage" modifyhd {VBIディスクのUUID} --compact
```

##④小さくなった仮想ディスクに付けなおす

```
# ▼VirtualBoxに登録されているVM の一覧から、圧縮対象のVM の UUID を確認
$ "C:\Program Files\Oracle\VirtualBox\vboxmanage" list vms
    ※以下のように出力されるので、圧縮したいイメージのUUIDを確認する
      ｜..(略)
      ｜"ubuntu-disk001" {c2f710d4-793e-48c4-ac94-23a5a2ae0ebe}
      ｜..略

# ▼VM情報を取得し、ストレージ情報に VMDK が紐付かれていることを確認
$ "C:\Program Files\Oracle\VirtualBox\vboxmanage" showvminfo {VMのuuid}
    ※以下のように出力されるので、圧縮したいイメージのUUIDを確認する
      ｜..(略)
      ｜{ストレージのコントローラー名} (0, 0): C:\Users\{ユーザー}\VirtualBox VMs\{ディスク名称}\ubuntu-disk001.vmdk (UUID: {VMDKディスクのUUID})
      ｜..(略)

# ▼圧縮した仮想ディスクへの付け替えを行う(VMDK → VBIに付けなおす)
$ "C:\Program Files\Oracle\VirtualBox\vboxmanage" storageattach {VMのuuid} --storagectl "{ストレージのコントローラー名}" --port 0 --device 0 --type hdd --medium {VBIディスクのUUID}

# ▼VM情報を取得し、ストレージ情報に VBI が紐付かれていることを確認
$ "C:\Program Files\Oracle\VirtualBox\vboxmanage" showvminfo {VMのuuid}
    ※以下のように出力されるので、圧縮したいイメージのUUIDを確認する
      ｜..(略)
      ｜{ストレージのコントローラー名} (0, 0): C:\Users\{ユーザー}\VirtualBox VMs\{ディスク名称}\ubuntu-disk001.vdi (UUID: {VBIディスクのUUID})
      ｜..(略)
```

##⑤動作を確認し不要なディスクイメージを削除する

```
# ホストOS(Windows) で "vagrant up"して問題なく起動するか確認、問題なければ以下の削除を行う。

# 不要なディスクイメージ(VMDK)を削除
$ "C:\Program Files\Oracle\VirtualBox\vboxmanage" closemedium disk {VMDKディスクのUUID} --delete
```