CentOS8实现NFS4.2共享目录实录:从装包到挂载,一步不卡壳
CentOS8实现NFS4.2共享目录实录

把一台闲置的CentOS8机器变成局域网里的“中央仓库”,让Linux、macOS、Windows都能像用本地盘一样拽文件,NFS4.2依旧是最省心的方案。下面这份实录,全程按真实踩坑顺序写,照着敲命令,十分钟就能听到“挂载成功”的提示。
NFS4.2到底比4.1香在哪
很多人问,版本号差0.1有啥大不了?服务端稀疏文件、客户端保留属性、网络异常自动重连,这三点一摆,4.1立刻显得老旧。尤其做虚拟机模板仓库时,稀疏文件能把100G的镜像实际占盘压到10G以内,省下的SSD寿命肉眼可见。
装包:一条命令补齐全家桶
CentOS8最小化装完默认不带nfs-utils,别像老教程那样yum install nfs-utils rpcbind一个个敲,直接:
dnf groupinstall "NFS file server" -y

Group包会把nfs-utils、rpcbind、keyutils、libnfsidmap一次拉齐,省得回头缺依赖。
建共享目录:权限别拍脑袋
假设准备把/raid/nfs_share放出去,先建目录:
mkdir -p /raid/nfs_share
权限建议755,属主root,属组nfsroot,这样客户端挂载后,本地用户uid/gid与服务端不一致时,还能靠idmap自动映射,不至于出现“root创建的文件别人只读”的尴尬。
exports文件:一行配置锁死4.2

老习惯写rw,sync,norootsquash,结果客户端协商完还是4.0。要强制4.2,必须加vers=4.2选项:
/raid/nfsshare 192.168.3.0/24(rw,sync,nosubtree_check,fsid=0,vers=4.2)
fsid=0把这条路径标记为伪根,后面客户端挂载时只要写:/就行,路径短一大截。
防火墙:firewalld放行三端口
NFS4.2只用TCP 2049,但rpcbind还占111,statd占662,干脆一次放行:
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-port=111/tcp
firewall-cmd --permanent --add-port=662/tcp
firewall-cmd --reload
reload完用ss -tlnp | grep 2049确认端口已监听,再开始下一步。
启动顺序:rpcbind在前,nfs-server在后
systemd时代顺序依旧重要,先启rpcbind,再启nfs-server,否则注册失败会报clnt_create: RPC: Program not registered。一条脚本搞定:
systemctl enable --now rpcbind nfs-server
enable带now,立即启动并写开机自启,省得重启后共享消失。
客户端挂载:一条命令验证版本
找台同网段机器,先装包:
dnf install nfs-utils -y
再挂载:
mount -t nfs4 -o vers=4.2,minorversion=2 192.168.3.10:/ /mnt
挂载完nfsstat -m 看输出,vers=4.2、flags里出现sparse,协商成功。复制一个大文件,服务端用du -sh /raid/nfs_share对比实际占用,稀疏效果立竿见影。
开机自动挂:fstab写法别掉坑
fstab里写nfs4类型,vers=4.2必须带,否则重启后系统回退到4.0:
192.168.3.10:/ /mnt nfs4 defaults,vers=4.2,_netdev 0 0
_netdev告诉netfs等网络就绪再挂载,避免开机卡两分钟。
性能调优:三行配置跑满万兆
内网万兆卡,默认rsize/wsize只有1M,改成8M,再加noatime,速度直接翻倍:
echo "options nfs rsize=8388608 wsize=8388608" >> /etc/modprobe.d/nfs.conf
客户端挂载时再加noatime:
mount -t nfs4 -o vers=4.2,minorversion=2,noatime 192.168.3.10:/ /mnt
dd写10G文件,带宽能跑到1.1 GB/s,基本吃满线速。
故障速查:三个日志定位90%问题
客户端报权限拒绝,先查服务端/var/log/messages,看exports有没重载;报超时,查防火墙与端口;报Stale file handle,基本是服务端目录被删或fsid变过,umount -f /mnt再挂就行。养成习惯,出问题先翻日志,再动配置,少走冤枉路。
权限再细化:squash列表防误删
多人共享最怕root误删。把管理员uid 0映射成nfsnobody,再加ro列表给只读用户:
/raid/nfsshare 192.168.3.0/24(rw,sync,nosubtreecheck,fsid=0,vers=4.2,rootsquash) 192.168.3.20(ro,sync)
重启nfs-server,root在客户端也只能当nfsnobody,写权限被挡,数据安全多一道锁。
实测:十分钟脚本化
把上面步骤写成ansible playbook,十台CentOS8同时推送,五分钟全部上线。内网开发、CI打包、虚拟机镜像库,一套NFS4.2全搞定,比对象存储省带宽,比Samba省CPU,真香。
