尽管文件可以写

时间:2018-06-05 19:43:11

标签: php raspbian nfs

抱歉,我不确定,如果这是正确的论坛,因为我不知道问题的原因,我就是这样。

我在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();
?>

结果就是

我的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函数?

2 个答案:

答案 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

参考:

Similar issue with php session in nfs

答案 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.");
       }
}

Source #1Source #2