在 Oracle® Solaris 11.2 中管理网络文件系统

退出打印视图

更新时间: 2014 年 7 月
 
 

NFS 版本 4 的功能

本节介绍 NFS 版本 4 中引入的功能:


注 -  从 Oracle Solaris 10 发行版开始,NFS 版本 4 不支持 LIPKEY/SPKM 安全风格。另外,NFS 版本 4 也不会使用 mountdnfslogdstatd 守护进程。

有关设置 NFS 服务的信息,请参见设置 NFS 服务

在 NFS 版本 4 中取消共享和重新共享文件系统

如果同时使用 NFS 版本 3 和 NFS 版本 4,则客户机尝试访问一个已经取消共享的文件系统时,服务器会以错误代码响应。但是,如果使用 NFS 版本 3,则服务器会保留客户机在取消共享文件系统之前所获取的所有锁定。这样,重新共享文件系统时,NFS 版本 3 客户机即可访问此文件系统,就好像从未取消共享此文件系统一样。

如果使用 NFS 版本 4,则取消共享文件系统时,将销毁此文件系统中任何打开文件或文件锁定的所有状态信息。如果客户机尝试访问这些文件或锁定,则会收到一条错误消息。通常会将此错误消息作为 I/O 错误报告给应用程序。但是,通过重新共享当前共享的文件系统来更改选项不会销毁服务器上的任何状态信息。

有关 NFS 版本 4 中客户机恢复的信息,请参见NFS 版本 4 中的客户机恢复。有关 unshare 命令可用选项的信息,请参见 unshare_nfs(1M) 手册页。

NFS 版本 4 中的文件系统名称空间

NFS 版本 4 服务器可创建并维护一个伪文件系统,此系统使客户机能够对服务器上所有导出的对象进行无缝访问。在 NFS 版本 4 之前,不存在伪文件系统。客户机会强制挂载每个共享服务器文件系统来进行访问。

伪文件系统是服务器创建的仅包含目录的结构。伪文件系统允许客户机浏览已导出文件系统的分层结构。因此,客户机的伪文件系统视图限制为仅显示通向已导出文件系统的路径。

    以前的 NFS 版本不允许客户机在未挂载每个文件系统的情况下遍历服务器文件系统。但是,在 NFS 版本 4 中,服务器名称空间可进行以下操作:

  • 将客户机的文件系统视图限制为仅显示通向服务器导出的目录。

  • 使客户机能够对服务器导出目录进行无缝访问,而不要求客户机挂载每个底层文件系统。但是,不同的操作系统可能会要求客户机挂载每个服务器文件系统。

图 2-2  NFS 版本 4 中的服务器文件系统和客户机文件系统视图

image:此图显示了同一文件系统的服务器和客户机视图。

在图中所示的示例中,客户机无法看到 payroll 目录和 nfs4x 目录,因为这些目录未导出,也不通向导出的目录。但是,客户机可以看到 local 目录,因为 local 是一个导出的目录。客户机还可看到 projects 目录,因为 projects 通向导出的目录 nfs4。因此,未显式导出的服务器名称空间的部分内容会与伪文件系统桥接,该文件系统仅显示导出的目录和那些通向服务器导出目录的目录。

NFS 版本 4 中的可变文件句柄

    文件句柄是在服务器上创建的,其中包含唯一标识文件和目录的信息。在 NFS 版本 2 和 NFS 版本 3 中,服务器返回持久性文件句柄。这样,客户机即可确保服务器会生成始终引用同一文件的文件句柄。例如:

  • 如果删除某个文件并将其替换为同名文件,则服务器会为新文件生成新的文件句柄。如果客户机使用旧的文件句柄,则服务器会返回一条错误消息,说明此文件句柄已过时。

  • 如果重命名文件,则文件句柄将保持不变。

  • 如果重新引导了服务器,则文件句柄将保持不变。

因此,当服务器从客户机收到包括文件句柄的请求时,解决方案会非常简单,并且文件句柄会始终引用正确的文件。

使用持久性文件句柄为 NFS 操作标识文件和目录的方法对大多数基于 UNIX 的服务器都很有效。但是,此方法不能在依赖其他标识方法(如文件的路径名)的服务器上实施。为了解决此问题,NFS 版本 4 协议允许服务器声明其文件句柄为可变句柄。如果文件句柄确实已更改,则客户机必须找到新的文件句柄。

与 NFS 版本 2 和 NFS 版本 3 服务器一样,Oracle Solaris NFS 版本 4 服务器也始终提供持久性文件句柄。但是,访问非 Oracle Solaris NFS 版本 4 服务器的 Oracle Solaris NFS 版本 4 客户机必须在服务器使用可变文件句柄时支持这些句柄。具体来说,当服务器通知客户机文件句柄可变时,客户机必须高速缓存路径名和文件句柄之间的映射。客户机会一直使用可变文件句柄,直到句柄过期为止。文件句柄过期后,客户机会执行以下操作:

  • 刷新引用此文件句柄的高速缓存信息

  • 搜索此文件的新文件句柄

  • 重试此操作


注 -  服务器会始终通知客户机哪些文件句柄为持久性句柄,哪些文件句柄为可变句柄。

    可变文件句柄可能会在以下任一情况下过期:

  • 关闭文件

  • 迁移文件句柄的文件系统

  • 客户机重命名文件

  • 服务器重新引导

如果客户机无法找到新的文件句柄,则会在 syslog 文件中记录一条错误消息。进一步尝试访问此文件会失败,并显示I/O错误。

NFS 版本 4 中的客户机恢复

NFS 版本 4 协议为有状态协议。客户机和服务器都会维护有关打开文件和文件锁定的最新信息。

服务器崩溃并重新引导时,会丢失其状态。客户机检测到服务器已经重新引导后,将开始帮助服务器重新建立在发生故障之前存在的打开和锁定状态的进程。该进程称为客户机恢复,因为由客户机引导该进程。

客户机检测到服务器已经重新引导后,便会立即暂停其当前活动并开始客户机恢复进程。启动恢复进程时,系统错误日志 /var/adm/messages 中会显示如下消息:

NOTICE: Starting recovery server server-name

在恢复进程中,客户机会向服务器发送有关客户机以前状态的信息。但是,在此期间,客户机不会向服务器发送任何新请求。对打开文件或设置文件锁定的任何新请求都必须等到服务器完成其恢复进程之后才能继续进行。

客户机恢复进程完成时,系统错误日志 /var/adm/messages 中会显示以下消息:

NOTICE: Recovery done for server server-name

此时,客户机已经成功地将其状态信息发送给服务器。但是,尽管该客户机已完成该进程,其他客户机可能尚未这样做。因此,在一段时间内(称为宽延期),服务器不会接受任何打开或锁定请求,以使所有客户机完成其恢复。

在宽延期内,如果客户机尝试打开任何新文件或建立任何新锁定,服务器都会拒绝请求并显示 GRACE 错误代码。收到此错误后,客户机必须等到宽延期结束,然后才能向服务器重新发送请求。在宽延期内,会显示以下消息:

NFS server recovering

在宽延期内,可以继续执行不打开文件或不设置文件锁定的命令。例如,lscd 命令不会打开文件或设置文件锁定,这些命令不会暂停。但是,cat 之类可打开文件的命令会暂停执行,直到宽延期结束为止。

宽延期结束后,会显示以下消息:

NFS server recovery ok.

现在,客户机即可向服务器发送新的打开和锁定请求。

客户机恢复会因为各种原因而失败。例如,如果服务器重新引导后存在网络分区,则客户机可能无法在宽延期结束之前与服务器重新建立其状态。宽延期结束后,服务器不允许客户机重新建立其状态,因为新的状态操作可能会产生冲突。例如,新的文件锁定可能会与客户机尝试恢复的旧的文件锁定发生冲突。发生这种情况时,服务器会将 NO_GRACE 错误代码返回到客户机。

如果恢复某个文件的打开操作失败,客户机会将此文件标记为不可用,并显示以下消息:

