我正在尝试将文件从本地目录移动到 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