web-dev-qa-db-ja.com

OSX:NFSを使用したUbuntuゲストとのvagrantのロックが機能しない

Ubuntu 14.04LTSゲストの共有フォルダーにNFSを使用するときにVirtualBox4.3.26とvagrant1.7.2を使用するOSX10.10.3では、PHPアプリケーションは、共有でLOCK_EXを使用しようとしているゲストを挿入しますフォルダは単に永久にロックされます(または:長すぎて使用できません)。

この設定は、何ヶ月も機能していました。ホストの起動後約2日前に、Vagrantマシンが使用できなくなり、それ以降、そのVMの新しいビルドでこの問題が発生します(最初の問題はすでにこれに関連している可能性があります)。

過去数日間、新しいソフトウェアはインストールされませんでした。 OSXのアップグレードは先週頃に実行されましたが、そのマシンのすべてが引き続き機能していました。

長い検索の結果、原因はNFS共有フォルダーであることがわかりました。私たちはこのラインを長い間使用していました:

config.vm.synced_folder ".", "/vagrant", type: nfs

ゲスト内のstraceは次のようになります。

[pid 26767] open("/vagrant/some/file", O_RDWR|O_CREAT, 0666) = 5
[pid 26767] fstat(5, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
[pid 26767] lseek(5, 0, SEEK_CUR)      = 0
[pid 26767] chmod("/vagrant/some/file", 0777) = 0
[pid 26767] flock(5, LOCK_EX

この時点でハングします。私はそれを自分で再現することさえできました:

<?php
$f = fopen('lock.test', 'w');
echo "Trying to get lock on file ...\n";
var_dump(flock($f, LOCK_EX));
echo "Got lock, unlocking\n";
var_dump(flock($f, LOCK_UN));
echo "Exiting\n";

残念ながら、最初のflock行にぶら下がっていました。

/etc/expoertsシステムをチェックし、VMがシャットダウンされたら、壊れた/古い残り物がないクリーンなファイルであることを確認しました。

同じ他のソフトウェアを使用した別の10.10.3でのまったく同じセットアップは、問題なく機能します(ハードウェアは少し異なりますが)。この他のハードウェアでVMを1日に複数回ビルドしましたが、すべてが期待どおりに機能します。

明らかにパフォーマンスの低下のため、NFSを再び正しく機能させることが絶対に望まれます(共有フォルダーをまったく使用しないことは現在のところオプションではありません)。

6
mark

私はまったく同じ問題を抱えていました。次のオプションに変更すると問題が解決したことをどこかで読みました。

config.vm.synced_folder ".", "/vagrant", mount_options: ["rw", "tcp", "nolock", "noacl", "async"], type: "nfs", nfs_udp: false

私にとって、私がしなければならなかったのは、これを次のオプションを追加することに絞り込むことだけでした。

mount_options: ["nolock"]

したがって、行は次のようになります。

config.vm.synced_folder ".", "/vagrant", mount_options: ["nolock"], type: "nfs"
2
Thijs Riezebeek