我有一台带有 NFS 服务器的服务器(Ubuntu 20.04)。我想为每个用户共享 /home/user。但是在客户端(Ubuntu 18.04)上,ID 通常与服务器上的 ID 不同,从而导致所有权问题。
/etc/exports 如下所示
/home/user2 10.4.200.2(rw,sync,all_squash,anonuid=1002,anongid=1002)
/home/user3 10.4.200.3(rw,sync,all_squash,anonuid=1003,anongid=1003)
...
和
$ id user2
uid=1002(user2) gid=1002(user2) groups=1002(user2)
$ id user3
uid=1003(user3) gid=1003(user3) groups=1003(user3)
在客户端上,id 例如
$ id user2
uid=1001(user2) gid=1001(user2) groups=1001(user2)
在 fstab 中,我添加了以下行
10.4.200.2:/home/user2 /home/user2/server nfs rw 0 0
挂载文件夹(mount -a)后,所有权不匹配
$ ls -l | grep server
drwxr-xr-x 32 1002 1002 4096 sept. 3 11:32 server
$ cd server/
$ touch foo
touch: cannot touch 'foo': Permission denied
答案1
(此答案已在现实生活中得到测试和验证)
使用多个不同用户访问 NFS 共享 / NFS 挂载所有权问题 / NFS 挂载共享文件 / NFS 挂载访问权限问题
假设在网络中的某台机器上有一个包含数据文件的文件服务目录
。NFS
很难向几个不同的用户授予访问权限。
我找到了一种方法:
统一并使用传统 Unix 方式进行群组访问。
解决方案
a) 我在主机/服务器上为要共享的文件创建默认所有者。
例如:
用户 доступ uid = 1002,组 доступ gid 1003。
b) 我们假设 NFS 对每个人都运行良好。
任何用户都有权访问 r+w。
问题:
不幸的是,一个用户不能编辑(=覆盖)其他用户的文件。
主意:
创建一个公共组。
它将成为任何用户创建的所有文件的默认组
(例如:доступ,gid 1003)。
这是基于 Unix 中通过 gid 和 uid 授予访问权限的理念。
c) 在 /etc/login.defs 中将所有用户机器的 UMASK 从 022 更改为 002
:
UMASK 002
确保所有现有的要共享的文件都属于组 доступ
(提示:对于现有文件和目录,使用带有选项“exec”chgrp as sudo 的“find”命令来调整它们全部)。
d) 更改所有用户的默认组成员身份。
将默认成员身份设置为 доступ gid 1003。
略微匿名的示例
主机 /etc/exports 文件示例:
/srv/alle-daten 192.168.075.0/255.255.255.0(rw,no_root_squash,nohide,no_subtree_check,all_squash,anonuid=1002,anongid=1003)
(示例 ID 与示例默认用户相关,需要匹配!使用空格时要小心,即使它看起来很奇怪 - 这里不允许)
/etc/fstab 中客户端挂载的示例:
192.168.075.111:/srv/alle-daten/ /mnt/network-alle-data-nfs nfs nofail,timeo=600,_netdev,用户,rw 0 0
我花了好几年才找到这个解决方案。它兼容为相同用户和相同文件并行安装 SMB。
在实际生活中,它对我很有用。
如果我忘记提及重要的配置细节,请告诉我。
讨论
解决方案可能定义过度。请注意,导出的手册页(man exports)解释了任何用户到一个通用 uid/gid 的正确映射:
默认情况下,exportfs 会选择 65534 的 uid 和 gid 来进行压缩访问。这些值也可以通过 anonuid 和 anongid 选项覆盖。最后,您可以通过指定 all_squash 选项将所有用户请求映射到匿名 uid。
并进一步
all_squash:将所有 uid 和 gid 映射到匿名用户。
实际上我们确实将它们映射为:对于我们的默认用户 доступ ,其 uid = 1002,组 доступ gid 1003!
所以可能存在更简单的解决方案。
总有改进的空间。
欢迎提出建设性意见。