Vagrantで共有フォルダのマウントに失敗するときの対処方法

# **現象**
vagrant upで仮想マシンを起動するときに以下のようなメッセージが出て、共有フォルダのマウントに失敗することがあります。

```dummy:エラーメッセージ
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`,dmode=777,fmode=666 vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant`,dmode=777,fmode=666 vagrant /vagrant

The error output from the last command was:

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

# **原因**

ホスト⇔ゲスト間のフォルダ共有機能はGuest Additionsが提供していますが
ホスト(VirtualBox)とゲスト(Guest Additions)でバージョン不一致があるとマウントエラーが起きるようです。

# **対策**

vagrant up時に自動的に新しいバージョンのGuest Additionsに更新してくれる「[vagrant-vbguest](https://github.com/dotless-de/vagrant-vbguest)」というプラグインがあるので、こちらをインストールしておくと良いです。


## **インストール手順**

```dummy:コマンドプロンプト
vagrant plugin install vagrant-vbguest
```

## **マウント失敗している仮想マシンの状態確認 (起動している状態で)**

```dummy:コマンドプロンプト
cd \path\to\vagrant_project\
vagrant vbguest --status
```

```dummy:実行結果
GuestAdditions versions on your host (5.0.16) and guest (5.0.12) do not match.
```

ホストの方が古い場合は、VirtualBoxの最新版をダウンロードしてインストールします。

ゲストの方が古い場合は、vbguestプラグインで更新します。

## **Guest Additions更新**

```dummy:コマンドプロンプト
vagrant vbguest
```

```dummy:実行結果
Installing Virtualbox Guest Additions 5.0.16 - guest version is 5.0.12
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.0.16 Guest Additions for Linux............
VirtualBox Guest Additions installer
Removing installed version 5.0.12 of VirtualBox Guest Additions...
Stopping VirtualBox Additions [  OK  ]
Removing existing VirtualBox non-DKMS kernel modules[  OK  ]
Copying additional installer modules ...
Installing additional modules ...
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[失敗]
(Look at /var/log/vboxadd-install.log to find out what went wrong. The module is not built but the others are.)
Doing non-kernel setup of the Guest Additions[  OK  ]
Starting the VirtualBox Guest Additions [  OK  ]
Installing the Window System drivers
Could not find the X.Org or XFree86 Window System, skipping.
An error occurred during installation of VirtualBox Guest Additions 5.0.16. Some functionality may not work as intended.
In most cases it is OK that the "Window System drivers" installation failed.
```

**Building the shared folder support module[  OK  ]** と出ていればOK。
(Building the OpenGL support moduleのエラーは無視して良いらしい)


## **更新確認**

```dummy:コマンドプロンプト
vagrant vbguest --status
```

```dummy:実行結果
GuestAdditions 5.0.16 running --- OK.
```

## **仮想マシンを再起動**

```dummy:コマンドプロンプト
vagrant reload
```

vagrant reload = halt → upで、up時に更新処理が実行されるので、vagrant vbguestではなくて最初からvagrant reloadを実行すれば良いはずです。


## **解消しない場合**

逆にvagrant-vbguestが悪影響している場合もありそうです。

- [vagrant-vbguestプラグインがGuestAdditionsを無効にしてしまう](http://qiita.com/hapicky/items/a7f9d56588f96d005fad)
- [CentOS 6.5とvagrant-vbguestで詰まる](http://qiita.com/seisonshi/items/9fb2f84086a9450dbc4b)
- [Vagrantでフォルダがmountできないエラーが出たときの対応](http://qiita.com/kazu69/items/812b236e84fee1db3900)
- [vagrant up 時に shared folder の mount でエラーが発生する](http://qiita.com/DriftwoodJP/items/742a605286f295306363)



# **boxが古い場合は更新する** 

vagrant upした時に、新しいバージョンがありますよとメッセージが出る場合は、vagrant box updateでboxを更新すると、Guest Additionsのバージョン不一致が解消する場合があります。

```dummy:コマンドプロンプト
vagrant up
```

```dummy:実行結果
Bringing machine 'web1' up with 'virtualbox' provider...
==> web1: Importing base box 'bento/centos-6.7'...
==> web1: Matching MAC address for NAT networking...
==> web1: Checking if box 'bento/centos-6.7' is up to date...
==> web1: A newer version of the box 'bento/centos-6.7' is available! You currently
==> web1: have version '2.2.3'. The latest is version '2.2.5'. Run
==> web1: `vagrant box update` to update.
```

現在2.2.3だけど、2.2.5がありますよとのこと。

```dummy:コマンドプロンプト
vagrant box list
```

```dummy:実行結果
bento/centos-6.7 (virtualbox, 2.2.3)
```

vagrant box updateで更新します。


```dummy:コマンドプロンプト
vagrant box update
```

```dummy:実行結果
==> web1: Checking for updates to 'bento/centos-6.7'
    web1: Latest installed version: 2.2.3
.
.
.
==> web1: Successfully added box 'bento/centos-6.7' (v2.2.5) for 'virtualbox'!
```

```dummy:コマンドプロンプト
vagrant box list
```

```dummy:実行結果
bento/centos-6.7 (virtualbox, 2.2.3)
bento/centos-6.7 (virtualbox, 2.2.5)
```

2個出てくるけど、Guest Additionsのバージョン不一致は解消しました。
box remove → vagrant upを実行した方が最新だけ残って良いかも？



# **その他**

vagrant up時に毎回確認すると遅くなって嫌だという人は、自動更新するかどうかをVagrantfile内に記述できるので必要に応じて設定可能です。

```rb:Vagrantfile
  # vagrant-vbguestプラグインが入っている場合、自動更新を無効にする設定
  if Vagrant.has_plugin?("vagrant-vbguest") then
    config.vbguest.auto_update = false
  end
```

グローバルのVagrantfileに記述しても良いみたいです。
場所：ユーザーのホームディレクトリ/.vagrant.d/Vagrantfile
(存在しない場合は自分で作成してOK)