Syntax Error.

[Sy] 【解決した】Vagrantでvagrant-vbguestを使ってたら共有フォルダのマウントに失敗する

2014/11/26

現象

Vagrant + VirtualBox 上でVM(仮想マシン)をvagrant upで作ろうとすると、

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'CentOS6.5_x86_64'...
  ・
  ・
GuestAdditions versions on your host (4.3.18) and guest (4.3.6) do not match.
  ・
  ・
Setting up Install Process
No package kernel-devel-2.6.32-431.3.1.el6.x86_64 available.
  ・
  ・
Installing Virtualbox Guest Additions 4.3.18 - guest version is 4.3.6
  ・
  ・
yum install kernel-devel-2.6.32-431.3.1.el6.x86_64

Building the main Guest Additions module[FAILED]
(Look at /var/log/vboxadd-install.log to find out what went wrong)
  ・
  ・
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
    default: /vagrant => /Users/utano320/Vagrant/kernel_dev_test
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

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device

とエラーが起きてしまう。

この時点でVM自体は作成されてて、vagrant sshでSSH接続はできる。

ただ、Failed to mount folders in Linux guestとエラーにあるように、ホストOS(Mac OS X)のプロジェクトディレクトリをゲストOSの/vagrantディレクトリにマウントしようとして失敗している。

※プロジェクトディレクトリ
vagrant upをしたディレクトリ
(上の例だと/Users/utano320/Vagrant/kernel_dev_test

環境

  • Mac OS X 10.10.1(Yosemite) ⇒ ホストOS
  • Vagrant 1.6.5
  • VirtualBox 4.3.18
  • CentOS 6.5 ( x86_64 ) ⇒ ゲストOS
  • vagrant-vbguest 0.10.0

ゲストOS(VM上で動かすOS)のCentOS6.5は Vagrantbox.es から選択したVagrantのBoxを使用。

解決方法1(vbguestのupdateを無効にして再作成)

マウントに失敗したVMを一度削除してから作りなおしてもいいや、という場合はこちらの方法が楽です。

(作りなおしたくない場合は、後述する解決方法2で。)

1. マウントに失敗したVMを削除

先ほど失敗したVMのプロジェクトディレクトリ(vagrant upしたところ)に移動して、

$ vagrant destroy

でVMを削除します。Vagrantfileはそのまま残しておいて問題ないです。

2. vbguestの自動アップデートを無効にする

ホストOSにて、グローバルのVagrantfileを編集(無ければ新規作成)します。

$ vim ~/.vagrant.d/Vagrantfile

Vagrantfileに以下の設定を追記。

Vagrant.configure("2") do |config|
  config.vbguest.auto_update = false
end

3. VMを再び作る

先ほどのプロジェクトディレクトリへ移動して、vagrant upでVMを作りなおします。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'CentOS6.5_x86_64'...
  ・
  ・
  ・
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
    default: /vagrant => /Users/utano320/Vagrant/kernel_dev_test

無事マウントに成功!

解決方法2(kernel-develをインストール⇒再起動して復旧)

先ほど失敗したVMをそのまま残して、どうにか解決したい場合はこちらの方法で。

1. kernel-develのパッケージをネットで探す

最初のエラーメッセージを見ると、

No package kernel-devel-2.6.32-431.3.1.el6.x86_64 available.

とか、

yum install kernel-devel-2.6.32-431.3.1.el6.x86_64

Building the main Guest Additions module[FAILED]

といったものがあるはずです。このkernel-devel-2.6.32-431.3.1.el6.x86_64にあたる部分をコピーして、ネットでrpmファイルを探します。

すると必要なrpmファイルを落とせるURLが見つかると思うので、どこかのミラーサイトのダウンロードURLをコピーします。

今回の例の場合、

「kernel-devel-2.6.32-431.3.1.el6.x86_64.rpm download」

と検索して、以下のページを発見。

⇒ RPM CentOS 6 kernel-devel 2.6.32 x86_64 rpm

ページを見ると、いくつかダウンロードできるURLがあったので、適当にコピー。

kernel-develのパッケージをダウンロード

※URLの例
ftp://ftp.muug.mb.ca/mirror/centos/6.5/updates/x86_64/Packages/kernel-devel-2.6.32-431.3.1.el6.x86_64.rpm

2. ゲストOSでkernel-develをインストール

ゲストOSにSSHでログインして、

$ vagrant ssh

先ほどコピーしておいたkernel-develのパッケージのURLを使って、yumでインストールします。

$ sudo yum install -y ftp://ftp.muug.mb.ca/mirror/centos/6.5/updates/x86_64/Packages/kernel-devel-2.6.32-431.3.1.el6.x86_64.rpm
  ・
  ・
Installed:
  kernel-devel.x86_64 0:2.6.32-431.3.1.el6

インストールできました。念のため確認。

$ cd /usr/src/kernels
$ ls
2.6.32-431.3.1.el6.x86_64

今インストールしたバージョンのソースがあればOKです。

3. ゲストOSでGuest Additionsを再ビルド

インストールしたkernel-develを使って、Guest Additionsを再ビルドします。

$ sudo /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  ]

無事成功。一応下記でステータス確認。

$ service vboxadd status
The VirtualBox Additions are currently running.

