Vagrantのmountエラーを解決しようとしたらvboxのリビルドがこける


# vagrantのmountエラー
自分で`vagrant package`して作成したboxから`vagrant up`した際にこんなエラーが出る。

```
Failed to mount folders in Linux guest. This is usually beacuse
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 apache | cut -d: -f3`,dmode=777,fmode=777 /vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g apache`,dmode=777,fmode=777 /vagrant /vagrant
```

このエラーは、エラーメッセージの通りゲストOS側で共有フォルダがマウント出来ないときに発生するエラーメッセージ。

## 対処法その1：macアドレスのマッピングを無効にする
以前にこのエラーでハマったことがあったけど、そのときはこれで治った。
パッケージングする前のmacアドレスのマッピングを覚えてしまってるので、macアドレスのマッピングを無効にしてからパッケージングする。

[こちら](http://blog.monochromegane.com/blog/2013/04/06/vagrant-network-error/)を参考。

```
$ vagrant ssh # ゲストOSにログイン
[vagrant@localhost ~]$ sudo ln -s -f /dev/null /etc/udev/rules.d/70-persistent-net.rules
```

### 結果
`vagrant reload`したり色々してもエラーが解消しない。
というか、もちろん`vagrant package`する前にやってるはずなので……。

## 対処法その2：vboxのバージョンを上げる
Guest Additionsのバージョンが古いからかもしれない、という可能性に気づいたのでvagrant-vbguestを使ってvboxのバージョンをアップ。
案の定バージョンが古かったので、バージョンアップしたあとで再度`vagrant package`→`vagrant up`してみる。

vagrant-vbguestは[こちら](http://qiita.com/isaoshimizu/items/e217008b8f6e79eccc85)を参考に。

### 結果
やっぱりコケる。あるぇー？

## 対処法その3：vboxをリビルドする
いろいろ調べてみつつ、[こちら](http://qiita.com/osamu1203/items/10e19c74c912d303ca0b)を参考に`sudo /etc/init.d/vboxadd setup`を実行したところ、リビルドがコケる。

```
$ sudo /etc/init.d/vboxadd setup
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-431.29.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  ]
```

エラーログを出力した結果。

```
$ cat /var/log/vboxadd-install.log
/tmp/vbox.0/Makefile.include.header:97: *** Error: unable to find the sources of your current Linux kernel. Specify KERN_DIR=<directory> and run Make again.  中止.
Creating user for the Guest Additions.
Creating udev rule for the Guest Additions kernel module.
```

どうもこれが原因っぽい。

# vbox setupのエラーを解決する
[こちら](http://little-braver.com/536/)と[こちら](http://kaworu.jpn.org/kaworu/2013-07-29-1.php)を参考に、エラーを解決しました。

## カーネルのバージョンアップと必要なパッケージのインストール
まず、カーネルのバージョンアップとインストールに必要なパッケージのインストールを行います。
カーネルのバージョンアップをしていないと、必要なパッケージをインストールしても同じエラーでコケます。

```
$ sudo yum -y update kernel
```

必要なパッケージをインストール。

```
$ sudo yum -y install kernel-devel kernel-headers dkms gcc gcc-c++
```


この後、仮想マシンの再起動をする必要があるそうなので、ホストOS側から`vagrant reload`で再起動をかけました。

## vbox setupを行う
詳細はメモり忘れてしまいましたが、このまま`vbox setup`してもコケます。
確か`cat /var/log/vboxadd-install.log`したときに`Specify KERN_DIR=<directory>`というエラーが出てたはず。
エラーメッセージと[こちら](http://kaworu.jpn.org/kaworu/2013-07-29-1.php)を参考に、環境変数にカーネルのディレクトリを指定して再度実行。

```
$ export KERN_DIR=`ls -t /usr/src/kernels/|head -1`
$ 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  ]
You should restart your guest to make sure the new modules are actually used
```

成功しました。この後、`vagrant reload`で再起動。
マウントのエラーメッセージも出ることなく起動成功しました。