一、NFS 概述
网络文件系统 (NFS) 让远程主机通过网络挂载文件系统,像本地磁盘一样读写,便于把资源集中到服务器。
NFS 服务器按 /etc/exports 决定是否允许客户端访问导出目录,验证后所有操作对该用户有效。
RHEL 以内核级支持 + 服务流程提供 NFS 共享;所有 NFS 版本都依赖客户端与服务器间的远程过程调用(RPC)。
二、NFS 所需的服务
运行 NFS 服务器或挂载共享需要这些服务:
| 服务 | 说明 |
|---|---|
nfsd | NFS 服务器内核模块,处理共享文件系统请求 |
rpcbind | 保留本地 RPC 服务端口,响应 RPC 请求 (NFSv3) |
rpc.mountd | 处理 NFSv3 客户端的 MOUNT 请求,验证导出权限 |
rpc.nfsd | 定义服务器公告的 NFS 版本和协议,对应 nfs-server 服务 |
lockd | 内核线程,实现网络锁管理器 (NLM),允许 NFSv3 客户端锁文件 |
rpc.statd | 实现网络状态监控器 (NSM),通知客户端服务器重启 (NFSv3) |
rpc.rquotad | 为远程用户提供配额信息 |
rpc.idmapd | 为 NFSv4 提供用户/组 ID 映射,需配 /etc/idmapd.conf |
NFSv4 的 RPC 服务变化
NFSv4 把挂载与锁定协议并入协议本身,监听已知 TCP 端口 2049,因此不需要 rpcbind、lockd、rpc-statd;nfs-mountd 仍需设置导出,但不涉及线上操作。
三、NFS 主机名格式
主机格式:
| 格式 | 示例 |
|---|---|
| 单机(FQDN) | client.example.com |
| 单机(IP) | 192.168.1.100 |
| IP 网络(CIDR) | 192.168.0.0/24 |
| IP 网络(子网掩码) | 192.168.100.8/255.255.255.0 |
| Netgroups | @group-name |
四、/etc/exports 配置文件
/etc/exports 控制哪些文件系统导出到哪些主机并指定选项:空白行忽略;# 开头是注释;\ 换行长行;每个导出的文件系统独立一行;授权主机列表用空格分开;选项紧跟主机标识符后的括号内,中间无空格。
导出条目结构
/exported/directory host1(options1) host2(options2)
重要:/etc/exports 格式极精确,以下两行含义完全不同:
# 仅允许 bob.example.com 读写 /home
/home bob.example.com(rw)
# bob.example.com 只读(默认),其他用户可读写(注意括号前的空格)
/home bob.example.com (rw)
默认选项
| 选项 | 说明 |
|---|---|
ro | 只读,远程主机不能改数据 (默认) |
rw | 读写,允许远程主机修改数据 |
sync | 同步写入,写入磁盘后才回复 (默认) |
async | 异步写入,性能更高但崩溃可能丢数据 |
wdelay | 延迟写入,预期有更多写入请求时延迟落盘 (默认) |
no_wdelay | 禁用延迟写入,仅指定 sync 时可用 |
root_squash | 远程 root 映射为 nobody,防远程 root 特权 (默认) |
no_root_squash | 不挤压 root,远程 root 保留特权 |
all_squash | 所有远程用户映射为匿名用户 |
anonuid / anongid | 指定匿名用户的 UID 和 GID |
配置示例
# 基本只读导出
/data 192.168.115.141(ro)
# 读写导出,异步写入
/another/exported/directory 192.168.0.3(rw,async)
# 多主机不同权限
/home 192.168.1.0/24(rw,sync) 10.0.0.0/8(ro)
# 指定匿名用户
/public 192.168.1.0/24(rw,all_squash,anonuid=65534,anongid=65534)
五、安装与启动 NFS 服务器
安装 NFS
# 安装 nfs-utils 软件包
dnf install nfs-utils -y
启动 NFS 服务器
# 启动并设置开机自启
systemctl enable --now nfs-server
# 查看服务状态
systemctl status nfs-server
六、防火墙配置
NFSv4 只需要开放 nfs 服务:
# 放行 NFS 服务
firewall-cmd --permanent --add-service=nfs
# 重新加载防火墙
firewall-cmd --reload
# 验证已放行的服务
firewall-cmd --list-services
七、客户端挂载 NFS
查看服务器导出的目录
# 在客户端查看 NFS 服务器导出的共享
showmount -e 192.168.115.128
# Export list for 192.168.115.128:
# /data 192.168.115.141
手动挂载
# 创建挂载点
mkdir -p /nfsclient/client-data
# 挂载 NFS 共享
mount 192.168.115.128:/data /nfsclient/client-data
# 验证挂载
df -h /nfsclient/client-data
# Filesystem Size Used Avail Use% Mounted on
# 192.168.115.128:/data 45G 4.5G 41G 11% /nfsclient/client-data
开机自动挂载(/etc/fstab)
# 编辑 /etc/fstab 添加以下行
echo "192.168.115.128:/data /nfsclient/client-data nfs defaults 0 0" >> /etc/fstab
重启主机会自动挂载。
八、autofs 自动挂载
NFS 连接不会一直存在,任一方脱机都可能让另一方等待超时——autofs 在有需求时才挂载、用完自动卸载:
autofs 配置流程
# 1. 客户端安装 autofs
yum install autofs -y
# 2. 配置主映射文件 /etc/auto.master
# 格式:本地端目录 具体挂载配置文件
echo "/client /etc/auto.suibian" >> /etc/auto.master
# 3. 配置具体挂载文件 /etc/auto.suibian
# 格式:本地端子目录 挂载参数 服务器:服务器对应目录
echo "upload 192.168.168.128:/nfs/upload" > /etc/auto.suibian
# 4. 重启 autofs 服务
systemctl restart autofs
# 5. 触发自动挂载(访问目录时自动挂载)
cd /client/upload
只有实际访问
/client/upload时 autofs 才会挂载该共享。
九、NFSv3 与 NFSv4 对比
| 特性 | NFSv3 | NFSv4 |
|---|---|---|
| 端口 | 需 rpcbind (动态端口) | 固定 TCP 2049 |
| 锁协议 | 独立 NLM 协议 (lockd) | 集成在协议中 |
| 状态监控 | rpc.statd | 集成在协议中 |
| 挂载协议 | 独立 MOUNT 协议 | 集成在协议中 |
| 防火墙友好 | 需开放多个端口 | 只需 TCP 2049 |
| ID 映射 | UID/GID 直接传递 | 基于字符串的名称映射 |
十、最佳实践
- 优先使用 NFSv4:仅需开放 TCP 2049,防火墙更简单
- 保留 root_squash:默认已启用,不要随意禁用
no_root_squash - 使用 autofs:按需挂载,避免网络超时
- 配置防火墙:按需放行 NFS,结合 Zone 限制来源;开启 SELinux 时用
semanage配 NFS 上下文
# 查看 SELinux NFS 相关布尔值
getsebool -a | grep nfs