在 OSX 10.10.3 上使用 VirtualBox 4.3.26 和 vagrant 1.7.2,当在 Ubuntu 14.04 LTS 客户机中使用 NFS 作为共享文件夹时,客户机中的 PHP 应用程序尝试在共享文件夹上使用 LOCK_EX,但会永远锁定(或:时间太长而无法使用)。
这个设置曾经工作了几个月。大约两天前,在主机启动后,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
系统并确保虚拟机关闭后它是一个干净的文件,没有任何损坏/旧的残留物。
在另一个 10.10.3 上使用相同的其他软件进行同样的设置,没有出现问题(尽管硬件略有不同)。我每天多次在这个其他硬件上构建虚拟机,一切都按预期运行。
显然,由于性能损失,绝对希望让 NFS 再次正常工作(目前根本不使用共享文件夹不是一个选择)。
答案1
我也遇到了同样的问题。我读到过一些文章说,改用以下选项可以解决他们的问题:
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"