WARNING: The following NFS file could not be recovered and was marked dead 
(can't reopen:  NFS status n):  file :  filename

如果在恢复期间重新建立文件锁定失败,将显示以下错误消息:

NOTICE: nfs4_send_siglost:  pid process-ID lost
lock on server server-name

在这种情况下,会向进程发送 SIGLOST 信号。SIGLOST 信号的缺省操作是终止此进程。

要从此状态恢复,必须重新启动所有在失败时打开文件的应用程序。一些没有重新打开文件的进程可能会收到I/O错误消息。在恢复失败之后已重新打开文件或执行打开操作的其他进程可顺利访问文件。

因此,一些进程可以访问其他进程无法访问的特定文件。

NFS 版本 4 中的 OPEN 共享支持

    NFS 版本 4 协议提供了几种文件共享模式,客户机可以使用这些模式控制其他客户机对文件的访问。客户机可以指定以下内容:

  • DENY_NONE 模式,用于允许其他客户机对文件进行读写访问。

  • DENY_READ 模式,用于拒绝其他客户机对文件进行读取访问。

  • DENY_WRITE 模式,用于拒绝其他客户机对文件进行写入访问。

  • DENY_BOTH 模式,用于拒绝其他客户机对文件进行读写访问。

Oracle Solaris NFS 版本 4 服务器完全实现了这些文件共享模式。因此,如果客户机尝试打开文件的方式与当前共享模式冲突,则服务器会通过使操作失败来拒绝此尝试。如果这类尝试在打开或创建操作开始时失败,则 NFS 版本 4 客户机会收到一条协议错误消息。此错误会映射为应用程序错误 EACCES

尽管此协议提供了几种共享模式,但 Oracle Solaris 中的打开操作不提供多种共享模式。打开文件时,Oracle Solaris NFS 版本 4 客户机只能使用 DENY_NONE 模式。


注 -  尽管 fcntl 系统调用使用 F_SHARE 命令来控制文件共享,但是 fcntl 命令无法在 NFS 版本 4 中正常实现。如果在 NFS 版本 4 客户机上使用这些 fcntl 命令,则客户机会向应用程序返回一条 EAGAIN 错误消息。

NFS 版本 4 中的委托

NFS 版本 4 为委托同时提供客户机支持和服务器支持。委托是服务器用于将文件管理委托给客户机的一种技术。例如,服务器可以授予客户机读取委托或写入委托。由于读取委托不会彼此冲突,因此可将其同时授予多台客户机。写入委托只能授予一台客户机,因为写入委托会与其他任何客户机进行的任何文件访问相冲突。虽然客户机拥有写入委托,但是它不会向服务器发送各种操作,因为客户机保证具有对文件的独占访问权限。同样,客户机在拥有读取委托时也不会向服务器发送各种操作。因为服务器保证任何客户机都不能以写入模式打开文件。

通过委托,可显著减少服务器和客户机之间针对被委托文件的交互。因此,可降低网络通信流量,并且提高客户机和服务器的性能。但是,性能提高的程度取决于应用程序使用的文件交互的类型以及网络和服务器的拥塞量。

客户机不会请求委托。是否授予委托完全由服务器根据文件的访问模式决定。如果多个不同客户机最近在写入模式下访问了某个文件,则服务器可能不会授予委托,因为这种访问模式表明将来可能产生冲突。

当客户机访问文件的方式与当前授予此文件的委托不一致时,便会发生冲突。例如,如果一台客户机拥有对文件的写入委托,同时另一台客户机打开此文件来进行读取或写入访问,则服务器会撤销第一台客户机的写入委托。同样,如果一台客户机拥有读取委托,同时另一台客户机打开同一个文件进行写入,则服务器会撤销读取委托。在这两种情况下都不会将委托授予第二台客户机,因为此时存在冲突。

发生冲突时,服务器会使用回调机制来联系当前拥有委托的客户机。收到此回调后,客户机会向服务器发送文件的更新状态并返回委托。如果客户机无法对重新调用做出响应,则服务器会撤销委托。在此类情况下,服务器会拒绝客户机对此文件进行的所有操作,客户机将已请求的操作报告为失败。通常,这些失败会作为I/O错误报告给应用程序。要从这些错误中恢复,必须关闭文件,然后再重新打开。当客户机和服务器之间存在网络分区并且客户机拥有委托时,撤销委托会失败。

请注意,一台服务器不能解决对其他服务器上存储的文件的访问冲突。因此,NFS 服务器仅解决它自己存储的文件的冲突。此外,要响应由运行各种 NFS 版本的客户机导致的冲突,NFS 服务器只能对运行 NFS 版本 4 的客户机启动重新调用。NFS 服务器不能对运行早期 NFS 版本的客户机启动重新调用。

检测冲突的进程会有所变化。例如,与 NFS 版本 4 不同,因为 NFS 版本 2 和 NFS 版本 3 不包括打开过程,所以仅会在客户机尝试读取、写入或锁定文件之后检测冲突。服务器对这些冲突的响应也会有所不同。例如:

  • 对于 NFS 版本 3,服务器会返回 JUKEBOX 错误消息,这会导致客户机停止访问请求并稍后重试。客户机会显示消息 File unavailable

  • 对于 NFS 版本 2,因为不存在与 JUKEBOX 错误消息等效的消息,所以服务器不做任何响应,这会导致客户机等待然后再重试。客户机会显示消息 NFS server not responding

解决委托冲突后,便会清除错误消息。

缺省情况下,会启用服务器委托。您可以通过将 server_delegation 参数设置为 off 来禁用委托。

# sharectl set -p server_delegation=off nfs

客户机委托不需要任何关键字。NFS 版本 4 回调守护进程 nfs4cbd 在客户机上提供回调服务。只要启用对 NFS 版本 4 的挂载,此守护进程就会自动启动。缺省情况下,客户机会针对 /etc/netconfig 系统文件中列出的所有 Internet 传输向服务器提供必需的回调信息。如果在客户机上启用了 IPv6 并且可以确定客户机名称的 IPv6 地址,则回调守护进程可接受 IPv6 连接。

回调守护进程使用临时的程序编号以及动态指定的端口号。此信息提供给服务器,服务器会在授予任何委托之前测试回调路径。如果回调路径测试不成功,则服务器不会授予委托,这是唯一可从外部看到的行为。

因为回调信息嵌在 NFS 版本 4 请求中,所以服务器不能通过使用网络地址转换 (Network Address Translation, NAT) 的设备来联系客户机。另外,回调守护进程还会使用动态端口号。因此,即使防火墙在端口 2049 上启用了正常的 NFS 流量,服务器可能仍然无法遍历防火墙。在此类情况下,服务器不会授予委托。

NFS 版本 4 中的 ACL 和 nfsmapid

访问控制列表 (access control list, ACL) 通过使文件的所有者可以为文件所有者、组以及其他特定用户和组定义文件权限来提供文件安全性。在 ZFS 文件系统上,您可以使用 chmod 命令在服务器和客户机上设置 ACL。对于 UFS 文件系统,您可以使用 setfacl 命令。有关更多信息,请参见 chmod(1)setfacl(1) 手册页。在 NFS 版本 4 中,ID 映射器 nfsmapid 用于将服务器上的 ACL 项中的用户 ID 或组 ID 映射为客户机上的 ACL 项中的用户 ID 或组 ID。相反的映射也能实现:ACL 项中的用户 ID 和组 ID 必须同时存在于客户机和服务器上。

有关 ACL 和 nfsmapid 的更多信息,请参见以下内容:

ID 映射问题

    以下情况可能导致 ID 映射失败:

  • 如果存在于服务器上 ACL 项中的用户或组不能映射为客户机上的有效用户或组,则该用户可以读取 ACL,但某些用户或组将显示为 unknown

    例如,在这种情况下,发出 ls –lvls –lV 命令时,某些 ACL 项会将组或用户显示为 unknown

  • 如果不能将客户机上设置的任何 ACL 项中的用户 ID 或组 ID 映射为服务器上的有效用户 ID 或组 ID,则 setfaclchmod 命令可能会失败,并返回 Permission denied 错误消息。

  • 如果客户机和服务器的 nfsmapid_domain 值不匹配,则 ID 映射将失败。有关更多信息,请参见NFS 守护进程

    要避免 ID 映射问题,请执行以下操作:

  • 确保 nfsmapid_domain 的值已正确设置。/var/run/nfs4_domain 文件中包含当前选定的 NFSv4 域。

  • 确保 ACL 项中的所有用户 ID 和组 ID 同时存在于 NFS 版本 4 客户机和服务器上。

检查是否存在未映射的用户 ID 或组 ID

要确定是否有无法在服务器或客户机上映射的用户或组,请使用以下脚本:

#! /usr/sbin/dtrace -Fs

sdt:::nfs4-acl-nobody
{
     printf("validate_idmapping: (%s) in the ACL could not be mapped!", 
stringof(arg0));
}

注 -  此脚本中使用的探测器名称是一个接口,该接口以后可以更改。有关更多信息,请参见Oracle Solaris 11.2 Dynamic Tracing Guide 中的Stability Levels