vagrant 1.0系から 1.2系にアップグレードしてハマった話。

vagrant box list では box があるというのに、vagrant up するとそんな box 知らないって言われる問題にぶち当たったので、
まだ vagrant 1.0 系で様子見をしてる人向けにメモっておきます。

ちなみにこの内容は Fixing “The box … could not be found” in the new Vagrant (1.1+) | WizOne Solutions を咀嚼して書きなおしたものです。
目新しいものではないのであしからず。

ついさっき、久しぶりに新しい VM を作るために vagrant up をしたら、こんなエラーが出てきました。

$ vagrant up
There were warnings and/or errors while loading your Vagrantfile.
Your Vagrantfile was written for an earlier version of Vagrant,
and while Vagrant does the best it can to remain backwards
compatible, there are some cases where things have changed
significantly enough to warrant a message. These messages are
shown below.

Warnings:
* `config.vm.customize` calls are VirtualBox-specific. If you're
using any other provider, you'll have to use config.vm.provider in a
v2 configuration block.

Bringing machine 'default' up with 'virtualbox' provider...
There are errors in the configuration of this machine. Please fix
the following errors and try again:

vm:
* The box 'CentOS-5.7-x86_64' could not be found.

CentOS 5.7 の box がない、と言われています。
おや? と思ってリストを出すと、ちゃんと CentOS 5.7 の box は存在するようです。

$ vagrant box list
CentOS-5.7-x86_64         (virtualbox)
CentOS-5.8-x86_64         (virtualbox)
CentOS-6.3-x86_64-minimal (virtualbox)
Ubuntu lucid 64           (virtualbox)
Ubuntu_1204_x64           (virtualbox)
canonical-ubuntu-12.04    (virtualbox)
canonical-ubuntu-12.10    (virtualbox)
opscode-centos-5.8        (virtualbox)
opscode-centos-6.3        (virtualbox)
opscode-ubuntu-10.04      (virtualbox)


いままで使っていた Vagrantfile で、特に内容は変えていないんだけどなあ…と最近の変更を思い出したら、ありました。
vagrant を 1.0.7 から 1.2 系にアップグレードしてました。

vagrant 1.1 以降では box の形式が代わったみたい

調べてみると、どうやら box の形式が変わっているようです。
ひとつは ~/.vagrant.d/boxes/ 以下に配置される box のディレクトリ構成がかわったこと、
もうひとつは metadata.json が導入されたこと。

ディレクトリ構成が代わった

これまでは box ディレクトリの直下に VirutalBox のファイル群が配置されている構成でしたが、
vagrant 1.1以降では複数の仮想環境に対応したためなのか、サブディレクトリがひとつ増えていました。

CentOS-5.7-x86_64 を例に取ると、いままで

  • ~/.vagrant.d/boxes/CentOS-5.7-x86_64/Vagrantfile
  • ~/.vagrant.d/boxes/CentOS-5.7-x86_64/box-disk1.vmdk
  • ~/.vagrant.d/boxes/CentOS-5.7-x86_64/box.ovf

のようにファイルが配置されていたのが、1.1以降では

と virutalbox ディレクトリがふえています。

metadata.json

これまでは box は特にメタデータに相当するものを持っていなかったのですが、
1.1では metadata.json というファイルを持つようになっています。
そのため、これまで使っていた box を使うためには metadata.json を追加する必要があります。
内容は

{
  "provider": "virtualbox"
}

というシンプルなもので構いません。

既存の box を書き換えていく

ここまでの内容を踏まえて、こんなワンライナーを動かしたら、1.1系でもあたらしい box を作るのに成功しました。

(cd CentOS-5.7-x86_64 && mkdir -p virtualbox && mv * virtualbox && echo '{"provider": "virtualbox"}' > virtualbox/metadata.json)


しかし、ほとんど日本語の情報が引っかからなかったんですが、みんな最初から 1.1系を使ってたんですかねえ。
ハマらない生活って羨ましい…