Windows用 VirtualBox 4.2.14 で Vagrant を使用する

はじめに

Windows用 VirtualBox-4.2.14-86644 を Windows7(64bit)にインストールしたところ、新たに vagrant init した Box の vagrant up 時にエラーが発生するようになりました。(ちなみに VirtualBox-4.2.12-84980 や VirtualBox-4.2.16-86992 では正常に動作します)

環境は以下の通りです。

  • Windows用 VirtualBox-4.2.14-86644
  • Vagrant 1.2.2
vagrant up 時のエラー内容
> vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'sample0'...
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["import", "C:/vagrant/boxes/sample0/virtualbox/box.ovf"]

Stderr: 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Interpreting C:\vagrant\boxes\sample0\virtualbox\box.ovf...
OK.
0%...
Progress object failure: RPC_S_SERVER_UNAVAILABLE 0x800706BA

更に、上記 box.ovf ファイルを VBoxManage コマンドで import してみても同様のエラーが発生しますので、.ovf ファイルの import に何らかの障害があると思われます。 (vagrant は内部的に VBoxManage コマンドを使っています)

VBoxManage import 時のエラー内容
> VBoxManage.exe import box.ovf
・・・
Progress object failure: RPC_S_SERVER_UNAVAILABLE 0x800706BA

回避策

とりあえず VirtualBox-4.2.16-86992 へバージョンアップするのが妥当だと思いますが、Windows用 VirtualBox-4.2.14-86644 で Vagrant を使う方法が無いわけではありません。

実は、VBoxManage による .ovf ファイルの import は失敗しますが .ova ファイルの import は成功します。

ここで .ova ファイルの内容は下記の通りです。

  xxx.ova は xxx.ovf と xxx-disk1.vmdk を tar 化したもの

つまり、下記の 2点を実施すれば Windows用 VirtualBox-4.2.14-86644 上で一応 Vagrant が使えるようになります。

  • (1) box.ova を import するように Vagrant のソースを改造
  • (2) box.ovf と box-disk1.vmdk を tar 化して box.ova を作成

(1) box.ova を import するように Vagrant のソースを改造

Vagrant 1.2.2 では box.ovf を import するようハードコーディングされていますので、下記 import.rb ファイルを直接変更して box.ova を import するようにします。

  • %VAGRANT_HOME%\embedded\gems\gems\vagrant-1.2.2\plugins\providers\virtualbox\action\import.rb
import.rb の変更内容
・・・
#ovf_file = env[:machine].box.directory.join("box.ovf").to_s
ovf_file = env[:machine].box.directory.join("box.ova").to_s
・・・

話を簡単にするため、上記のような対応で済ませていますが、 VirtualBox のバージョンを判定して tar で box.ova を作成するような処理を実装した方が便利かもしれません。

(2) box.ovf と box-disk1.vmdk を tar 化して box.ova を作成

vagrant box add で Box を追加すると下記ディレクトリに box.ovf ファイル等が展開されていますので、box.ovf と box-disk1.vmdk を tar でアーカイブ化して box.ova を作成します。

box.ova の作成例
> tar cf box.ova box.ovf box-disk1.vmdk

ちなみに、tar コマンドは msysgit に含まれている GNU tar を使いました。

動作確認

上記作業の後、適当なディレクトリを作成し vagrant init・up してみると、一応動作すると思います。

> vagrant init sample0
・・・
> vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'sample0'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Configuring and enabling network interfaces...
[default] Mounting shared folders...
[default] -- /vagrant

box.ova を使った Box の自作

実は box.ova を使って自作した Box を vagrant box add してみると特に問題無く成功します。

と言う事で vagrant package を使わずに box.ova を使って Box を手動で作成する手順を説明します。

1. box.ova の export

まずは VBoxManage コマンドを使って仮想マシンを box.ova ファイルへ export します。(Vagrant 用に設定済みの仮想マシンを使います)

VBoxManage export <仮想マシン名> -o box.ova
box.ova の export 例
> VBoxManage export centos6.4 -o box.ova
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Successfully exported 1 machine(s).

2. metadata.json と Vagrantfile の作成

次に、下記のような内容の metadata.json と Vagrantfile を作成します。

metadata.json ファイル
{"provider":"virtualbox"}
Vagrantfile ファイル
Vagrant::Config.run do |config|
  config.vm.base_mac = "0800111DA111"
end

include_vagrantfile = File.expand_path("../include/_Vagrantfile", __FILE__)
load include_vagrantfile if File.exist?(include_vagrantfile)

config.vm.base_mac の値は適当に付けても問題なさそうですが、 とりあえず下記コマンドで出力した macaddress1 の値を設定すればよいです。

VBoxManage showvminfo <仮想マシン名> --machinereadable
仮想マシンの MAC アドレス取得例
> VBoxManage showvminfo centos6.4 --machinereadable
・・・
macaddress1="0800111DA111"
・・・

3. tar.gz 圧縮

これまでに作成した 3 つのファイルを tar.gz 化すれば Vagrant 用の Box となります。

  • box.ova
  • metadata.json
  • Vagrantfile
Box の作成例
> tar zcf sample.box box.ova metadata.json Vagrantfile

4. Box の追加と実行

上記で作成した Box を vagrant へ add します。

Box の追加例
> vagrant box add sample sample.box
Downloading or copying the box...
Extracting box...ate: 346M/s, Estimated time remaining: --:--:--)
Successfully added box 'sample' with provider 'virtualbox'!

適当なディレクトリを作成し vagrant init・up してみると、一応動作すると思います。