一开始无法 rm/unlink 文件,但在使用 vim 并写入文件后可以

一开始无法 rm/unlink 文件,但在使用 vim 并写入文件后可以

笔记:看起来将 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 型的。

相关内容