理系学生日記

おまえはいつまで学生気分なのか

vagrant up で Error: Connection timeout. Retrying...

どういう症状かというと、こういう症状です。

$ vagrant init centos65
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
(略)
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Error: Connection timeout. Retrying...            << こことか
    default: Error: Connection timeout. Retrying...            << こことか
==> default: Machine booted and ready!

ssh で接続できない時間が続いてリトライが繰り返され、何事もなかったように正常系の処理になるというかんじ。前々から気にはなっていつつも支障がないので放置してたのだけれど、ちょっとエントリを書く気になったので調べてみました。
結論からいうと、普通にゲスト OS の sshd が立ち上がっていなかったから、というのが真相です。vagrant up するとゲスト OS のブートプロセスが走るのだけれど、vagrant 側でゲスト OS に ssh しようとしても、ゲスト OS 側の sshd がまだ立ち上がっていないので、vagrant はリトライを繰り返しつつ、ssh 接続できるのを待ってました。

裏を取るためには、Vagrantfile の中に以下を追加すれば良いです。まぁ、provider に virtualbox を使ってる前提ですね。

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

    # ここを追加
    config.vm.provider "virtualbox" do |vb|
      vb.gui = true
    end

end

追加した後で vagrant up すると、headless モードではなく GUI が起動されるので、そこでブートシーケンスがどこまで進んでいるのかが分かります。
というわけで、キャプチャしました。これ見たら一目瞭然だとおもいます。左側が vagrant up したときの出力、右側がゲスト OS のブートシーケンスです。ゲスト OS が ifup してるタイミングで vagrant が ssh してしまっているため、Connection timeout が発生してます。