平常運転

アニソンが好き

過去記事とかは記事一覧で見れます

vagrant を 1.5くらいから 1.8.1 までバージョンアップした際にぶっこわれた環境を取り戻す

久々にvagrantを使おうとしたところ、Virtual Boxのバージョンを上げた都合でvagrantもバージョンアップしないといけなくなり、その結果ぶっ壊れた環境を立て直したのでその話をします

要約

  • 変な感じがした場合は~/.vagrant.d/を消してセットアップし直そう
  • pluginはちゃんとバックアップ取っておこうね
  • Virtual Boxの仮想マシンは消さなくても多分動く

環境

  • OS X 10.9.5
  • 旧環境のvagrantのバージョンは覚えてないけど、セットアップ時期から想像すると1.5くらいだと思う
  • VirtualBoxは気付いたら5.0.10になってた

経緯

vagrantで管理しているVirtualBox仮想マシンを久々に使おうとしてvagrant upしたところ、サポートしてないVirtual Boxのバージョンだよ、と怒られる。brew search vagrantしたところ特に見当たらなかったので普通にダウンロードしてきてインストールする。
この状態で改めてvagrant upすると、rubyレベルでなんか死んで起動出来ない。バージョン番号を要求してるところに"virtualbox"って文字列が渡されてるっぽい。しらんがなという感じ。

$ vagrant up
/opt/vagrant/embedded/lib/ruby/2.2.0/rubygems/version.rb:206:in `initialize': Malformed version number string virtualbox (ArgumentError)
	from /opt/vagrant/embedded/lib/ruby/2.2.0/rubygems/version.rb:198:in `new'
	from /opt/vagrant/embedded/lib/ruby/2.2.0/rubygems/version.rb:198:in `new'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/box_collection.rb:279:in `block (2 levels) in find'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/box_collection.rb:274:in `map'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/box_collection.rb:274:in `block in find'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/box_collection.rb:436:in `block in with_collection_lock'
	from /opt/vagrant/embedded/lib/ruby/2.2.0/monitor.rb:211:in `mon_synchronize'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/box_collection.rb:435:in `with_collection_lock'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/box_collection.rb:267:in `find'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/vagrantfile.rb:167:in `block in machine_config'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/vagrantfile.rb:200:in `call'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/vagrantfile.rb:200:in `machine_config'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/vagrantfile.rb:45:in `machine'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/environment.rb:663:in `machine'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/plugin/v2/command.rb:177:in `block in with_target_vms'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/plugin/v2/command.rb:201:in `call'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/plugin/v2/command.rb:201:in `block in with_target_vms'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/plugin/v2/command.rb:183:in `each'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/plugin/v2/command.rb:183:in `with_target_vms'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/plugins/commands/up/command.rb:89:in `block in execute'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/environment.rb:278:in `block (2 levels) in batch'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/environment.rb:276:in `tap'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/environment.rb:276:in `block in batch'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/environment.rb:275:in `synchronize'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/environment.rb:275:in `batch'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/plugins/commands/up/command.rb:88:in `execute'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/cli.rb:42:in `execute'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/environment.rb:302:in `cli'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/bin/vagrant:174:in `<main>'

ここでvagrant initで新しくセットアップしたboxは作れるのを確認する。既存のboxでのみ何かおかしいようだ。
このVagrantfileに対応する仮想マシンも一度消してみたけど復活しない。後述するけれど仮想マシン自体を消す必要は別に無かった
どこかにあるキャッシュがおかしいんだろうなーと思いながらVagrantfile中のvm名を新しい物に変えると、今度はセットアップできる *1

……と、ここまで試したところでだいたい想像が付いてきたので改めて確認したところ、Qiitaにいいエントリがあった。
qiita.com

vagrantの作業ディレクトリは~/.vagrant.d/以下にある。前述のようにキャッシュされてるデータが非互換変更で壊れたっぽいので、このディレクトリを消す。消すんだけど、消すとプラグインも消えるので、事前にvagrant plugin listを実行して、手で入れたプラグインがないか確認しておく。僕はあったので、~/.vagrant.d/を消してからそのプラグインを入れ直す、ということをした。

[asato@magic01 ~]$ vagrant plugin list
vagrant-share (1.1.5, system)
vagrant-vbguest (0.10.0)
[asato@magic01 ~]$  rm -rf ~/.vagrant.d/
[asato@magic01 ~]$ vagrant plugin install vagrant-vbguest
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Installed the plugin 'vagrant-vbguest (0.11.0)'!

この後、前述のVagrantfileのbox名を元に戻してvagrant upすると無事プロビジョニングが始まった。

追調査

上の対応ではVirtual Boxの仮想マシンを一度消したけど、本当に消す必要があるのだろうか、消さないでいけてほしい、ということで試した。

  • 上記のものとは別のvagrant環境
  • ~/.vagrant.d/は上記手順で消した
  • Virtual BoxのVMはそのまま

この環境で改めてvagrant upすると普通にマシンが立ち上がったので、Virtual Boxの仮想マシンは消さなくてもよい、ということではありそうだった。(もしうまくいかなかったら消せばいいとは思う)

まとめ

要約のところに書いたけれど、プラグインのメモして~/.vagrant.d/消したらよさそう、という結論になった。どこまで汎用的な話か分からないけど、ひとまずメモとして残したので必要に応じてご活用ください。

*1:vagrant自体のバージョンアップとは別に、過去に他のvagrant boxで使っていたnfs共有ディレクトリがなくなっていた、というエラーも出てた。これは手で /etc/exports の古いレコードを消して雑に対応した