笔记:看起来将 selinux 设置为 Permissive 模式并不能防止此文件权限问题。
我们有一个运行 CentOs 7.2.1511 的开发虚拟机。文件通过 vagrant (virtualbox) 通过 NFS 与我们的主机 (Mac) 共享。
NFS 共享是为了让我们能够在主机上使用 PHPStorm 编辑代码。如果我们使用 SMB 共享,则不会出现此问题,但文件共享的读写性能会慢得令人难以接受。
vagrant中的共享设置为:
config.vm.synced_folder "code", "/srv/client/code" , :nfs=>true, :mount_options => ['rw,noatime,nolock,vers=3,udp,fsc,actimeo=2,resvport,rsize=32768,wsize=32768']
偶尔在运行git checkout x
或 时git clean -df
,我们会收到权限被拒绝的消息。
$ git clean -df
warning: failed to remove modules/node_modules/acorn/bin/acorn
warning: failed to remove modules/node_modules/acorn/bin/generate-identifier-regex.js
...
跑步ls -Z modules/node_modules/acorn/bin/acorn
$ ls -Z modules/node_modules/acorn/bin/acorn
-rwxr-xr-x. 503 games system_u:object_r:nfs_t:s0 modules/node_modules/acorn/bin/acorn
哪个是共享的正确用户/组以及正确的文件上下文,并且与可移动文件完全相同。例如
$ ls -Z composer.json
-rw-rw-r--. 503 games system_u:object_r:nfs_t:s0 composer.json
如果我们尝试直接删除现在权限奇怪的文件,那么权限就会被拒绝。
$ rm modules/node_modules/acorn/bin/acorn
rm: cannot remove ‘modules/node_modules/acorn/bin/acorn’: Permission denied
但是,如果我们使用 vi 来查看文件并写入(甚至不做任何可编辑的更改),即
vi modules/node_modules/acorn/bin/acorn
:w
rm modules/node_modules/acorn/bin/acorn
将正常工作。
或者,如果我们从主机检出相关文件/目录,则问题就会消失,我们可以再次 rm 这些文件。
有人知道为什么这个文件权限偶尔会弹出吗?以及我们该如何修复它?
更新(2017-01-27) [应嵌入式要求]:
$ mount
运行re:nfs share的输出是:
10.20.30.1:/Path/to/code on /guest/path/code type nfs (rw,noatime,vers=3,rsize=16384,wsize=16384,namlen=255,acregmin=2,acregmax=2,acdirmin=2,acdirmax=2,hard,nolock,proto=udp,timeo=11,retrans=3,sec=sys,mountaddr=10.20.30.1,mountvers=3,mountport=839,mountproto=udp,fsc,local_lock=all,addr=10.20.30.1)
更新(2017-01-29) [应 lauc.exon.nod 的要求]:
已运行sudo setenforce Permissive
$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28
仍然无法删除之前错误的文件:
$ rm /guest/path/code/vendor/twig/twig/doc/filters/abs.rst
rm: cannot remove ‘/guest/path/code/vendor/twig/twig/doc/filters/abs.rst’: Permission denied
$ ls -Z /guest/path/code/vendor/twig/twig/doc/filters/abs.rst
-rw-rw-r--. 503 games system_u:object_r:nfs_t:s0 /guest/path/code/vendor/twig/twig/doc/filters/abs.rst
通过从主机中删除受影响的文件来清除此错误,然后能够使用新文件再次重现该错误。看起来将 selinux 设置为 Permissive 模式不会影响 NFS 问题。
更新(2017-01-31) [应 mzhaase 的要求]:
触摸存在权限问题的文件不会清除权限问题。随后使用 :w 执行 vim 确实清除了权限问题,然后文件被正确 rm。
更新(2017-02-02) [应allo的要求]:
尝试访问lsattr
具有权限错误的文件。不幸的是,收到了lsattr: Inappropriate ioctl for device...
。根据http://www.jpeek.com/articles/linuxmag/2008-07/- 支持的文件系统 - NFS 挂载不是 lsattr 型的。