Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

第 8 章 网络文件系统 (NFS)

网络文件系统(NFS )允许远程主机通过网络挂载文件系统,并像在本地挂载这些文件系统一样与这些文件系统交互。这使系统管理员能够将资源整合到网络的集中服务器上。
本章重点介绍基本的 NFS 概念和补充信息。

8.1. NFS 简介

目前,Red Hat Enterprise Linux 包括两个主要版本的 NFS:
  • NFS 版本 3(NFSv3)支持安全的异步写入,并在错误处理时比之前的 NFSv2 更强大。它还支持 64 位文件大小和偏移,允许客户端访问 2 GB 以上的文件数据。
  • NFS 版本 4(NFSv4)通过防火墙和 Internet,不再需要 an rpcbind 服务,支持 ACL,并且利用有状态操作。
自 Red Hat Enterprise Linux 7.4 版本起,Red Hat Enterprise Linux 4.2(NFSv4.2)完全支持 NFS 版本 4.2(NFSv4.2)。
以下是 Red Hat Enterprise Linux 中的 NFSv4.2 的功能:
  • 稀疏文件:验证文件的空间效率,允许占位符提高存储效率。它是一个含有一个或多个漏洞的文件;漏洞是未分配或未初始化的数据块,仅由零组成。lseek() 在 NFSv4.2 中操作,支持 seek_hole()seek_data(),允许应用程序映射稀疏文件中的漏洞位置。
  • 空间保留:它允许存储服务器保留可用空间,这样可防止服务器耗尽空间。NFSv4.2 支持 allocate() 操作来保留空间、为取消保留空间的 deallocate() 操作,以及预分配或取消分配文件中空间的 fallocate() 操作。
  • 标记的 NFS:强制实施数据访问权限,并为 NFS 文件系统上的个别文件启用客户端和服务器之间的 SELinux 标签。
  • 布局增强:NFSv4.2 提供新的操作 layoutstats(),客户端可以使用它来通知元数据服务器与布局的通信。
早于 7.4 的 Red Hat Enterprise Linux 版本支持版本 4.1。
以下是 NFSv4.1 的功能:
  • 提高网络的性能和安全性,还包括对 Parallel NFS(pNFS)的客户端支持。
  • 回调不再需要单独的 TCP 连接,这样可允许 NFS 服务器即使无法联系客户端也向 NFS 服务器授予保护权。例如,当 NAT 或防火墙干扰时。
  • 它提供了一次精确的语义(除重新启动操作外),防止出现先前的问题,即:如果回复丢失并且操作被发送两次,某些操作可能会返回不准确的结果。
默认情况下,NFS 客户端尝试使用 NFSv4.1 挂载,并在服务器不支持 NFSv4.1 时回退到 NFSv4.0。当服务器不支持 NFSv4.0 时,挂载稍后会回退到 NFSv3。
注意
红帽不再支持 NFS 版本 2(NFSv2)。
所有版本的 NFS 都可以使用通过 IP 网络运行的 传输控制协议 (TCP),NFSv4 需要此协议。NFSv3 可以使用通过 IP 网络运行的 用户数据报协议(UDP )提供客户端和服务器之间的无状态网络连接。
将 NFSv3 与 UDP 搭配使用时,无状态 UDP 连接(在正常情况下)协议开销比 TCP 少。这可在非常干净、不相邻的网络上转化为更佳的性能。但是,由于 UDP 无状态,因此如果服务器意外停机,UDP 客户端将继续通过服务器的请求使网络饱和。此外,当使用 UDP 丢失帧时,必须重新传输整个 RPC 请求;使用 TCP 时,仅需要重新传输丢失的帧。因此,在连接到 NFS 服务器时,TCP 是首选的协议。
挂载和锁定协议已合并到 NFSv4 协议中。该服务器还会侦听已知的 TCP 端口 2049。因此,NFSv4 不需要与 rpcbind交互[1]lockdrpc.statd 守护进程.NFS 服务器上仍然需要使用 The rpc.mountd 守护进程来设置导出,但不涉及任何无线操作。
注意
TCP 是 Red Hat Enterprise Linux 下 NFS 版本 3 的默认传输协议。UDP 可以根据需要用于兼容性目的,但不建议广泛使用。NFSv4 需要 TCP.
所有 RPC/NFS 后台程序都有一个 "-p" 命令行选项,可设置端口,从而简化防火墙配置。
TCP 打包程序授予客户端访问权限后,NFS 服务器引用 /etc/exports 配置文件,以确定是否允许客户端访问任何导出的文件系统。一旦被验证,所有文件和目录操作都对用户有效。
重要
为了使 NFS 使用启用了防火墙的默认 Red Hat Enterprise Linux 安装,请使用默认 TCP 端口 2049 配置 IPTables。如果没有正确的 IPTables 配置,NFS 无法正常工作。
NFS 初始化脚本和 rpc.nfsd 进程现在允许在系统启动时绑定到任何指定端口。但是,如果端口不可用,或者与其他守护进程冲突,这可能会出错。

