系统管理指南:网络服务

NFS 版本 4 的委托

NFS 版本 4 为委托同时提供客户机支持和服务器支持。委托是服务器用于将文件管理委托给客户机的一种技术。例如,服务器可以授予客户机读取委托或写入委托。读取委托可以同时授予多台客户机,因为这些读取委托不会彼此冲突;写入委托只能授予一台客户机,因为写入委托会与其他任何客户机的任何文件访问相冲突。 虽然客户机拥有写入委托,但是它不会向服务器发送各种操作,因为客户机保证具有对文件的独占访问权限。同样,客户机在拥有读取委托时也不会向服务器发送各种操作。这是因为服务器保证任何客户机都不能以写入模式打开文件。通过委托,可显著减少服务器和客户机之间针对被委托文件的交互。因此,可降低网络通信量,并且提高客户机和服务器的性能。但是请注意,性能提高的程度取决于应用程序使用的文件交互的类型和网络和服务器的拥塞量。

是否授予委托完全由服务器决定。客户机不会请求委托。服务器可根据文件的访问模式来决定是否授予委托。如果几台不同的客户机最近以写入模式访问了文件,则服务器可能不会授予委托。原因是此访问模式表明将来可能会发生冲突。

当客户机访问文件的方式与当前授予此文件的委托不一致时,便会发生冲突。例如,如果一台客户机拥有对文件的写入委托,同时另一台客户机打开此文件来进行读取或写入访问,则服务器会撤销第一台客户机的写入委托。同样,如果一台客户机拥有读取委托,同时另一台客户机打开同一个文件进行写入,则服务器会撤销读取委托。请注意,在这两种情况下都不会将委托授予第二台客户机,因为此时存在冲突。发生冲突时,服务器会使用回叫机制来访问当前拥有委托的客户机。收到此回叫后,客户机会向服务器发送文件的更新状态并返回委托。如果客户机无法对回叫做出响应,则服务器会撤销委托。在这些情况下,服务器会拒绝客户机对此文件进行的所有操作,客户机将已请求的操作报告为失败。通常,这些失败作为 I/O 错误报告给应用程序。 要从这些错误中恢复,必须关闭文件,然后再重新打开。当客户机和服务器之间存在网络分区并且客户机拥有委托时,撤销委托会失败。

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

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

解决了委托冲突之后,便不会存在这些情况。

缺省情况下,会启用服务器委托。可以通过修改 /etc/default/nfs 文件来禁用委托。有关过程信息,请参阅如何在服务器上选择不同版本的 NFS

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

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

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