Vagrantのあのエラー

どのぐらい有名かはわかりませんが、個人的には本日も含めてしょっちゅう出遭っているVagrantのエラーがあり、これまで少なからず悩まされ、そのつど解決までに少なからぬ手間を経てきたので、復旧法とともにメモしておきます。

概要 / 参考リンク

エラー・メッセージは以下のようなもので、

Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

これが黒い画面に赤字でババッと出てくるので、けっこう驚きます。

現象の説明としては以下が詳しく、
vagrant-vbguestプラグインがGuestAdditionsを無効にしてしまう - Qiita

復旧法の説明としては以下が詳しいです。
Re-install guest additions when Vagrant can't mount host folders - Qiita

各位ありがとうございます。

現象に関する私見

自分の場合、この状況が生じるのは以下の2点が重なったとき、という印象があったのだけど、

  • chefが提供しているvagrant boxを使っている。
  • 最初に仮想マシンを起動した後、そのVagrantfileが入っているディレクトリ名を変更して再起動した場合。

ただ、どちらの見解も他では見かけないので、たまたま自分が遭遇したときだけの話かもしれません。

上の最初のリンクで説明されているvbguestプラグインというのは自分で入れることはないし、意識したことすらなかったですが、いずれにせよ私的再現条件の2点はあくまで「個人の感想レベル」というか、ちゃんとした原因究明は識者各位がそれぞれ進められているようなので、それらをチェックした方が良さそうです。

このエラーが出て何が困るのかと言うと、どうやらVagrantの特徴的機能の一つである(と僕が思っている)共有フォルダがうまく動かなくなるとかで(たぶん)、まあ実際には、仮想マシン自体はこの赤字のエラーが出た後もちゃんと(というか)動いていて、中に入ったり操作したりはできるのですが、とはいえクリアに解決してくれた方がいろいろ嬉しいので、以下では屋上屋を架すごとく、具体的な手順についてあらためてさらいたいと思います。

私的復旧法

上で紹介したリンク記事の復旧法でほぼ問題ないのですが、一応僕なりの対応方法は以下の3ステップです。

(1)vboxadd setup

$ /etc/init.d/vboxadd setup

(2)install kernel-devel

$ yum -y install kernel-devel

(3)ふたたび vboxadd setup

$ /etc/init.d/vboxadd setup

ということで順番に行くと、まずこのエラーが出ても実際にはマシンは立ち上がっているので、sshでログインします。
以下はrootで入った前提でコマンド等書きますが、vagrantアカウント($ vagrant sshで入る)の場合は頭にsudoが必要になると思います。

ということで、とりあえずログインして、最初のsetup をかけると(1)こんな感じで、2つのOKと1つのエラーが出ます。

Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules
The headers for the current running kernel were not found. If the following
module compilation fails then this could be the reason.
The missing package can be probably installed with
yum install kernel-devel-2.6.32-504.12.2.el6.x86_64

Building the main Guest Additions module                   [失敗]
(Look at /var/log/vboxadd-install.log to find out what went wrong)
Doing non-kernel setup of the Guest Additions              [  OK  ]

次に、この中程のメッセージにあるkernel-develというのをyum installすると(2)、二度目のsetup(3)ではすべてOKが出て解決、という流れです。

上方の復旧記事の説明では、エラー文に沿ってkernel-develのヴァージョンも指定してインストールしていますが、自分の手元でやった際にはとくにヴァージョンまでは指定しなくても大丈夫そう? という感じだったので、そのように上記しています。

想定外のエラーとその復旧

さて、これですべて解決するなら話は早いというか、べつに上のリンク記事を示して終わっても良かったのですが、ついさっき、この3行では終わらない現象に当たったのでもう少し続けますと、対応のキモであった以下をインストールしても、

$ yum -y install kernel-devel

次のsetupでまだfailが残る、という現象に遭遇しまして、その時のエラーメッセージがこんな感じでした。

Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules
Building the main Guest Additions module                   [失敗]
(Look at /var/log/vboxadd-install.log to find out what went wrong)
Doing non-kernel setup of the Guest Additions              [  OK  ]

最初のエラー文に比べたらだいぶ英語は減っていますが、いずれにせよ「失敗」ということで、かつ引き続き「/var/log/vboxadd-install.logを見て間違いを探せ」ということなので、観念して見にいきますと、このような記述がありました。

/bin/sh: perl: コマンドが見つかりません

え、もしかしてPerl入ってなかったのだっけ……? いやいや、そんなことは……と思ったものの、確認するとたしかに入っていない。(ちなみに使っているのは chef/centos-6.5)

ということで、とりあえずヴァージョンを問わずPerlを入れます。

$ yum -y install perl

で、あらためてsetup。

$ /etc/init.d/vboxadd setup

としたら、直りました。

Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules
Building the main Guest Additions module                   [  OK  ]
Building the shared folder support module                  [  OK  ]
Building the OpenGL support module                         [  OK  ]
Doing non-kernel setup of the Guest Additions              [  OK  ]
Starting the VirtualBox Guest Additions                    [  OK  ]

ということで、終わってみれば単純な話で、費やす時間も数分なのだけど、これに辿りつくまでがけっこう大変というか、また検索で見つかる記事によっては、ずいぶん煩雑な手続きを経ていたり、説明がややわかりづらかったり(あまり具体的ではないとか上級者向けっぽいとか)、あるいは英語の記事だったりして、ちょうど自分向きと言える説明が無かったのでサラッと書いておきました。