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 を作成します。
- %VAGRANT_HOME%\boxes<Box名>\virtualbox
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 してみると、一応動作すると思います。