mv 失败,但 cp 在 nfs mount 上成功

mv 失败,但 cp 在 nfs mount 上成功

我正在尝试将文件从本地目录移动到 CentOS 7 服务器上的 nfs 挂载目录。导出由 FreeNAS 提供。

两个目录均归当前用户所有,其权限至少为 755(nfs 显示为 777,但我不确定是否相信)。

我的 fstab 看起来像这样

host:/path/to/export /mnt/nfs         nfs     defaults        0 0

我无法移动文件

mv /local/file /mnt/nfs/file
mv: cannot create regular file 'file': Operation not permitted

但是我可以复制并删除它

cp /local/file /mnt/nfs/file
rm /local/file

输出mount

host:/path/to/export on /mnt/nfs type nfs (rw,relatime,vers=3,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=host,mountvers=3,mountport=908,mountproto=udp,local_lock=none,addr=host)

客户端上的目录权限

ls -ld /local /mnt/nfs
drwxrwxrwx. 15 user user 17 Nov 28 08:32 /mnt/nfs/
drwxrwxrwx. 2  root root 17 Nov 29 12:20 /local

经过进一步调查,这似乎与更改权限有关。mv带走文件的权限,但cp会创建一个从父目录继承权限的新文件。 看来 nfs mount 不允许我访问chown文件,即使我是 root 或文件的所有者。 所以现在我的问题是如何允许更改权限,或者忽略 中给出的权限mv

答案1

  • 您的密码/组数据库在客户端和服务器之间同步吗?
  • 您是否看到 nfs 客户端上 nfs 挂载目录上的任何文件归

    nobody nobody

  • 您能发布nfsidmap -d来自服务器和客户端的输出吗?提示 - 使用 NFSV4 时输出应该匹配。

您很可能遇到了 NFS 服务器和 NFS 客户端上的 UID/GID 不一致的情况。我将通过一个简单的示例来展示其工作原理。

假设您正在 NFS 客户端 /nfs_share 上共享,如下所示。请注意,nfs_share任何人都可以写入 (777)。

[root@nfsserver nfs_share]# cat /etc/exports
/nfs_share      192.168.0.52(rw,no_root_squash) 

[root@nfsserver nfs_share]# ls -ld /nfs_share
drwxrwxrwx. 2 root root 4096 Nov 30 23:55 /nfs_share

并像这样安装在你的 NFS 客户端上

mount 192.168.0.51:/nfs_share /mnt

现在你在 nfs 服务器上有一个叫 dmitry 的用户

[root@nfsserver nfs_share]# getent passwd|grep dmitry
dmitry:x:500:500::/home/dmitry:/bin/bash
[root@nfsserver nfs_share]# getent group|grep dmitry
dmitry:x:500:

在你的 nfs 客户端上,你有一个用户 helen

[root@nfsclient ~]# getent passwd|grep helen
helen:x:500:500::/home/helen:/bin/bash
[root@nfsclient ~]# getent group|grep helen
helen:x:500:

请注意,尽管他们是不同的用户 - 但他们具有相同的 UID 和 GID。那么如果我以用户 helen 的身份访问 nfs 共享上的文件会发生什么?

[helen@nfsclient mnt]$ touch helen_client
[helen@nfsclient mnt]$ ls -lrt
[helen@nfsclient mnt]$ ls -lrt
total 0
-rw-rw-r--. 1 nobody nobody 0 Nov 30 23:58 helen_client

在 NFS 客户端上,此新文件将显示为 所拥有nobody nobody。这是因为 nfsidmap 无法将 client_user_name@domain 映射到 server_user_name @domain。现在是休战时刻。让我们检查 nfs 服务器上的文件所有者是谁。

[root@nfsserver nfs_share]# ls -rlt
total 0
-rw-rw-r--. 1 dmitry dmitry 0 Nov 30 23:58 helen_client

惊讶了吗?
其实并没有什么奇怪的。一切按预期进行。NFS
服务器无法映射用户 helen,但它收到的是 UID 和 GID。因此它创建了 UID 和 GID 均为 500 和 500 的文件(因为文件夹是所有人都可写的),该文件映射到 NFS 服务器上的 dmitry:dmitry。

现在假设我们有其他用户的 UID/GID 和名称在服务器和客户端之间匹配

[root@nfsserver mnt]# getent passwd|grep angelina
angelina:x:501:501::/home/angelina:/bin/bash
[root@nfsserver mnt]# getent group|grep angelina
angelina:x:501:

[angelina@nfsclient mnt]$ getent passwd|grep angelina
angelina:x:501:501::/home/angelina:/bin/bash
[angelina@nfsclient mnt]$ getent group|grep angelina
angelina:x:501:

如果我以用户 angelina 的身份访问 nfs 客户端上的文件,我将在服务器和客户端上看到正确的用户名/组

[angelina@nfsclient mnt]$ pwd
/mnt
[angelina@nfsclient mnt]$ touch angelina_1
[angelina@nfsclient mnt]$ ls -l
total 0
-rw-rw-r--. 1 angelina angelina 0 Dec  1  2016 angelina_1
-rw-rw-r--. 1 nobody   nobody   0 Dec  1 00:16 helen_1

[root@nfsserver nfs_share]# pwd
/nfs_share
[root@nfsserver nfs_share]# ls -l
total 0
-rw-rw-r--. 1 angelina angelina 0 Dec  1 00:27 angelina_1
-rw-rw-r--. 1 dmitry   dmitry   0 Dec  1 00:16 helen_1

最重要的是,为了使 NFSV4 正常工作,您需要

  • 服务器和客户端密码/组数据库同步。最好使用 ldap。
  • 客户端和服务器应该就共同的域名达成一致nfsidmap -d

相关内容