抱歉,我不确定,如果这是正确的论坛,因为我不知道问题的原因,我就是这样。
我在Raspbian(Stretch 9)上安装了NextCloud,并将数据目录移动到已挂载的NFS文件夹。当我尝试访问NextCloud时,收到错误消息'数据目录不可写'。
所以我更深入挖掘并最终将问题与PHP7.0和NFS之间的交互隔离开来:
由于某种原因,应用程序可以写入目录但is_writable返回false。
我创建了以下PHP脚本:
<?php
$dirname = '/var/churros/data/nextcloud/';
//$dirname = '/tmp/';
$myfile = fopen($dirname.'newfile.txt', "w") or die("Unable to open file!");
$txt = "John Doe\n";
fwrite($myfile, $txt);
fclose($myfile);
echo nl2br("File ".$dirname."newfile.txt written\n");
if (touch($dirname.'/chkpt.tmp')) {
echo nl2br("touch(".$dirname."/chkpt.tmp) successful\n");
} else {
echo nl2br("touch(".$dirname."/chkpt.tmp) failed\n");
}
if (is_writable($dirname)) {
echo 'Directory '.$dirname.' is writable';
} else {
echo 'Directory '.$dirname.' is not writable';
}
phpinfo();
?>
结果就是
is_writable
返回false Screenshot of 'debug.php' with NFS directory \tmp
等本地目录时,一切正常 Screenshot of 'debug.php' with /tmp directory 我的NFS挂载为
192.168.1.100:/volume1/pidata/donut on /var/churros type nfs4 (rw,relatime,vers=4.0,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.103,local_lock=none,addr=192.168.1.100)
显然用户映射和访问权限是正确的:
namei -l /var/churros/web/nextcloud/
f: /var/churros/web/nextcloud/
drwxr-xr-x root root /
drwxr-xr-x root root var
drwxr-xr-x root root churros
drwxr-xr-x www-data www-data web
drwxrwxr-x www-data www-data nextcloud
在命令行上,作为用户www-data,我可以访问该目录并写入该目录。
最后,SELinux在盒子上安装/启用
。所以:任何想法为什么PHP is_writable在NFS目录上失败或者我如何调试这个PHP函数?
答案 0 :(得分:4)
问题可能是 unix用户ID 与2个不同系统的用户“www-data”不同。
详细地说,从php src,您可以看到:
反过来:
是virtual_access()
的便利包装器
是access()函数的线程安全包装 考虑每线程虚拟工作目录。
最后,看access() doc:
access()函数根据amode中包含的位模式检查由path参数指向的路径名指定的文件,使用真实用户ID代替有效用户ID和实际组ID有效组ID的位置。
以及access() linux documentation,它声明:
在启用了UID映射的NFS文件系统上,access()可能无法正常工作,因为UID映射在服务器上完成,并且从客户端隐藏,后者检查权限。 FUSE安装可能会出现类似问题。
尝试:
model.abc_model
并查看您获得的 uid 。
参考:
答案 1 :(得分:0)
这很可能是is_writable()
函数的错误。
您可以修复此NextCloud问题:
} else if (!is_writable($CONFIG_DATADIRECTORY) or !is_readable($CONFIG_DATADIRECTORY)) {
//common hint for all file permissions error messages
$permissionsHint = $l->t('Permissions can usually be fixed by giving the webserver write access to the root directory. See %s.',
[$urlGenerator->linkToDocs('admin-dir_permissions')]);
$errors[] = [
'error' => 'Your data directory is not writable',
'hint' => $permissionsHint
];
和
/usr/share/webapps/nextcloud/lib/private/Console/Application.php
if ($input->getFirstArgument() !== 'check') {
$errors = \OC_Util::checkServer(\OC::$server->getSystemConfig());
if (!empty($errors)) {
foreach ($errors as $error) {
$output->writeln((string)$error['error']);
$output->writeln((string)$error['hint']);
$output->writeln('');
}
throw new \Exception("Environment not properly prepared.");
}
}