版本 4 的 NFS 协议 (RFC3530) 更改了用户标识符或组标识符(UID 或 GID)在客户机与服务器之间的交换方式。该协议要求分别采用 user@nfsv4_domain 或 group@nfsv4_domain 格式将文件的属主属性和组属性作为字符串在 NFS 版本 4 客户机与 NFS 版本 4 服务器之间进行交换。
例如,用户 known_user 在 NFS 版本 4 客户机上具有 UID 123456,该客户机的完全限定主机名为 system.example.com。客户机为了向 NFS 版本 4 服务器发出请求,必须将 UID 123456 映射为 known_user@example.com,然后将此属性发送到 NFS 版本 4 服务器。NFS 版本 4 服务器希望接收 user_or_group@nfsv4_domain 格式的用户和组文件属性。服务器从客户机收到 known_user@example.com 后,就会将该字符串映射为基础文件系统可以识别的本地 UID 123456。此功能假设网络中的每个 UID 和 GID 都是唯一的,并且客户机中的 NFS 版本 4 域与服务器上的 NFS 版本 4 域匹配。
如果服务器不能识别给定的用户名或组名,即使 NFS 版本 4 域匹配,服务器也不能将该用户名或组名映射为其唯一 ID(整数值)。在这类情况下,服务器会将传入的用户名或组名映射为 nobody 用户。为了防止这类情况出现,管理员应避免创建仅在 NFS 版本 4 客户机上存在的特殊帐户。
NFS 版本 4 客户机和服务器都能执行整数到字符串和字符串到整数的转换。例如,在对 GETATTR 操作进行响应时,NFS 版本 4 服务器会将从基础文件系统获取的 UID 和 GID 映射到其各自的字符串说明中,并将此信息发送到客户机。或者,客户机还必须将 UID 和 GID 映射到字符串说明中。例如,在对 chown 命令进行响应时,客户机在将 SETATTR 操作发送到服务器之前会先将新的 UID 或 GID 映射到字符串说明中。
但是请注意,客户机和服务器将以不同的方式对不能识别的字符串做出响应:
如果用户不在服务器上,即使在同一 NFS 版本 4 域配置中,服务器也会拒绝远程过程调用 (remote procedure call, RPC) 并向客户机返回错误消息。这种情况将限制远程用户可以执行的操作。
如果用户同时位于客户机和服务器上,但是它们具有的域不匹配,则服务器将拒绝要求服务器将传入的用户字符串映射为基础文件系统可以识别的整数值的属性修改操作(如 SETATTR)。为了使 NFS 版本 4 客户机和服务器能够正常运行,其 NFS 版本 4 域(即 @ 符号后面的字符串部分)应该匹配。
如果 NFS 版本 4 客户机不能识别来自服务器的用户名或组名,则客户机无法将字符串映射为其唯一的 ID(整数值)。在这类情况下,客户机会将传入的用户字符串或组字符串映射为 nobody 用户。映射为 nobody 将为不同的应用程序带来各种问题。至于 NFS 版本 4 功能,修改文件属性的操作将会失败。
下面介绍了 nfsmapid 守护进程使用 /etc/nsswitch.conf 和 /etc/resolv.conf 文件的方式:
nfsmapid 使用标准的 C 库函数从后端命名服务中请求口令和组信息。这些命名服务由 /etc/nsswitch.conf 文件中的设置控制。对 nsswitch.conf 文件的任何更改都会影响 nfsmapid 操作。有关 nsswitch.conf 文件的更多信息,请参见 nsswitch.conf(4) 手册页。
为确保 NFS 版本 4 客户机能够从不同的域挂载文件系统,nfsmapid 将依赖于 DNS TXT 资源记录 (resource record, RR) _nfsv4idmapdomain 的配置。有关配置 _nfsv4idmapdomain 资源记录的更多信息,请参见nfsmapid 和 DNS TXT 记录。另外,还要注意以下几点:
应该使用所需的域信息在 DNS 服务器上显式配置 DNS TXT RR。
为了使 resolver 能够找到 DNS 服务器并搜索客户机和服务器 NFS 版本 4 域的 TXT 记录,应该使用所需的参数配置 /etc/resolv.conf 文件。
有关更多信息,请参见以下内容:
为了使 nfsmapid 能正常工作,NFS 版本 4 客户机和服务器必须具有相同的域。为了确保与 NFS 版本 4 域匹配,nfsmapid 将遵循以下严格的优先级规则:
守护进程首先从 /etc/default/nfs 文件中查找已为 NFSMAPID_DOMAIN 关键字指定的值。如果找到了值,则指定的值将优先于其他任何设置。指定的值被附加到外发属性字符串上,并与传入属性字符串进行比较。有关 /etc/default/nfs 文件中的关键字的更多信息,请参见/etc/default/nfs 文件的关键字。有关过程信息,请参见设置 NFS 服务。
使用 NFSMAPID_DOMAIN 设置不具备可伸缩性,因此建议不要用于大型部署。
如果未对 NFSMAPID_DOMAIN 指定值,则守护进程会从 DNS TXT RR 中查找域名。nfsmapid 将依赖于 /etc/resolv.conf 文件中由 resolver 中的一组例程所使用的指令。resolver 将在已配置的 DNS 服务器中搜索 _nfsv4idmapdomain TXT RR。请注意,使用 DNS TXT 记录具备更强的伸缩性。出于此原因,继续使用 TXT 记录比在 /etc/default/nfs 文件中设置关键字更好。
如果没有提供域名的 DNS TXT 记录,则在缺省情况下 nfsmapid 守护进程将使用已配置的 DNS 域。
如果 /etc/resolv.conf 文件不存在,则 nfsmapid 将按照 domainname 命令的行为获取 NFS 版本 4 域名。具体来说,如果 /etc/defaultdomain 文件存在,则 nfsmapid 将使用与 NFS 版本 4 域对应的文件的内容。如果 /etc/defaultdomain 文件不存在,则 nfsmapid 将使用由网络的已配置命名服务提供的域名。有关更多信息,请参见 domainname(1M) 手册页。
DNS 普遍存在的这一特性为 NFS 版本 4 域名提供了有效的存储和分配机制。此外,由于 DNS 固有的可伸缩性,因此使用 DNS TXT 资源记录是为大型部署配置 NFS 版本 4 域名的首选方法。您应该在企业级 DNS 服务器上配置 _nfsv4idmapdomain TXT 记录。这类配置可确保任何 NFS 版本 4 客户机或服务器都能通过遍历 DNS 树找到其 NFS 版本 4 域。
以下是用于使 DNS 服务器能够提供 NFS 版本 4 域名的首选项的示例:
_nfsv4idmapdomain IN TXT "foo.bar" |
在本示例中,要配置的域名是用双引号引起来的值。请注意未指定 ttl 字段,且未将域附加到 _nfsv4idmapdomain(是 owner 字段中的值)中。此配置使 TXT 记录能够使用区域的颁发机构开始 (Start-Of-Authority, SOA) 记录中的 ${ORIGIN} 项。例如,在域名称空间的不同层次上,该记录的值可能为:
_nfsv4idmapdomain.subnet.yourcorp.com. IN TXT "foo.bar" _nfsv4idmapdomain.yourcorp.com. IN TXT "foo.bar" |
在使用 resolv.conf 文件搜索 DNS 树分层结构方面,此配置为 DNS 客户机提供了更大的灵活性。请参见 resolv.conf(4) 手册页。此功能提高了找到 TXT 记录的概率。为了获得更大的灵活性,较低层的 DNS 子域可以定义其各自的 DNS TXT 资源记录 (resource record, RR)。此功能使较低层的 DNS 子域可以覆盖由顶层 DNS 域定义的 TXT 记录。
TXT 记录指定的域可以是任意字符串,该字符串不一定与使用 NFS 版本 4 的客户机和服务器的 DNS 域匹配。您可以选择不与其他 DNS 域共享 NFS 版本 4 数据。
从 NFS 版本 4 的 Solaris 10 发行版开始,如果您的网络包括多个 DNS 域,但只有单个 UID 和 GID 名称空间,则所有的客户机都必须对 NFSMAPID_DOMAIN 使用一个值。 对于使用 DNS 的站点,nfsmapid 将通过从为 _nfsv4idmapdomain 指定的值中获取域名来解决此问题。有关更多信息,请参见nfsmapid 和 DNS TXT 记录。如果未将网络配置为使用 DNS,则在首次引导系统期间,Solaris OS 将使用 sysidconfig 实用程序为 NFS 版本 4 域名提供以下提示:
This system is configured with NFS version 4, which uses a domain name that is automatically derived from the system's name services. The derived domain name is sufficient for most configurations. In a few cases, mounts that cross different domains might cause files to be owned by nobody due to the lack of a common domain name. Do you need to override the system's default NFS verion 4 domain name (yes/no)? [no] |
缺省响应为 [no]。如果选择 [no],则将看到以下信息:
For more information about how the NFS version 4 default domain name is derived and its impact, refer to the man pages for nfsmapid(1M) and nfs(4), and the System Administration Guide: Network Services. |
如果选择 [yes],则将看到以下提示:
Enter the domain to be used as the NFS version 4 domain name. NFS version 4 domain name []: |
如果 NFSMAPID_DOMAIN 的值存在于 /etc/default/nfs 中,则您提供的 [domain_name] 将覆盖该值。
有关 nfsmapid 的更多信息,请参见以下内容: