我有一个Redhat 6.0系统(启用了SELinux),在/ myvolume上挂载一个NFS卷。
命令ls -la /myvolume表示它拥有owner“nobody”和group“nobody”。
在这个系统上我有Apache作为“apache”用户和“apache”组运行。
Apache通过mod_wsgi运行一个python脚本。 该脚本创build一个临时目录(使用tempfile.mkdtemp),在其中创build一些文件,然后将整个目录移动到/ myvolume中。
脚本完成后,所创build的文件拥有所有者“nodody”和组“nobody”,权限掩码为“rwx ——”。
我已经validation了我自己的用户不能访问这些文件,除非我使用“sudo”,而Apache用户可以访问它们。
为什么发生这种情况? 与SELinux,Unix权限,NFS卷或nodoby用户有关吗? 为什么试图“chown”/ myvolume中的任何文件会导致“无效参数”错误?
这与nfs有关。
http://tldp.org/HOWTO/NFS-HOWTO/server.html声明如下:
“no_root_squash:默认情况下,root用户在客户端机器上发出的任何文件请求都被视为是由服务器上的nobody用户创build的(Excatly请求映射到哪个UID取决于用户”nobody“的UID如果select了no_root_squash,则客户机上的root用户对系统上的文件的访问级别与服务器上的root用户具有相同的访问级别,但这可能会造成严重的安全隐患,尽pipe可能有必要如果你想在涉及到输出目录的客户端机器上执行任何pipe理工作,你不应该没有很好的理由指定这个选项。
不build议在nfs服务器上激活no_root_squash。 我引用此选项仅用于文档目的。
一种解决scheme是在nfs客户端和nfs服务器上使用相同的uid和gid创build一个用户和一个组。 然后configurationApache以执行你的脚本与这个用户。