8.1.1. 所需的服务

Red Hat Enterprise Linux 使用内核级支持和守护进程进程的组合来提供 NFS 文件共享。所有 NFS 版本都依赖于客户端和服务器之间的 远程过程调用 (RPC)。红帽企业 Linux 7 中的 RPC 服务由 rpcbind 服务控制。要共享或者挂载 NFS 文件系统,下列服务根据所使用的 NFS 版本而定:
注意
portmap 服务用于将 Red Hat Enterprise Linux 早期版本的 RPC 程序号映射到 IP 地址端口号。现在,该服务在 Red Hat Enterprise Linux 7 中被 rpcbind 替代来启用 IPv6 支持。
nfs
systemctl start nfs 启动 NFS 服务器和相应的 RPC 进程,以服务对共享 NFS 文件系统的请求。
nfslock
systemctl start nfs-lock 可激活强制服务,启动适当的 RPC 进程,允许 NFS 客户端锁定服务器上的文件。
rpcbind
rpcbind 接受本地 RPC 服务的端口保留。这些端口随后可用(或公告),以便对应的远程 RPC 服务可以访问它们。rpcbind 响应对 RPC 服务的请求,并设置与请求的 RPC 服务的连接。这不能与 NFSv4 一起使用。
以下 RPC 进程可促进 NFS 服务:
rpc.mountd
NFS 服务器使用这个过程来处理来自 NFSv3 客户端的 MOUNT 请求。它检查所请求的 NFS 共享是否目前由 NFS 服务器导出,并且允许客户端访问它。如果允许挂载请求,rpc.mountd 服务器会以 Success 状态回复,并为这个 NFS 共享提供 File-Handle 返回 NFS 客户端。
rpc.nfsd
RPC.nfsd 允许定义服务器公告的显式 NFS 版本和协议。它与 Linux 内核配合使用,以满足 NFS 客户端的动态需求,例如在每次 NFS 客户端连接时提供服务器线程。这个过程对应于 nfs 服务。
lockd
锁定 是在客户端和服务器上运行的内核线程。它实施 网络锁定管理器( NLM)协议,允许 NFSv3 客户端锁定服务器上的文件。每当运行 NFS 服务器以及挂载 NFS 文件系统时,它会自动启动。
rpc.statd
这个过程实施 网络状态监控器 (NSM)RPC 协议,该协议可在重新启动 NFS 服务器时通知 NFS 客户端,而无需正常关闭。RPC.statdnfslock 服务自动启动,不需要用户配置。这不能与 NFSv4 一起使用。
rpc.rquotad
这个过程为远程用户提供用户配额信息。RPC.rquotadnfs 服务自动启动,不需要用户配置。
rpc.idmapd
RPC.idmapd 提供 NFSv4 客户端和服务器启动,在 on-the-wire NFSv4 名称(以 user@domain形式字符串)和本地 UID 和 GID 之间映射。要使 idmapd 使用 NFSv4 起作用,必须配置 /etc/idmapd.conf 文件。至少应指定"Domain"参数,该参数定义 NFSv4 映射域。如果 NFSv4 映射域与 DNS 域名相同,可以跳过这个参数。客户端和服务器必须同意 NFSv4 映射域才能使 ID 映射正常工作。
注意
在红帽企业 Linux 7 中,只有 NFSv4 服务器使用 rpc.idmapd。NFSv4 客户端使用基于密钥环的 idmapper nfsidmapnfsidmap 是一个独立程序,由内核按需调用以执行 ID 映射;它不是一个守护进程。如果 nfsidmap 出现问题,客户端会回退为使用 rpc.idmapd。有关 nfsidmap 的更多信息,请参阅 nfsidmap man page。


[1] The rpcbind 服务取代了 portmap,这在之前版本的 Red Hat Enterprise Linux 中用于将 RPC 程序号映射到 IP 地址端口号组合。如需更多信息,请参阅 第 8.1.1 节 “所需的服务”