Skip to content
Kurisu
Go back

NFS 文件共享

一、NFS 概述

网络文件系统 (NFS) 让远程主机通过网络挂载文件系统,像本地磁盘一样读写,便于把资源集中到服务器。

NFS 服务器按 /etc/exports 决定是否允许客户端访问导出目录,验证后所有操作对该用户有效。

RHEL 以内核级支持 + 服务流程提供 NFS 共享;所有 NFS 版本都依赖客户端与服务器间的远程过程调用(RPC)。


二、NFS 所需的服务

运行 NFS 服务器或挂载共享需要这些服务:

服务说明
nfsdNFS 服务器内核模块,处理共享文件系统请求
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 对比

特性NFSv3NFSv4
端口需 rpcbind (动态端口)固定 TCP 2049
锁协议独立 NLM 协议 (lockd)集成在协议中
状态监控rpc.statd集成在协议中
挂载协议独立 MOUNT 协议集成在协议中
防火墙友好需开放多个端口只需 TCP 2049
ID 映射UID/GID 直接传递基于字符串的名称映射

十、最佳实践

  1. 优先使用 NFSv4:仅需开放 TCP 2049,防火墙更简单
  2. 保留 root_squash:默认已启用,不要随意禁用 no_root_squash
  3. 使用 autofs:按需挂载,避免网络超时
  4. 配置防火墙:按需放行 NFS,结合 Zone 限制来源;开启 SELinux 时用 semanage 配 NFS 上下文
# 查看 SELinux NFS 相关布尔值
getsebool -a | grep nfs


Share this post:

Previous Post
网络基础与信息收集:HTTP、DNS 与 HTTPS
Next Post
TCP/IP 与 OSI 模型