AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

Macbook 上で Vagrant が扱う仮想マシンの可変サイズのストレージのサイズを小さくしたい

タイトルの通りです。

ナンデ?

RHEL/CentOS の 5 とか 6 といった環境に、レガシーな RubyPHP の環境を複数用意する必要があり、Vagrant で管理して色々作業していると、いつの間にか Macbook 自体のディスクがたりねーな?となったのが発端です。

Vagrant が扱う、と行っても実際に仮想マシンの管理をしているのは VirtualBox となるので、どちらかというと VirtualBox の扱う仮想マシンの〜、というのが正しいかもしれませんね。

どうする

こうする。

VirtualBox の仮想ディスクサイズを小さくする | dreamin'up4u

  • ディスクを小さくしたい仮想マシンを起動する ( $ vagrant up )
  • 対象の仮想マシンにログインする ( $ vagrant ssh )
  • ログインした先で、dd コマンドで空き領域を 0 埋めして削除する ( $ dd if=/dev/zero of=zero bs=4k; \rm zero )
    • 「ディスクが一杯です」って言われてから、0 埋めしたファイルが削除されるので、標準出力のエラーに怯える必要はない
  • 対象の仮想マシンをシャットダウンする ( $ vagrant halt )
  • 対象の仮想マシンのストレージの UUID を調べる ( $ VBoxManage list hdds )
  • 対象の仮想マシンのストレージの UUID を用いて圧縮コマンドを実行する ( $ VBoxManage modifyhd [対象の UUID] compact )

現実に目を向ける

Vagrant が作成する仮想マシンのファイル形式は「vmdk」となるため、上記の手順だと「圧縮できないよ」とエラーが帰ってきます。 上記手順で圧縮できるのは、

  • 可変サイズのストレージ
  • vdi 形式

のみとなりまーす!ちくしょう!

増え続けるストレージに対応する手段は?

ない。 素直にイメージを削除するか転送速度が実用に耐えるなら、外付け HDD を用意するのが良い。 Thunderbolt 接続とかだといいんじゃろうか……。

ちなみに、vmdk -> vdi と変換してから、上記の手順で compact をしてサイズを圧縮し、再び vmdk に戻すことで解決をはかる、という手段もあるそうです。 しかしその時点で、仮想マシンのファイルサイズの二倍以上を扱えるストレージの空きが必要であり、今はもうそんな余裕がないので無理でした。 つまり死ぬしか無い。がくー。