第 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]lockdrpc.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.statdnfslock 服务自动启动,不需要用户配置。这不能与 NFSv4 一起使用。
rpc.rquotad
这个过程为远程用户提供用户配额信息。RPC.rquotadnfs 服务自动启动,不需要用户配置。
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 nfsidmapnfsidmap 是一个独立程序,由内核按需调用来执行 ID 映射;它不是一个守护进程。如果 nfsidmap 出现问题,客户端会回退到使用 rpc.idmapd。有关 nfsidmap 的更多信息,请参阅 nfsidmap 手册页。


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

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.