NFS 共享存储实战:从挂载到生产读写分离
NFS 共享存储实战:从挂载到生产读写分离
业务上线后没两天就会遇到一个问题:文件上传功能在多台服务器上各存各的,用户在 A 机传的图片,请求打到 B 机就 404 了。解法是让所有机器挂载同一份存储——NFS 是内网共享存储里最便宜、最常见的选择。这篇把 NFS 从原理到生产读写分离完整过一遍。
一、先理解 NFS 在干什么
NFS(Network File System)让你像用本地目录一样用远程目录。数据真正落在服务端,客户端只做挂载和读写。涉及两个角色:
- 服务端:共享目录方,监听 2049 端口;NFSv3 还需要 rpcbind(端口映射服务)配合;
- 客户端:挂载方,本地挂载点只是一个”门”,读写都打到服务端。
一句话记忆:服务端出目录、客户端进目录,数据永远在服务端那份。
二、服务端配置(6 步)
1 | # 1. 安装(内网按网段放行 2049/rpcbind 即可,不建议直接全关防火墙) |
三、客户端挂载(6 步)
1 | # 1. 安装客户端 |
卸载时提示 device is busy 是高频小坑:先 cd / 再 umount;实在不行 umount -lf 强制卸载。
四、权限与安全:生产必配的参数
NFS 的权限坑集中在身份映射上。服务端默认把客户端 root 映射成 nobody,但普通用户的 uid/gid 会原样透传——两边 uid 对不上就会出现”文件能看到但没权限写”。
统一身份的标准做法:all_squash + anonuid/anongid
1 | # 服务端 exports: |
这样不管客户端是谁写的,落盘统一变成 uid=666,权限问题一次性根治。
安全挂载参数(静默数据不需要执行权限):
1 | mount -t nfs -o noexec,nodev,nosuid 172.18.1.31:/data /nfsdir |
性能参数(可选): noatime,nodiratime 禁止更新访问时间戳,减少 NFS 写放大,高 IO 场景明显。
五、生产案例:读写分离
需求:静态资源读多写少,且不同目录权限隔离——/data/r 只读、/data/w 可写,都映射到 www(666)。
1 | # 服务端: |
六、排障要点
- 挂载报 access denied:路径写错最常见——
showmount -e 服务端先看服务端实际导出的名字; - 挂载卡住/超时:检查 rpcbind 是否启动、2049 与 rpc 端口(111)防火墙是否放行;
- 改完 exports 不生效:
exportfs -rv平滑加载,别重启 NFS 中断业务; - 客户端看到文件但没权限:九成是 uid 不一致,按上面统一 anonuid 方案处理。
NFS 本身不复杂,把”数据在服务端、权限靠 anonuid、安全靠 noexec”这三条记住,生产基本够用。它解决的是”共享”,备份和灾备就是下一篇文章的事了。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LuminDream's Blogs!


