読者です 読者をやめる 読者になる 読者になる

Tech memo

日々学んだ技術のびぼうろく

Vagrant フォルダマウントエラーの直しかた "Failed to mount folders in Linux guest."

ざくっと概要

Vagrant の Box の Guest Additions のバージョン違いによるエラーの直しかたについてのメモ。

なおしかた

  1. プラグインで対応 (vagrant-vbguest)
  2. 1) でも直らない場合は手動でカーネルアップデート → 再起動

で直るはず。

以下詳解していく。

エラー内容

いつも通り vagrant up しようとしたら、Mounting shared folders のところでこんなエラー。

==> default: Mounting shared folders...
    default: /var/www/app => /home/test/app
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` var_www_typhoon /var/www/typhoon
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` var_www_typhoon /var/www/typhoon

The error output from the last command was:

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

このエラーはホスト(自分のPC)とゲスト(VM 上の仮想PC)間で

フォルダ同期ができないよーというエラー。

このエラーが起きてもスキップされて起動処理は行われるため、Vagrant 自体は起動する。

エラーの原因

ホスト(自分のPC)とゲスト(VM 上の仮想PC)間のフォルダ同期は、GuestAdditions というツールを使って実現している。

Vagrantfile で config.vm.synced_folder ".", "/var/www/app と設定すると、 vagrant up 時に GuestAdditions というツールを使ってホスト(自分のPC)とゲスト(VM 上の仮想PC)間のフォルダを同期させるための設定を行っているのである。

この GuestAdditions は、あらかじめゲスト(VM 上の仮想PC)にインストールされているもので、vagrant box 作成時にはすでにインストールされている。

例えば chef/centos-6.5 という vagrant box には GuestAdditions 4.3.8 がインストールされていたもよう。

今回のエラーは、この GuestAdditions のバージョン 4.3.8 が古すぎて、現在の Virtualbox に対応できないよーということで発生したエラーである。

つまり、

vagrant up → フォルダ同期(GuestAdditions) 

→ GuestAdditions が古い → 今の Virtualbox に対応していない → フォルダ同期失敗  

という流れ。

なおしかた1 <vagrant-vbguest> の導入

今の Virtualbox に対応している新しい GuestAdditions を ゲスト(VM 上の仮想PC) にインストールし直せば直る。

ただ、毎回手作業でインストールするのもめんどくさいので、自動でインストールしてくれる vagrant-vbguest というプラグインを導入する。

$ vagrant plugin install vagrant-vbguest

これを導入すると、vagrant up 時に新しいバージョンの GuestAdditions が必要であれば自動でインストールしてくれる。

vagrant-vbguest のインストールが完了したら

$ vagrant reload

でなおるはず。

なおしかた2 <カーネルのアップデート>

上記で vagrant up (vagrant reload)をしても直らず同じエラーが出る場合がある。

これは GuestAdditions がうまくインストールできていないことによる。

このエラーは以下の流れで発生する。

  1. VirtualBoxのバージョンとGAのバージョンが異なるためvbguestプラグインがGAの再ビルドを始める
  2. インストール済みGAが削除される
  3. アクティブなkernelと同じバージョンのkernel-develをインストールしようとするが、より新しいkernelが公開されているのでみつからない
  4. GAのビルドが失敗し、GAが動作しない状態に

※ GA = GuestAdditions

となり、結局 フォルダ同期に失敗するという流れ。

これを直すためには、直接 vagrant に入って カーネルのアップデートをしたあと、再起動して GuestAdditions を入れ直すしかない。(前述の通り、フォルダ同期のエラーが発生しても vagrant 自体は起動している)

$ vagrant ssh -c 'sudo yum update -y kernel'
$ vagrant reload

これで

カーネルアップデート → GuestAdditions の再インストール 

が実行され、エラーが直るはず。

参考

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

Vagrant入門ガイド

Vagrant入門ガイド

実践 Vagrant

実践 Vagrant