Skip to content

第 2 章 NFS 协议基础

2.1 NFS 协议发展历史

NFS(Network File System,网络文件系统)由 Sun Microsystems 于 1984 年提出,是目前最主流的网络文件共享协议之一。

版本发布时间主要特性
NFSv21989第一个广泛使用的版本,使用 UDP
NFSv31995支持大文件、异步写入、TCP/UDP
NFSv42000集成锁、状态化、单端口 2049、更好安全性
NFSv4.12010支持 pNFS(并行 NFS),提升扩展性
NFSv4.22016增加服务器端复制、应用保留属性等

本书主要使用 NFSv4.1,它在兼容性和性能之间取得了良好平衡。

2.2 NFS 工作原理与 RPC 机制

NFS 本身并不直接传输数据,而是基于 RPC(Remote Procedure Call,远程过程调用) 实现的。

基本流程

Client                    Server
   │                        │
   │  1. mount 请求          │
   │ ─────────────────────► │
   │                        │
   │  2. 返回文件句柄        │
   │ ◄───────────────────── │
   │                        │
   │  3. read/write 请求     │
   │ ─────────────────────► │
   │                        │
   │  4. 返回数据/状态       │
   │ ◄───────────────────── │

NFSv3 与 RPC 服务

NFSv3 依赖多个 RPC 服务:

  • rpcbind:端口映射
  • mountd:处理挂载请求
  • nfsd:处理文件 IO
  • lockd / statd:文件锁管理

NFSv4 改进

NFSv4 将大部分功能整合到单一端口 2049,不再需要单独的 mountd、lockd、statd,更易于防火墙管理和集群部署。

2.3 NFS 挂载选项详解

Linux 客户端通过 mount 命令挂载 NFS:

bash
mount -t nfs -o options server:/path /local/path

常用选项

选项说明
vers=4.1使用 NFSv4.1
hard硬挂载,服务器不可用时客户端会不断重试
soft软挂载,超时后返回错误
intr允许中断硬挂载等待
timeo=600超时时间(单位 0.1 秒)
retrans=3超时重试次数
nolock不使用文件锁
noatime不更新访问时间,提升性能
_netdev声明为网络文件系统,网络就绪后再挂载

推荐挂载参数

对于生产环境,推荐使用:

bash
mount -t nfs -o vers=4.1,hard,intr,timeo=600,retrans=3,_netdev server:/path /mnt/nfs

写入 /etc/fstab

server:/path /mnt/nfs nfs4 defaults,_netdev,hard,intr,timeo=600,retrans=3 0 0

2.4 NFS 的高可用挑战

传统 NFS 服务由单台服务器提供,存在以下问题:

  1. 服务器单点故障:NFS 服务器宕机,所有客户端无法访问
  2. IP 固定:客户端配置的是具体服务器 IP,故障后需要手动切换
  3. 状态保持:NFSv4 是有状态协议,故障切换后需要重新建立状态
  4. 数据一致性:多节点同时服务时,需要保证数据一致

解决方案

问题解决方案
服务器单点故障多节点 + 数据冗余
IP 固定Keepalived VIP 漂移
状态保持NFS-Ganesha 用户态实现 + 后端共享存储
数据一致性GlusterFS 复制卷 + 仲裁机制

2.5 内核 NFS 与用户态 NFS(NFS-Ganesha)

内核 NFS

Linux 内核自带的 NFS 服务(nfs-kernel-server):

  • 性能高
  • 与内核集成紧密
  • 但扩展性和灵活性较差
  • 多节点高可用配置复杂

NFS-Ganesha

NFS-Ganesha 是一个用户态 NFS 服务器,支持 NFSv3/v4/pNFS,可通过多种 FSAL(File System Abstraction Layer)导出不同后端存储。

Client ──► NFS-Ganesha ──► FSAL ──► 后端存储

                              ├──► GLUSTER (GlusterFS)
                              ├──► CEPH (CephFS)
                              ├──► VFS (本地文件系统)
                              └──► ...

NFS-Ganesha 的优势

  • 可在多个节点独立运行
  • 通过 FSAL 直接访问 GlusterFS,无需内核挂载
  • 配置灵活,适合高可用架构
  • 支持 NFSv4 高级特性

2.6 本章小结

  • NFS 是主流网络文件共享协议,本书使用 NFSv4.1
  • NFS 基于 RPC 工作,NFSv4 简化了端口依赖
  • 挂载参数对性能和稳定性影响很大
  • 传统 NFS 存在单点故障问题
  • NFS-Ganesha 是用户态 NFS 服务器,适合多节点高可用场景

练习题

  1. NFSv4 相比 NFSv3 有哪些主要改进?
  2. 解释 hardsoft 挂载的区别,生产环境为什么推荐 hard
  3. NFS-Ganesha 中的 FSAL 是什么作用?
  4. 为什么传统内核 NFS 不适合直接做多节点高可用?