VirtualBox 4.2.14 で Vagrant が NS_ERROR_ABORT で up にコケる


2013-07-09 追記
2013-07-04 に VirtualBox 4.2.16 がリリースされていて、vagrant up に失敗する問題も修正されています。

ノートPCの OS を入れ直したので再度 Vagrant 環境を構築してみたら vagrant up

NS_ERROR_ABORT

となって起動しませんでした。

調べてみたら GitHub に issue がありました。
The latest upgrade to Virtualbox on Arch Linux breaks vagrant boxes

2013年6月21日リリースの VirtualBox 4.2.14 にバグがあるようです。

VirtualBox を一つ前の 4.2.12 に入れ替えたら起動しました。

今回はこんなマルチホームな vm を起動してみた。

  config.vm.define :node1 do |node|
    node.vm.box = "centos6"
    node.vm.network :forwarded_port, guest: 22, host: 2001, id: "ssh"
    node.vm.network :public_network, :bridge => "wlan0", ip: "192.168.0.101"
    node.vm.network :private_network, ip: "192.168.33.11"
  end

  config.vm.define :node2 do |node|
    node.vm.box = "centos6"
    node.vm.network :forwarded_port, guest: 22, host: 2002, id: "ssh"
    node.vm.network :public_network, :bridge => "wlan0", ip: "192.168.0.102"
    node.vm.network :private_network, ip: "192.168.33.12"
  end

前に試したときは Multi-Machine 設定はなぜかエラー(名前を指定して個別に起動すれば2つ起動した)になってたのが直ってる。(気がする、前の設定に問題があったのかどうかはもはや不明)

Vagrant メモ (2)

Vagrant メモ (1) の続き。

Vagrant コマンドの概要

init
実行したディレクトリに Vagrantfile を作成することで初期化します。

vagrant init BOX-NAME BOX-URL

と box を指定することで同時に box add することができます。box を同時についかすれば Vagrantfile もそれに合わせて作成されます。そうでなかった場合は vagrant add box した後に Vagrantfile の config.vm.box をそれに合わせて書き換える必要があります。Vagrantfile と machine の情報(.vagrant ディレクトリ)は init を実行したディレクトリに作成されますが、box ファイルは ~/.vagrant.d にまとめて保存されます。

box
box の管理を行います。add, list, remove, repackage というサブコマンドがあります。box = machine ではありません、1つの box から複数の machine(サーバー)を構築できます。

vagrant box add BOX-NAME BOX-URL

で box を追加します。ダウンロード可能な BOX-URL のリストは Vagrantbox.es にあります。

up
vagrant up [MACHINE-NAME]

で指定の machine を起動させます。MACHINE-NAME を省略すると全てのマシンを起動させます。ただし、エラーが発生するとそれ以降のサーバーは起動されません。

halt
vagrant halt [MACHINE-NAME]

で指定の machine を shutdown します。MACHINE-NAME を省略すると全てのマシンを shutdown します。

ssh
vagrant ssh [MACHINE-NAME]

ssh でマシンにログインします。マルチマシンモードでは MACHINE-NAME が必須です。

status
マシンの状態(起動してるかどうか)を確認します。
reload
reboot (halt & up) します。(再起動されるけどSSH関連のエラーが出る)
package
現在のマシンの状態を再利用できるように .box ファイルを作成します。
suspend
サスペンドします。(メモリの状態を書き出すはずなのに .vagrant も .vagrant.d も増えないなぁと思ったら、仮想マシンは ~/VirtualBox VMs/ なのでした)
この状態から halt すると state ファイルの削除だけとなります。
マシンを指定しないと全てのマシンを suspend します。
resume
suspend 状態から復帰させます。マシンを指定しないと全てのマシンを復帰させます。
複数のマシンを稼働させる場合 ssh の port forwarding でポート番号の衝突を自動で回避する仕組みがありますが resume の時に問題があるらしく、別のポートを指定しろと言われます。
それには次のように :forwarded_port を設定します。id: "ssh" が無いと default の port forward である 2222 -> 22 も残った上で追加で設定されてしまいます。

  config.vm.define :node1 do |node|
    node.vm.box = "centos6"
    node.vm.network :forwarded_port, guest: 22, host: 2001, id: "ssh"
  end

  config.vm.define :node2 do |node|
    node.vm.box = "centos6"
    node.vm.network :forwarded_port, guest: 22, host: 2002, id: "ssh"
  end
