NFS 文件共享
NFS(Network File System)允许远程主机通过网络挂载文件系统,并像本地磁盘一样交互操作,是 Linux 环境下最常用的网络文件共享方案。
一、NFS 概述
网络文件系统 (NFS) 允许远程主机通过网络挂载文件系统,并像它们挂载在本地那样与这些文件系统进行交互。这让系统管理员可以将资源整合到网络的集中服务器中。
NFS 服务器参考 /etc/exports 配置文件,来确定是否允许客户端访问任何导出的文件系统。一旦被验证,所有文件和目录操作都对用户有效。
Red Hat Enterprise Linux 使用内核级支持和服务流程组合提供 NFS 文件共享。所有 NFS 版本都依赖于客户端和服务器间的远程过程调用(RPC)。
二、NFS 所需的服务
运行 NFS 服务器或挂载 NFS 共享需要以下系统服务:
| 服务 | 说明 |
|---|---|
nfsd | NFS 服务器内核模块,处理共享 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。因此 NFSv4 不需要 rpcbind、lockd 和 rpc-statd 服务。NFS 服务器上仍然需要 nfs-mountd 服务来设置导出,但不涉及任何线上操作。
三、NFS 主机名格式
在挂载或导出 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 | 同步写入。NFS 服务器在请求写入磁盘后才回复 (默认) |
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 服务器与客户端的连接不会一直存在。当挂载了 NFS 服务器之后,任何一方脱机都可能造成另外一方等待超时。autofs 服务解决了这个问题:
- 当客户端有使用 NFS 文件系统的需求时才自动挂载
- 当 NFS 文件系统使用完毕后,让 NFS 自动卸载
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 才会自动将远程 NFS 共享挂载到该位置。
九、NFSv3 与 NFSv4 对比
| 特性 | NFSv3 | NFSv4 |
|---|---|---|
| 端口 | 需要 rpcbind (动态端口) | 固定 TCP 2049 |
| 锁协议 | 独立 NLM 协议 (lockd) | 集成在 NFS 协议中 |
| 状态监控 | rpc.statd | 集成在协议中 |
| 挂载协议 | 独立 MOUNT 协议 | 集成在协议中 |
| 防火墙友好 | 需要开放多个端口 | 只需 TCP 2049 |
| ID 映射 | UID/GID 直接传递 | 基于字符串的名称映射 |
十、最佳实践
- 优先使用 NFSv4:仅需开放 TCP 2049 端口,更利于防火墙配置
- root_squash 安全保障:默认已启用,不要随意禁用
no_root_squash - 使用 autofs:避免网络问题导致的挂载超时,按需挂载更稳定
- 配置防火墙:仅在需要时放行 NFS 服务,结合 Zone 限制访问来源
- SELinux 配合:如果开启 SELinux,需要使用
semanage配置 NFS 上下文
# 查看 SELinux NFS 相关布尔值
getsebool -a | grep nfs