OSX:使用 NFS 将 Vagrant 与 Ubuntu 客户机锁定不起作用

OSX:使用 NFS 将 Vagrant 与 Ubuntu 客户机锁定不起作用

在 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"

相关内容