destroy
仮想マシンを破棄します。Vagrantfile は変更されれないのでまた up すれば box から再作成される。
ssh-config
vagrant ssh-config [MACHINE-NAME]

Vagrantfile のあるディレクトリで vagrant ssh しなくても ssh 接続できるように ~/.ssh/config に書くための情報を出力してくれるのでリダイレクトで追記すれば良い。
multi-VM の場合は MACHINE-NAME が必須。

plugin
未調査
provision
未調査

その他

既存の vmdk から box を作成する方法もあるようです。
Creating a Vagrant base box from an existing Vmdk

Vagrant メモ (1)

流行りの Vagrant (ベイグラント)を試してみる
http://downloads.vagrantup.com/tags/v1.1.2
から vagrant_x86_64.deb (手元のPCが Linux Mint なので)をダウンロードしてインストール。

$ sudo dpkg -i vagrant_x86_64.deb

/opt/vagrant にインストールされる。

1.0.x では gem でインストールするという方法もあったけど 1.1.x ではもう gem は提供されないとのこと。

Gem Install?
Vagrant 1.0.x had the option to be installed as a RubyGem. This installation method has been removed for installers and packages only.

$ vagrant init centos6 \
  http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130309.box
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

Vagrantfile がこのディレクトリに作成されました。`vagrant up` コマンドで最初の仮想環境を立ち上げる準備ができました。Vagrantfile のコメント行を読んでね。Vagrant についてもっと知りたかったら `vagrantup.com` にアクセスしてね。

とのことなので

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Box 'centos6' was not found. Fetching box from specified URL for
the provider 'virtualbox'. Note that if the URL does not have
a box for this provider, you should interrupt Vagrant now and add
the box yourself. Otherwise Vagrant will attempt to download the
full box prior to discovering this error.
Downloading with Vagrant::Downloaders::HTTP...
Downloading box: http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130309.box
Progress: 27% (134439529 / 491722240)

Extracting box...
Cleaning up downloaded box...
Successfully added box 'centos6' with provider 'virtualbox'!
[default] Importing base box 'centos6'...
[default] No guest additions were detected on the base box for this VM! Guest
additions are required for forwarded ports, shared folders, host only
networking, and more. If SSH fails on this machine, please install
the guest additions and repackage the box to continue.

This is not an error message; everything may continue to work properly,
in which case you may ignore this message.
[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

起動したので ssh でログイン

$ vagrant ssh
Welcome to your Vagrant-built virtual machine.
[vagrant@localhost ~]$

ps で見てみるとこんなコマンドで ssh してました。なるほど。

ssh vagrant@127.0.0.1 \
  -p 2222 \
  -o LogLevel=FATAL \
  -o StrictHostKeyChecking=no \
  -o UserKnownHostsFile=/dev/null \
  -o IdentitiesOnly=yes \
  -i /home/ytera/.vagrant.d/insecure_private_key

Bridgeインターフェースを使う

Vagrantfile を編集して

config.vm.network :public_network

をアンコメントして起動すると

[default] Available bridged network interfaces:
1) wlan0
2) eth0
What interface should the network bridge to?

と、どのインターフェースのBridgeとするかの選択肢が出る。
そして NAT のインターフェース(eth0)に加え、Bridge のインターフェース(eth1)が作成される。

(2013-03-23追記) 毎回どのインターフェースを使うか尋ねられると困るので Vagrantfile で指定する

config.vm.network :public_network, :bridge => "wlan0"

ゲストOS起動時の出力を見たい

Vagrantfile の

config.vm.provider :virtualbox do |vb|
  vb.gui = true
end

をアンコメントして起動させるとVirtualBoxの仮想ターミナルが起動する。

CentOS のこの画面だと起動時のメッセージは見れないので `F1` を押して表示させる。

この他に Vagrantfile ではメモリサイズの変更やホスト側のディレクトリをゲスト側でマウントする設定や Port Forwarding の追加、Puppet や Chef の設定が可能なようです。というか、Puppet や Chef 使うのが目的ですかね。