我已成功将 NFS 共享从远程计算机安装到本地。但是,我想在远程机器上编辑的文件都归root
.
如何挂载我的 NFS 驱动器,以便我的本地用户可以编辑这些文件?
我尝试了该idmap.conf
文件,但我不知道是否应该在本地或远程机器上编辑它,以及我应该重新启动哪些服务(再次,本地或远程)以产生任何影响。
从过去,我记得uid=X,gid=X
做这样的事情的选项,但我现在在这些选项上得到这个错误:
mount.nfs: an incorrect mount option was specified
我使用 Fedora 34 作为本地和 CentOS 7.6 远程。
对于所有基于文件的网络文件系统,文件权限由服务器强制执行。说您
ls -l
可以对文件执行的操作不一定与您实际可以使用该文件执行的操作相匹配。例如,如果您使用 SSHFS 并以“bart”身份进行身份验证,您可以让 SSHFS 客户端报告任何内容,但即使您是本地 root,您在服务器上也只会拥有用户“bart”的权限 - 本地uid=
选项不会对您的 SSHFS 帐户被允许执行的操作产生任何影响。但与 SSHFS(使用一个连接和一组凭据)不同,NFS 最初被设计为“系统范围”的功能,其中不同的用户可以使用相同的挂载,每个用户都有自己的权限 - 它被设计为与 NIS/YP 一起在同构环境中工作,NIS/YP 是一个确保相同帐户在每台机器上具有相同 UID 的系统。大多数 NFS 客户端功能(或缺乏)仍然反映了这一点。
因此,考虑到这一点,UID 在 NFS 中有两种完全不同且独立的用法:服务器报告的所有权数据和客户端报告的身份验证凭据。
服务器报告的所有权信息(例如 中的数据
ls -l
)作为 NFS 本身的一部分进行处理。(这是
uid=
相关的选项,但 Linux NFS 客户端没有它们,尽管其他一些文件系统有。)在 NFSv4 中,所有权信息可以使用“idmap”进行转换:服务器将 UID 转换为 username@domain,客户端将该用户名转换回其本地 UID。您需要确保双方使用相同的 idmap 域(由 报告
nfsidmap -d
)——如果不同,请在 idmap.conf 中进行设置。然而,这并不能真正让你对那个文件做任何事情——它主要是视觉的。在 NFSv3 中,只能报告一个数字 UID,并且没有映射它的工具——客户端总是看到存储在服务器上的 UID。
但是,实际有效权限依赖于客户端报告的信息,因为它们是在服务器端强制执行的,而不仅仅是在客户端。这是在 SunRPC 级别处理的,因此与 NFS 版本没有关系。
由于 NFS 客户端被设计为多用户,其默认的身份验证机制是简单地将访问用户的 UID 报告给服务器。因此,如果您使用
sec=sys
(默认)导出和挂载 NFS 共享,则客户端始终将您的真实 UID 报告给服务器,并且服务器无需任何验证即可信任它。不幸的是,虽然理论上可以在将 UID报告给服务器之前将其映射到此处,但 Linux NFS 客户端中根本没有这样的功能,它总是报告您的真实 UID。
要解决这个问题,您需要在所有系统中同步您帐户的 UID,或者通过
sec=krb5
. 这需要设置 Kerberos KDC 服务器。所以简而言之,
确保您使用的是 NFS v4。
运行
nfsidmap -d
并验证两个系统是否使用相同的 idmap 域。默认情况下,这是从系统的 FQDN (hostname -f
) 中猜测的,但也可以在/etc/idmapd.conf
. 该值不需要是真正的 DNS 域,只要是任意字符串即可。这应该修复由 显示的所有者ls
。强烈考虑设置 Kerberos,在您的服务器上运行 KDC(它可能是同一台服务器或不同的服务器),并将 NFS 切换为 sec=krb5。(特别是如果您在 Internet 上使用 NFS!)您不需要相关组件,如 LDAP、Active Directory 或 IPA。
(同样的 Kerberos 也可以通过“GSSAPIAuthentication”用于 SSH 身份验证,而不仅仅是 NFS。)
如果这不是一个选项,那么您将需要在一个系统上更改您帐户的 UID 以匹配另一个系统。通常只需以 root 身份登录并执行
usermod -u
操作(这也包含整个主目录)。您是本地计算机上的哪个用户?如果您也是 root,您应该能够编辑这些文件。如果您是 root 但无法编辑,请查看您的服务器
/etc/exports
文件,因为您的 root 用户可能会被压缩。除此之外,您应该在远程和本地机器上拥有相同的用户 ID。但是没有可供家庭使用的易于维护的解决方案。
如果您不是root 用户,则无法实现您的目标,因为不应允许任何人在远程计算机上编辑 root 用户的文件!