第 8 章 网络文件系统 (NFS)
网络文件系统(NFS)允许远程主机通过网络挂载文件系统,并像它们是本地挂载的文件系统一样与它们进行交互。这使系统管理员能够将资源整合到网络上的集中式服务器上。
本章重点介绍了基本的 NFS 概念和补充信息。
8.1. NFS 简介
目前,Red Hat Enterprise Linux 中包括了两个 NFS 主版本:
- NFS 版本 3 (NFSv3)支持安全异步写入,并在处理错误时比之前的 NFSv2 更强大。它还支持 64 位文件大小和偏移量,允许客户端访问超过 2 GB 的文件数据。
- NFS 版本 4 (NFSv4)通过防火墙,并在 Internet 上工作,不再需要 rpcbind 服务,支持 ACL,并且使用有状态操作。
自 Red Hat Enterprise Linux 7.4 发布以来,Red Hat Enterprise Linux 完全支持 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 的 NFS。
以下是 NFSv4.1 的功能:
- 提高了网络的性能和安全性,还包括对并行 NFS (pNFS)的客户端支持。
- 对于回调不再需要单独的 TCP 连接,这允许 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]、lockd 和 rpc.statd 守护进程。NFS 服务器上仍然需要 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)。Red Hat Enterprise Linux 7 中的 RPC 服务由 rpcbind 服务控制。要共享或者挂载 NFS 文件系统,下列服务根据所使用的 NFS 版本而定:
注意
portmap 服务用于将 RPC 程序号映射到早期版本的 Red Hat Enterprise Linux 中的 IP 地址端口号。现在,在 Red Hat Enterprise Linux 7 中,该服务被 rpcbind 替代来启用 IPv6 支持。
- nfs
- systemctl start nfs 启动 NFS 服务器,以及为共享 NFS 文件系统请求提供服务的适当 RPC 进程。
- 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 共享的文件处理返回给 NFS 客户端。 - rpc.nfsd
- rpc.nfsd 允许定义服务器公告的显式 NFS 版本和协议。它与 Linux 内核配合使用,以满足 NFS 客户端的动态需求,例如在每次 NFS 客户端连接时提供服务器线程。这个进程对应于 nfs 服务。
- lockd
- lockd 是一个在客户端和服务器上运行的内核线程。它实现了 网络锁定管理器 (NLM)协议,它允许 NFSv3 客户端锁定服务器上的文件。每当运行 NFS 服务器以及挂载 NFS 文件系统时,它会自动启动。
- rpc.statd
- 这个进程实现 网络状态监控器 (NSM)RPC 协议,该协议在 NFS 服务器没有正常关闭而重新启动时,通知 NFS 客户端。RPC.statd 由 nfslock 服务自动启动,不需要用户配置。这不能与 NFSv4 一起使用。
- rpc.rquotad
- 这个过程为远程用户提供用户配额信息。RPC.rquotad 由 nfs 服务自动启动,不需要用户配置。
- rpc.idmapd
- rpc.idmapd 提供 NFSv4 客户端和服务器上调用,这些调用在线 NFSv4 名称(以
user@domain
形式的字符串)和本地 UID 和 GID 之间进行映射。要使 idmapd 与 NFSv4 正常工作,必须配置/etc/idmapd.conf
文件。至少应指定"Domain"参数,该参数定义 NFSv4 映射域。如果 NFSv4 映射域与 DNS 域名相同,可以跳过这个参数。客户端和服务器必须同意 NFSv4 映射域才能使 ID 映射正常工作。注意在 Red Hat Enterprise Linux 7 中,只有 NFSv4 服务器使用 rpc.idmapd。NFSv4 客户端使用基于密钥环的 idmapper nfsidmap。nfsidmap 是一个独立程序,由内核按需调用来执行 ID 映射;它不是一个守护进程。如果 nfsidmap 出现问题,客户端会回退到使用 rpc.idmapd。有关 nfsidmap 的更多信息,请参阅 nfsidmap 手册页。
[1]
rpcbind 服务取代了 portmap,这在以前的 Red Hat Enterprise Linux 版本中用于将 RPC 程序号映射到 IP 地址端口号组合。如需更多信息,请参阅 第 8.1.1 节 “所需的服务”。