[Sy] 【解決した】Vagrantでvagrant-vbguestを使ってたら共有フォルダのマウントに失敗する
現象
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があったので、適当にコピー。
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 マウント失敗
とかその辺りのキーワードで色々調べて、似たような環境で同じ現象が起きてる記事を見つけました。
この記事からわかったことは、
- 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をインストールして、再起動して解決!
やっと満足。