OSX:使用 NFS 使用 Ubuntu 来宾锁定 vagrant 不起作用

mar*_*ark 6 virtualbox nfs ubuntu vagrant macos

在使用 VirtualBox 4.3.26 和 vagrant 1.7.2 的 OSX 10.10.3 上,当在 Ubuntu 14.04 LTS 来宾中使用 NFS 作为共享文件夹时,PHP 应用程序在来宾中尝试在共享文件夹上使用 LOCK_EX 只是永久锁定(或:太长可用)。

此设置曾经可以工作数月。大约两天前,在主机启动后,Vagrant 机器无法使用,从那时起,该 VM 的新版本就出现了这个问题(也许最初的问题已经与此有关)。

最近几天没有安装新软件。OSX 升级大约在上周进行,但那台机器上的一切都继续工作。

经过长时间的搜索,我们发现罪魁祸首是 NFS 共享文件夹。我们使用这条线已经很长时间了:

config.vm.synced_folder ".", "/vagrant", type: nfs
Run Code Online (Sandbox Code Playgroud)

一个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
Run Code Online (Sandbox Code Playgroud)

它挂在这一点上。我什至可以自己复制它:

<?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";
Run Code Online (Sandbox Code Playgroud)

不幸的是,它挂在第一flock行。

我检查了/etc/expoerts系统并确保它是一个干净的文件,在 VM 关闭后没有损坏/旧的残留物。

在另一个具有相同其他软件的 10.10.3 上的相同设置可以正常工作(尽管硬件略有不同)。我确实每天多次在其他硬件上构建 VM,一切都按预期工作。

显然,由于性能损失,绝对希望让 NFS 再次正常工作(根本不使用共享文件夹目前不是一种选择)。

小智 2

我有同样的问题。我在某处读到,更改以下选项解决了他们的问题:

config.vm.synced_folder ".", "/vagrant", mount_options: ["rw", "tcp", "nolock", "noacl", "async"], type: "nfs", nfs_udp: false
Run Code Online (Sandbox Code Playgroud)

对我来说,我所要做的就是缩小范围,添加以下选项:

mount_options: ["nolock"]
Run Code Online (Sandbox Code Playgroud)

所以你的行应该看起来像:

config.vm.synced_folder ".", "/vagrant", mount_options: ["nolock"], type: "nfs"
Run Code Online (Sandbox Code Playgroud)