タイトルの通りです。
ナンデ?
RHEL/CentOS の 5 とか 6 といった環境に、レガシーな Ruby や PHP の環境を複数用意する必要があり、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 )
- Location に仮想マシンファイルまでのパスが書いてあり、その中に大体仮想マシンの名前がふくまれていたりする、そこから探す
- State が locked write でないことを確認する、そのままだと多分起動中なのでエラーが出るので、終了する
- http://d.hatena.ne.jp/iww/20130226/modifyhd
- 対象の仮想マシンのストレージの UUID を用いて圧縮コマンドを実行する ( $ VBoxManage modifyhd [対象の UUID] compact )
現実に目を向ける
Vagrant が作成する仮想マシンのファイル形式は「vmdk」となるため、上記の手順だと「圧縮できないよ」とエラーが帰ってきます。 上記手順で圧縮できるのは、
- 可変サイズのストレージ
- vdi 形式
のみとなりまーす!ちくしょう!
増え続けるストレージに対応する手段は?
ない。 素直にイメージを削除するか転送速度が実用に耐えるなら、外付け HDD を用意するのが良い。 Thunderbolt 接続とかだといいんじゃろうか……。
ちなみに、vmdk -> vdi と変換してから、上記の手順で compact をしてサイズを圧縮し、再び vmdk に戻すことで解決をはかる、という手段もあるそうです。 しかしその時点で、仮想マシンのファイルサイズの二倍以上を扱えるストレージの空きが必要であり、今はもうそんな余裕がないので無理でした。 つまり死ぬしか無い。がくー。