资讯动态

NFS 一挂就权限拒绝?CentOS 7 共享挂载 + 踩坑清单

发布时间:2026/9/30 16:09:08 来源:尧图企业网站定制
NFS 挂载卡在超时十有八九是防火墙只放行了nfs、把 111 和 113 两种报错混为一谈连 root 写不进去都当成故障。本文先讲清 NFS「先向 RPC 要端口」的工作链路再把/etc/exports的客户端匹配写法与导出选项逐条列清接着走一遍服务端导出、客户端挂载、fstab持久化最后给出 RPC 报错的读法与errno代码对照表。文中命令名与选项均标注英文原意完整清单见文末《附命令英文全称速查表》。本文概要项目内容文章主题NFS 网络文件共享RPC 工作链路 → 服务端导出配置 → 客户端挂载验证 → fstab 持久化与排错所属类别Linux 系统管理 → 网络存储 → NFS知识关键字nfs-utils·/etc/exports·/etc/exports.d·exportfs·showmount·mount -t nfs·rpcinfo·rw·ro·root_squash·no_root_squash·/etc/fstab·_netdev·nofail·RPC·errno 111/113·NFSv3·NFSv4概念图给出两条并行的读写链路本地访问不出网络远程访问必须先由 RPC 拿到服务端口。概要表里的关键字按主线落在RPC 与工作流程在第一章导出写法与选项在第二章客户端挂载在第三章持久化与排错在第四、五章。本文的机器与地址约定服务端zhb-s210.1.8.102客户端zhb-m210.1.8.12共享网段10.1.8.0/24。一、NFS 服务介绍1.1 NFS 是什么NFSNetworkFileSystem网络文件系统诞生于 20 世纪 80 年代。它由太阳微系统公司Sun Microsystems开发最初用来解决 UNIX 系统之间的文件共享。客户端可以像访问本地文件一样透明地访问远程目录跨设备共享数据不必再靠人工拷贝。版本迭代上NFSv3 是应用最广的版本支持更大的文件尺寸与更多功能NFSv4引入了 Kerberos 认证、状态化连接与更完善的文件锁机制安全性明显更强。1.2 两个角色角色职责NFS 服务器存储文件资源由nfsd守护进程响应请求用/etc/exports控制哪些目录共享给谁、给什么权限NFS 客户端把服务端共享目录挂载到本地挂载点之后按普通文件读写数据实际落在服务端磁盘1.3 工作链路先向 RPC 要端口NFSv3 服务端的端口并不固定。启动时它会把端口注册到 RPC 的端口映射服务RemoteProcedureCall远程过程调用。客户端要先查出端口才能发出挂载请求注册阶段服务端启动 NFS 服务把服务端口注册给 RPC。建立连接客户端先向 RPC 查询 NFS 服务端口再向该端口发起挂载请求。挂载阶段服务端校验客户端身份与权限通过后允许挂载到指定挂载点。文件访问挂载成功后本地读写被转成远程过程调用服务端执行后把结果返回。权限控制服务端按本地文件系统的 UID / GID 与导出选项决定是否放行。⚠️注意正因为端口要向 RPC 注册服务端防火墙必须同时放行nfs、rpc-bind、mountd三项只放行nfs会出现「客户端探测不到共享、挂载卡住」。1.4 优缺点与典型场景维度说明优点透明用法与本地目录一致、跨平台UNIX / Linux / macOS、配置简单、便于集中管理缺点NFSv3 及更早版本缺少强认证与加密高安全场景要配合防火墙或改用 NFSv4 的 Kerberos性能强依赖网络状况多客户端并发写同一文件时锁机制复杂典型场景企业局域网内共享文档与安装包Web、数据库集群的统一共享存储NAS、路由器等嵌入式设备的文件对外访问。二、部署 NFS 服务端2.1 六步总览步骤做什么用哪条命令1安装软件包yum install -y nfs-utils2准备共享目录与属主mkdir -p、chown3写导出配置vim /etc/exports4启用并启动服务systemctl enable nfs-server --now5放行防火墙firewall-cmd --permanent --add-service...6重新导出并自查exportfs -r、exportfs -v# 1. 安装软件包[rootzhb-s2 ~]# yum install -y nfs-utils# 2. 准备用户与共享目录属主交给 apacheUID 48[rootzhb-s2 ~]# useradd -u 1000 zhb[rootzhb-s2 ~]# echo redhat | passwd --stdin zhb[rootzhb-s2 ~]# mkdir -p /shares/webapp[rootzhb-s2 ~]# chown 48 /shares/webapp# 3. 写导出配置写法见 2.2、2.3[rootzhb-s2 ~]# vim /etc/exports# 4. 启用并启动服务[rootzhb-s2 ~]# systemctl enable nfs-server --now# 5. 配置防火墙nfs / rpc-bind / mountd 三项都要放[rootzhb-s2 ~]# firewall-cmd --permanent --add-servicenfs --add-servicerpc-bind --add-servicemountd[rootzhb-s2 ~]# firewall-cmd --reload⚠️注意NFS 不要使用 SMB 共享的目录。如果这样做则可能会导致文件损坏或其他文件完整性与一致性问题。2.2 配置文件与目录导出规则写在/etc/exports另外/etc/exports.d/下任何以.exports结尾、且不以点.开头的文件同样生效语法完全一致。提示相比直接编辑/etc/exports在/etc/exports.d/里创建或删除独立文件更省事也能减少一次改动误伤其他已有导出的风险。每一行声明一个导出点第一个字段是服务端目录其余部分列出可以访问它的客户端以及授予的权限。2.3 客户端匹配写法速查表写法作用说明英文原意/shares/webapp zhb-m2.zhb.cloud单个可解析主机名只放行这一台/shares/webapp *.zhb.cloud域名通配*匹配zhb.cloud域下所有主机/shares/webapp 10.1.8.12单个 IPv4 地址只放行这一台/shares/webapp 10.1.8.0/24IPv4 网段等价写法10.1.8.0/255.255.255.0/shares/webapp fde2:6494:1e09:2::20单个 IPv6 地址—/shares/webapp fde2:6494:1e09:2::/64IPv6 网段—/shares/webapp 10.1.8.0/24 zhb-m2.zhb.cloud多客户端空格分隔的列表2.4 导出选项速查表目录默认以只读方式共享要改权限在客户端定义后面紧跟括号写选项客户端定义与左括号之间不能有空格。写法作用说明英文原意(rw)允许读 / 写read-write不写该选项或写ro就只有读权限(ro)只读read-only(no_root_squash)保留客户端 root 的真实身份默认是root_squash客户端 root 访问时被映射成服务端的nobody创建的文件属主变成nobody读取也按nobody判权限(sync)数据落盘后才返回synchronous默认值安全优先(async)先返回、后落盘性能更好异常掉电有丢数据风险(no_subtree_check)关闭子树检查subtreecheck减少导出子目录时的额外校验本实验的记录[rootzhb-s2 ~]# vim /etc/exports/shares/webapp10.1.8.0/24(rw)⚠️注意/etc/exports改完不会自动生效必须让导出表重新加载否则客户端看到的仍是旧规则。2.5 让改动生效[rootzhb-s2 ~]# exportfs -r # 重新导出与 /etc/exports 同步并清掉已删除的条目# 或者[rootzhb-s2 ~]# systemctl reload nfs-server# 或者[rootzhb-s2 ~]# exportfs -av2.6 exportfs 用法速查表写法作用说明英文原意exportfs列出当前导出的目录不显示导出选项exportfs -v列出导出及选项verbose含默认选项exportfs -r重新导出全部目录re-export把/var/lib/nfs/etab与/etc/exports同步exportfs -a导出/etc/exports中的全部条目allexportfs -u 目录取消导出一个目录unexportexportfs -s以/etc/exports的格式打印导出表show[rootzhb-s2 ~]# exportfs/shares/webapp10.1.8.0/24[rootzhb-s2 ~]# exportfs -v/shares/webapp10.1.8.0/24(sync,...,rw,secure,no_root_squash,...)三、客户端访问与验证3.1 showmount 用法速查表写法作用说明英文原意showmount -e 服务端查看服务端导出的共享清单exportsshowmount -a 服务端列出已挂载的客户端allshowmount -d 服务端列出被客户端挂载的目录directories3.2 挂载并验证读写# 客户端装包并准备 Web 服务[rootzhb-m2 ~]# yum install -y nfs-utils httpd[rootzhb-m2 ~]# id apacheuid48(apache)gid48(apache)组48(apache)[rootzhb-m2 ~]# systemctl enable httpd --now# 查看服务端提供的共享[rootzhb-m2 ~]# showmount -e zhb-s2Export listforzhb-s2: /shares/webapp10.1.8.0/24# 挂载到站点目录[rootzhb-m2 ~]# mkdir -p /var/www/html[rootzhb-m2 ~]# mount -t nfs zhb-s2:/shares/webapp /var/www/html# root 不能创建默认 root_squash 把 root 压成了 nobody[rootzhb-m2 ~]# touch /var/www/html/root-f1touch: cannottouch‘/var/www/html/root-f1’: Permission denied# apache 用户能创建UID 48 在服务端目录上就是属主[rootzhb-m2 ~]# su -l -s /bin/bash apache-bash-4.2$echoapache website/var/www/html/web1.html# 回到服务端访问客户端站点确认共享目录里的内容真的落盘可读[rootzhb-s2 ~]# curl http://10.1.8.12/Welcome to zhb website.[rootzhb-s2 ~]# curl http://10.1.8.12/web1.htmlapache website3.3 mount -t nfs 常用选项速查表写法作用说明英文原意mount -t nfs zhb-s2:/shares/webapp /mnt基础挂载-ttypenfs可省略由内核自动识别mount -o ro ...只读挂载read-onlymount -o hard ...服务端无响应时一直重试默认行为适合有稳定网络的场景mount -o soft ...服务端无响应时超时报错返回避免进程被挂起但可能读到不完整数据mount -o vers4 ...指定 NFS 版本version如vers3/vers4.2四、持久化挂载在/etc/fstab末尾追加一行zhb-s2:/shares/webapp /var/www/html nfs defaults,_netdev,nofail 0 0选项作用说明defaults基础默认集即rw,suid,dev,exec,auto,nouser,async七个选项的简写_netdev声明「该挂载依赖网络」让 systemd 按网络挂载处理排进remote-fs-pre.target→remote-fs.target区间并拉起network-online.target、排在其后——网络没就绪前不会先去挂nofail允许挂载失败该条目只被 target「想要Wants」而非「必需Requires」挂不上也不阻塞启动、不进 emergency 模式⚠️这两个选项管的是两件不同的事别混为一谈_netdev管「什么时候挂」等网络就绪再挂nofail管「挂不上会怎样」不挡启动。少了nofail服务端一旦不可达启动阶段就会卡在这一行上等它超时严重时掉进 emergency shell。可选加强等待设备/挂载的默认超时约 90 秒觉得太久可再加x-systemd.device-timeout30单位可写s、min把等待压到 30 秒——写法为defaults,_netdev,nofail,x-systemd.device-timeout30。该选项只能写在/etc/fstab里写进 systemd 单元文件的Options会被忽略。⚠️注意NFS 条目本身就会被 systemd 按文件系统类型识别为网络挂载、排进remote-fs.target体系所以_netdev在 NFS 上更多是「显式声明」写不写都能工作但在iSCSI 这类 fstype 只是ext4/XFS、看不出依赖网络的挂载上_netdev是必需的。另外nofail只保证「不挡启动」不等于挂上了——依赖这个挂载点的服务如 httpd照样会起不来所以 fstab 改完先跑mount -a确认不报错。五、排错速查5.1 读懂一条 RPC 报错showmount与mount -t nfs的报错几乎都出在 RPC 层格式固定按段拆开读就能定位clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)段报错片段含义说明①clnt_create客户端创建 RPC 连接失败卡在「连得上吗」这一步与导出规则、权限无关②Port mapper failure连不上 RPC 端口映射服务即 111 端口上的rpcbind这一段失败说明连 111 端口都不通③Unable to receive请求已发出但没有收到回包典型是防火墙丢包而不是端口没人监听④errno 113 (...)具体原因码见 5.2 对照表5.2 常见 errno 代码对照表RPC / NFS 报错末尾括号里的errno N是标准系统错误号含义固定errno宏名含义英文原意触发场景101ENETUNREACHNETworkUNREACHable网络不可达本地路由表没有到目标网段的条目110ETIMEDOUTTIMEDOUT连接超时请求发出去无人应答中间链路不通或被静默丢包111ECONNREFUSEDCONNectionREFUSED连接被拒绝对端回了 RST端口没有程序监听或被主动拒绝112EHOSTDOWNHOSTDOWN主机已关闭对端主机宕机113EHOSTUNREACHHOSTUNREACHable无路由到主机收到 ICMP 主机不可达或包被防火墙静默丢弃116ESTALESTale file hANDLE文件句柄失效服务端导出被重建或重启客户端缓存的句柄过期4EINTRINTerrupted system call系统调用被中断读写被信号打断重试即可5EIOInput/Output error输入输出错误连接中断后仍在读写或后端存储异常13EACCESACCess denied权限不足导出选项或 UID 映射导致写不进去30EROFSRead-OnlyFileSystem只读文件系统以只读方式导出或挂载时执行了写入121EREMOTEIOREMOTEI/Oerror远端 I/O 错误NFS 服务端读写失败后传回的错误提示本机可查完整清单——man 3 errno看名字与描述装了moreutils的机器用errno -l一次列出全部编号。5.3 「连接被拒绝」与「无路由到主机」的区别同样是连不上111 与 113 的病因完全不同这张表能省掉大半排查时间报错网络层发生了什么通常意味着errno 111 (Connection refused)目标主机回了 RST——包已经送达主机只是该端口没有程序监听rpcbind没启动或防火墙用的是 REJECT 策略errno 113 (No route to host)收到 ICMP 主机不可达或包被静默丢弃客户端等到超时也没回包防火墙用的是 DROP 策略、路由不通、主机不在线判据能ping通服务端却报 113几乎可以断定是服务端防火墙把 RPC 相关端口挡了。先用rpcinfo -p 服务端验证 111 端口通不通再检查firewall-cmd --list-services里有没有rpc-bind、nfs、mountd三项。# 客户端探测服务端注册了哪些 RPC 服务能列出 portmapper / mountd / nfs 才算通[rootzhb-m2 ~]# rpcinfo -p zhb-s2# 服务端确认三项服务都已放行[rootzhb-s2 ~]# firewall-cmd --list-services5.4 报错原文与处理速查表报错原文成因处理clnt_create: RPC: Port mapper failure ... errno 113服务端防火墙未放行 RPC / NFS 端口包被丢弃放行rpc-bind、nfs、mountd后firewall-cmd --reloadclnt_create: ... errno 111 (Connection refused)服务端rpcbind没启动或端口被主动拒绝systemctl enable --now rpcbind nfs-serverRPC: Program not registeredrpcbind在跑但mountd/nfsd没注册NFS 服务没起服务端rpcinfo -p是否列出mountd与nfssystemctl restart nfs-servermount.nfs: Connection timed out请求无响应中间链路或目标防火墙丢包逐跳排查防火墙rpcinfo -p、telnet 服务端 2049mount.nfs: access denied by server while mounting客户端 IP 不在/etc/exports匹配范围内或改完没重载核对匹配写法执行exportfs -rmount.nfs: reason given by server: No such file or directory请求的目录路径写错或该目录根本没被导出用showmount -e 服务端核对导出路径拼写mount.nfs: requested NFS version or transport protocol is not supported客户端用了服务端不支持的版本或协议加-o vers3或-o vers4.2指定服务端rpcinfo -p看注册的版本mount.nfs: Network is unreachable本地路由表没有目标网段条目检查网卡与路由ip route挂载成功但写不进去Permission denied导出选项没给(rw)或客户端操作用户的 UID 与服务端目录属主不一致改(rw)后exportfs -r核对两端 UIDroot 写不进去、换普通用户就能写默认root_squash在起作用属正常现象确需保留 root 身份再加(no_root_squash)Stale file handleerrno 116服务端导出被重建或重启客户端句柄失效卸载后重新挂载必要时umount -l再mount读写报Input/output errorerrno 5连接中断后仍在读写或服务端存储故障查dmesg与网络状态卸载重挂umount报device is busy有进程正占用挂载点lsof D 挂载点找出占用进程先离开挂载点再卸载开机卡住不动、服务端不可达时掉进 emergencyfstab 条目默认是Requires启动会等它挂完挂载选项补_netdev,nofail仍嫌等得久再加x-systemd.device-timeout30重启后挂载点空着、df里看不到该目录挂载失败但被nofail放过了不会报错中断启动systemctl status var-www-html.mount看失败原因确认网络与nfs-server已就绪附命令英文全称速查表命令 / 缩写英文全称 / 原意作用NFSNetworkFileSystem网络文件系统RPCremoteprocedurecall远程过程调用NFS 依赖它做端口映射rpcbind/portmapRPCbind/portmap把 RPC 服务号映射到监听端口的服务rpcinfoRPCinformation查询某主机注册了哪些 RPC 服务及其端口exportfsexportfilesystem维护服务端导出表showmountshowmount查询服务端共享与客户端挂载mountdmountdaemon处理客户端挂载请求的守护进程nfsdNFSdaemon内核态的 NFS 服务线程nobodynobody匿名用户root_squash之后的映射身份UID/GIDuserIDentifier /groupIDentifier用户标识号 / 组标识号 参考资料官方文档 · 中英双语官方手册Ubuntu manpagesexports(5)NFS 服务端导出表格式与全部选项exportfs(8)导出表维护命令nfs(5)fstab 里 NFS 挂载选项与传输方式systemd.mount(5)fstab 里nofail、_netdev等 systemd 专用挂载选项中文版mount 命令中文说明菜鸟教程其余手册在服务器上直接查man5exports# 导出表语法与全部选项man8exportfs# 导出表的维护动作man5nfs# fstab 里的挂载选项man5systemd.mount# fstab 里的 nofail / _netdev / x-systemd.* 选项man8showmount# 查看服务端共享man8rpc.mountd# 挂载请求的守护进程总结NFS 的配置就三件事——注册服务端把端口交给 RPC客户端才找得到、匹配/etc/exports决定放行哪些客户端、映射导出选项与 UID 决定文件落到服务端后归谁。改完配置先exportfs -r再验证遇到被拒先看客户端 IP 有没有落在匹配范围内。觉得有用可以收藏access denied或写权限的问题欢迎在评论区聊聊排查过程。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