VagrantのSynced FolderにNFSを利用したが、 複数のVagrantfileで別々の環境を立ち上げる場合 に設定が上手くいかずハマったのでメモ。
環境
- Mac OSX Yosemite 10.10.3
- Vagrant 1.7.2
- VirtualBox 4.3.26
- 仮想環境1と仮想環境2を別々のVagrantfileで定義
- どちらの環境もSynced FolderをNFSを使ってマウントするように
不具合の発生
- 仮想環境1で
vagrant up
。 - 起動後、仮想環境1にSSH接続してマウントされたディレクトリを確認。
- 仮想環境2で
vagrant up
。 - 起動後、仮想環境2のマウントされたディレクトリは問題ないが、仮想環境1でマウントしたディレクトリにアクセスできず
原因の調査
VM起動時に以下のような流れでディレクトリをマウントしていることを確認。
- 現在の
/etc/exports
のバックアップファイルを作成 - Synced Folderの共有設定を
/etc/exports
に書き込み - VMが指定したディレクトリをNFSマウント
-
/etc/exports
を1.で作成したバックアップファイルに復元
どうやら2つめのVMを起動した際に 1つめのVMに対するNFSサーバーの設定が無効化 されてしまったことが原因のよう。
これはVagrantのバグ報告でも上がっているのだけど、まだ対応もコメントもされていない。(バージョン1.7.2時点)
参考:NFS problem on multiple machines #4990
解決策
だったら手動で /etc/exports
を書いておいて、Vagrantには触らせなければ良いじゃん!ということで。
/etc/exportsの手動設定
/srv -network 192.168.33.0 -mask 255.255.255.0 -alldirs -mapall=501:20
-
/srv
以下のディレクトリを 192.168.33.x のIPアドレスからマウントできるように設定。 - サブディレクトリのマウントを許可
NFSサーバーの再起動
/etc/exports
は更新しただけではNFSサーバーに設定が反映されないので、Macを再起動するか、NFSサーバーを再起動する。
sudo kill -s HUP `cat /var/run/mountd.pid`
Vagrantfileの設定
VagrantでSynced FolderにNFSを指定すると、通常では毎回 /etc/exports
を書き換えてしまう。
そのため、Synced Folderのオプションで nfs_export: false
を指定し、書き換えを行わないように設定する必要がある。
config.vm.synced_folder ".", "/vagrant", type: "nfs", nfs_export: false, mount_options: ["nolock", "vers=3", "udp"]