NFS 服务端与客户端配置
NFS 服务端通过 /etc/exports 配置共享目录并 exportfs 发布,客户端用 mount -t nfs 挂载,验证读写与权限。含 exports 权限选项、sync/no_root_squash、showmount 查看、df 挂载确认、读写互通验证等真实回显
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_squash | root 被压制为 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 nfs | rc=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表示网络设备,避免开机时网络未就绪导致启动阻塞。