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)
归档时间: |
|
查看次数: |
1049 次 |
最近记录: |