4. VMを再起動

一度ゲストOSを抜けて、ホストOS側からVMを再起動します。

$ vagrant reload
==> default: Attempting graceful shutdown of VM...
  ・
  ・
==> default: Booting VM...
  ・
  ・
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
    default: /vagrant => /Users/utano320/Vagrant/kernel_devel_test
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: to force provisioning. Provisioners marked to run always will still run.

マウントも成功した状態で起動しています。

このエラーが起こる条件

以下3つに当てはまる場合でした。

  • _vagrant-vbguestをインストールしていて、autoupdateが有効になっている
  • ゲストOSにインストールされているGuest Additionsのバージョンが、ホストOSのVirtualBoxのバージョンより低い
  • ゲストOSのkernelのバージョンが古く、yumでパッケージを探すことができていない

原因の詳細&調べたこと

もう少し原因を詳しく知りたい人、原因追求までの右往左往を知りたい人は以下も参考になれば。

1. 同じ現象が起きてる記事発見

Guest Additonsとかvagrant マウント失敗とかその辺りのキーワードで色々調べて、似たような環境で同じ現象が起きてる記事を見つけました。

⇒ vagrant-vbguestプラグインがGuestAdditionsを無効にしてしまう - Qiita

この記事からわかったことは、

  • Boxのkernelのバージョンが古い状態で起こる。
  • vagrant-vbguestが自動でGuest Additionsを削除して再ビルドしようとして失敗しちゃうのが問題らしい。
  • Guest Addtionsが削除された後は、kernelのバージョンを上げて再起動するとうまくいくみたい。

ということ。

2. 復旧方法を試してみる

記事を参考に、VMをそのままにして復旧を試みる。ゲストOSにSSHで入って、

$ sudo yum update -y kernel
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror, versionlock
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * epel: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
Setting up Update Process
No Packages marked for Update

あれ?ないの?

yum listで検索してみても、

$ yum list kernel*
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror, versionlock
Determining fastest mirrors
 * base: centos.mirror.secureax.com
 * epel: mirror.premi.st
 * extras: centos.mirror.secureax.com
 * updates: centos.mirror.secureax.com
Installed Packages
kernel.x86_64                              2.6.32-431.3.1.el6                @updates/6.5
kernel-firmware.noarch                     2.6.32-431.3.1.el6                @updates/6.5
kernel-headers.x86_64                      2.6.32-431.3.1.el6                @updates/6.5
Available Packages
kernel-abi-whitelists.noarch               2.6.32-504.1.3.el6                updates
kernel-debug.x86_64                        2.6.32-504.1.3.el6                updates
kernel-debug-devel.x86_64                  2.6.32-504.1.3.el6                updates
kernel-doc.noarch                          2.6.32-504.1.3.el6                updates

・・・だめだそもそもyumがよくわかってない。

3. 一旦復旧を諦めて、予防策を試す

よくわからなくなったので、おとなしく記事にあった予防策を試してみることに。

ホストOSにて、

$ vim ~/.vagrant.d/Vagrantfile

としてグローバルのVagrantfileに以下を追記すればいいらしい。

Vagrant.configure("2") do |config|
  config.vbguest.auto_update = false
end

ぼくの環境ではファイルがなかったので、新規作成しておく。

ファイルを作ったので、もう一度問題のBoxを使ってvagrant init(エラーが起きたVMとは違うディレクトリで)。

作成されたVagrantfileには先ほどのグローバル設定が反映されてるはず?と思って探してみるけどない。 ん?何か勘違いしてる?

4. ちょっと寄り道してVagrantfileについて調べる

グローバルの設定はプロジェクトディレクトリに作成されるVagrantfileにどう影響を与えるのかが気になったので、ドキュメントを見てみる。

⇒ Vagrantfile | Vagrant日本語ドキュメント

どうやら、.vagrant.d配下にあるVagrantfileとプロジェクトディレクトリのVagrantfileがマージされるらしい。

なるほど。じゃあいいのか。

5. 予防策を実践してVM作成

3でvagrant initしたディレクトリに戻って、VM作成。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
  ・
  ・
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
    default: /vagrant => /Users/utano320/Vagrant/kernel_dev_test

お!無事にグローバルのVagrantfileが反映されて、Guest Additionsの自動アップデートしなくなってうまくいった!

これで予防策での対応はOK。

6. 復旧策にもう一度挑戦

別にもう解決方法が一つわかったからいいっちゃいいんだけど、なんか納得いかないので復旧策の方に戻ってやってみる。

たぶんyumの設定の問題なんじゃないかな?と疑って、色々調べてみたら参考になりそうなページを発見。

⇒ mog project: How to Solve Vagrant+CentOS+VirtualBox Mount Error

この記事を参考に、CentOS-Vault.repoを編集してみたけどやっぱり見つからないって言われる・・・

もう一つ直接URLを指定してインストールする方法も書いてあったので、そっちで試してみることに。

「kernel-devel-2.6.32-431.3.1.el6.x86_64.rpm download」

で検索して直接ダウンロードできるURLを探すと・・・あった!(※上の解決方法2を参照)

ゲストOSでkernel-develをインストールして、再起動して解決!

やっと満足。

関連記事