Vagrantにてシンボリックリンクを配置すると共有ディレクトリがマウントできない件の対処

森裕介(プログラマー)
無念

結論

Vagrant にて ユーザーのhomeディレクトリに /vagrant へのシンボリックリンクを生成する場合は vagrant 以外の名称にする

以下ハマったことのメモ書きです。

ハマったこと

ある日 vagrant up 時に /vagrant がマウントされないという現象に遭遇しました。 解決方法は先に述べた結論通りなのですが、とりあえず現象を追ってみます。

今回現象を確認したゲストOSは ubuntu 14.04 , Cent OS 6.5 、 Vagrantのバージョンは 1.6.5 , VirtualBoxのバージョンは 4.3.16 です。 また、vagrant-vbguestプラグインをインストールしているので、 vmの初回起動時にVituralBox GuestAdditionは最新版に更新されています。

まず状況を再現するために新たにvmを生成します。 起動できること、reloadしても大丈夫なことを確認します。 ゲストOSはとりあえずUbuntu 14.04にします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# on localhost
jiska@localhost ~/sample$ vagrant init ubuntu/trusty64 && vagrant up
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read

(中略...)

==> default: Machine booted and ready!
GuestAdditions versions on your host (4.3.16) and guest (4.3.10) do not match.
stdin: is not a tty
 * Stopping VirtualBox Additions
   ...done.
stdin: is not a tty
 * Stopping VirtualBox Additions

(中略...)

==> default: Mounting shared folders...
    default: /vagrant => /Users/jiska/sample

(後略...)

# 正常に起動できたのでマウントできていることを確認
jiska@localhost ~/sample$ vagrant ssh -c "ls -a /vagrant"
.  ..  .vagrant  Vagrantfile
Connection to 127.0.0.1 closed.

# reloadしてみる
jiska@localhost ~/sample$ vagrant reload

(中略...)

==> default: Machine booted and ready!

(中略...)

==> default: Mounting shared folders...
    default: /vagrant => /Users/jiska/sample
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: to force provisioning. Provisioners marked to run always will still run.

# 再度マウントを確認する
jiska@localhost ~/sample$ vagrant ssh -c "ls -a /vagrant"
.  ..  .vagrant  Vagrantfile
Connection to 127.0.0.1 closed.

普通に大丈夫ですね。

ところがvmにて $HOMEに /vagrant へのシンボリックリンクを生成する と、次回vagrantの起動時に vagrantディレクトリのマウントに失敗します

1
2
3
# on vagrant
vagrant@vagrant-ubuntu-trusty-64:~$ ln -s /vagrant
vagrant@vagrant-ubuntu-trusty-64:~$ exit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# on localhost
jiska@localhost ~/sample$ vagrant reload

(中略...)

==> default: Mounting shared folders...
    default: /vagrant => /Users/jiska/sample
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:

stdin: is not a tty
/sbin/mount.vboxsf: mounting failed with the error: Protocol error

oh…

画面上に発行されたmountコマンドが記載されています。 どうも vagrant というデバイスをマウントできてないようです。

とりあえず$HOMEへシンボリックリンクを削除すれば正しく起動します。

1
2
3
# on vagrant
vagrant@vagrant-ubuntu-trusty-64:~$ rm -f vagrant
vagrant@vagrant-ubuntu-trusty-64:~$ exit
1
2
3
4
5
6
7
8
9
10
11
12
13
# on localhost
jiska@localhost ~/sample$ vagrant reload

(中略...)

==> default: Machine booted and ready!

(中略...)

==> default: Mounting shared folders...
    default: /vagrant => /Users/jiska/sample
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: to force provisioning. Provisioners marked to run always will still run.

うむ。暫定対処はこれで大丈夫ですね。

どうしてこうなった

どうしてこうなったかは Vagrantのソース を追っているのですがよくわかっていません… 挙動わかりしだい追記しようと思います。