NFS 服务端与客户端配置

NFS 服务端通过 /etc/exports 配置共享目录并 exportfs 发布,客户端用 mount -t nfs 挂载,验证读写与权限。含 exports 权限选项、sync/no_root_squash、showmount 查看、df 挂载确认、读写互通验证等真实回显

文件共享NFS文件共享2026/09/29

NFS 服务端与客户端配置

目标:用 NFS(Network File System)让多台服务器共享同一目录:服务端在 /etc/exports 里导出目录并通过 exportfs 发布,客户端用 mount -t nfs 挂载后像本地目录一样读写。本文在 Ubuntu 22.04 做服务端、CentOS 8 做客户端实测,覆盖共享目录配置、读写互通与权限验证。

环境信息

  • 服务端:Ubuntu 22.04(nfs-kernel-server)
  • 客户端:CentOS 8(nfs-utils)
  • 导出目录:/data(本文以 /vol/data 为实测载体,生产中可按实际路径配置)
  • 授权网段:*(全部)或 192.168.0.0/16
  • NFS 端口:2049(tcp)

一、服务端安装与启动

安装 nfs-kernel-server

sudo apt-get update
sudo apt-get install -y nfs-kernel-server

启动服务端相关服务

sudo systemctl enable --now rpcbind rpc-statd nfs-server

说明:nfs-server、rpcbind、rpc-statd(lockd/statd)是 NFS 的必要服务。验证 nfsd 内核线程是否启动:

cat /proc/fs/nfsd/threads   # 输出大于 0(如 8)表示 nfsd 已就绪

二、服务端配置 /etc/exports

创建共享目录并编辑 /etc/exports:

sudo mkdir -p /data
echo "nfs-share-init" | sudo tee /data/readme.txt >/dev/null
sudo chmod 777 /data        # 演示放宽;生产按实际用户/组收紧
sudo vi /etc/exports

写入导出规则(<目录> <客户端>(选项...),多个客户端可多行):

# 全部可读写、同步、不压制 root
/data    *(rw,sync,no_subtree_check,no_root_squash)

exports 常用选项

选项含义
rw / ro允许读写 / 只读
sync写请求同步落盘后再返回(可靠性高)
async写入先放内存缓存(性能高,但断电可能丢数据)
no_subtree_check关闭子树检查,减少错误(现代 NFS 推荐)
no_root_squash客户端 root 保持 root,不降权为 nobody
root_squashroot 被压制为 nobody(安全默认)
all_squash所有用户映射为 anonymous(nobody)

⚠️ 客户端主机可写 *(所有)、具体 IP(192.168.1.10)、网段(192.168.0.0/24)或域名。生产建议用网段/IP 而非 * 降低风险。


三、发布导出(exportfs)

改完 /etc/exports 后用 exportfs 发布/重载:

sudo exportfs -ra      # 重读 /etc/exports 并全部重新导出
sudo exportfs -v       # 查看当前生效的导出列表

实测回显:

/data    <world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)

(<world> 表示对 * 即所有主机导出。)

说明:exportfs -ra 是修改 /etc/exports 后最常用的重载命令,无需重启 nfs-server。


四、客户端安装与挂载

客户端安装 nfs-utils

CentOS/RHEL 客户端:

sudo yum install -y nfs-utils

查看服务端导出的共享

showmount -e <服务端IP>

实测回显:

Export list for 192.168.100.53:
/data   *

挂载 NFS 共享

sudo mkdir -p /mnt/nfs
sudo mount -t nfs <服务端IP>:/data /mnt/nfs

说明:mount -t nfs <IP>:<导出目录> <挂载点>,导出目录路径必须与服务端 /etc/exports 一致。

确认挂载成功:

df -h | grep nfs

实测回显:

192.168.100.53:/data   294G   91G  189G  33% /mnt/nfs

五、验证读写与权限

读取服务端文件

cat /mnt/nfs/readme.txt

回显(与服务端 /data/readme.txt 内容一致):

nfs-share-root-1790658217

客户端写入

echo "client-write-$(date +%s)" > /mnt/nfs/client.txt

服务端核对写入互通

在服务端查看 /data:

cat /data/client.txt
ls -la /data

实测回显:

client-write-1790658340
total 16
drwxrwxrwx 2 root root 4096 ... .
-rw-r--r-- 1 root root   24 ... client.txt
-rw-r--r-- 1 root root   26 ... readme.txt

关键结论:客户端写入的 client.txt 同步出现在服务端 /data,读写双向互通。若 no_root_squash 未设置,客户端 root 写入可能被映射成 nobody 而权限受限。

权限验证(root_squash vs no_root_squash)

如需观察 root 压制:临时改选项

/data   *(rw,sync,no_subtree_check,root_squash)

exportfs -ra 后再从客户端写文件,服务端可见该文件 owner 为 nobody/anonymous(root 被压制)。生产安全性要求高时用 root_squash,需要 NFS 服务端保留 root 权限时用 no_root_squash。


六、验证清单

检查项预期
cat /proc/fs/nfsd/threads>0(nfsd 运行)
exportfs -v显示导出的目录
showmount -e <IP>客户端能看到导出列表
mount -t nfsrc=0,df -h 出现挂载点
客户端写文件服务端 cat /data/client.txt 可见内容

七、常见问题 / 踩坑

  • mount.nfs: ... reason given by server: No such file or directory:多为导出的目录在客户端不可见/服务端未真正导出。先 exportfs -v 确认导出成功,再确认客户端输入导出路径与服务端完全一致。
  • clnt_create: RPC: Program not registered:客户端没装 nfs-utils 或没启动 rpc-statd。也常见于首次挂载前服务端 nfs-server 未启动。
  • reason given by server: access denied:客户端 IP/主机名不在 /etc/exports 授权范围内,或用了 root_squash 且以 root 写入被拒。核对授权与权限选项。
  • 挂载后目录只读:检查导出选项是 ro;若是 rw 但仍只读,看服务端目录是否对挂载用户/当前权限不可写。
  • /... does not support NFS export:导出目录所在文件系统不支持 NFS 导出(如某些 overlay 根文件系统)。将共享放在真实块设备/卷(如独立数据盘)上导出。

八、卸载或恢复

客户端卸载:

sudo umount /mnt/nfs

服务端撤除导出(移除 /etc/exports 对应行后):

sudo exportfs -ra        # 重新导出(已移除的行不再导出)
sudo systemctl stop nfs-server

提示:客户端若需开机自动挂载,在 /etc/fstab 加一行:

<服务端IP>:/data  /mnt/nfs  nfs  defaults,_netdev 0 0

_netdev 表示网络设备,避免开机时网络未就绪导致启动阻塞。