Windows 要访问 Linux 上挂载的 NFS 目录,为什么走二次共享行不通

现场架构是三台机器:A、B 两台 Linux,C 是 Windows。A 作 NFS 服务端,B 已经把 A 的共享目录挂载到手;现在 C 想借道 B 看到这些内容,B 上开了共享出去,C 能浏览 B 本来的那些目录,唯独那个挂载来的 NFS 目录进不去,权限放全了也没用,而部署规矩又不许把 A、B 的角色调换。这种"借来的东西再转借"的困局,症结不在权限,在架构——把这一层想通,办法自然就浮出来了。

原因分析

B 上那个 NFS 目录,本质是 B 向 A 借来的一个视图:数据仍然躺在 A 的盘上,B 手里只是个挂载入口。B 再把这个入口转手共享给 C,等于借来的东西再往外借——NFS 的设计本就不鼓励这种二次分发:文件锁的语义过不了两跳,属主映射(uid、gid 对不上,root_squash 压权限)会在链路中变形,服务端句柄一失效整条链跟着断。即便在 B 上用 samba 把挂载点共享出去能短暂跑通,A 重启一次或 B 的挂载失效一回,C 端就全体掉线。所以正路不是修这条转手链,而是换思路:让 C 直连数据真正的主人 A。

分步解决

  1. 承认架构限制:挂载点不等于再共享源,两跳转手在 NFS 里天生不稳;方向转为让 C 与 A 之间直连。
  2. C 直连 A 的 NFS 通道:Windows 专业版及以上自带 NFS 客户端,在程序与功能里启用后即可直接挂载 A 的输出;挂载前留意匿名访问与 UID 映射设置,免得权限错位看到一排没人能读的文件。
  3. 或在 A 上补 SMB 协议:在 A 上加装 samba 服务,C 走 SMB 直连 A。一台存储同时输出 NFS 与 SMB 是生产环境里的常态,机房里 RS2423RP+ 这类机架存储平日就是双协议并行走法。
  4. 确实必须经 B 中转时:在 B 上用 samba 共享那个挂载点,先以宽松权限验证可行,再逐步收紧;同时把风险记在账上——A 侧重启、网络抖动都会连坐 C 端,锁语义也未必完整,只当过渡方案用。
  5. 定版时缩短链路:文件访问路径一跳直达优先于两跳转手,转手方案不进定版的架构图;日后新增机器接入,也按"直连数据主人"这条原则走。

预防

画拓扑图时把两件事标注清楚:协议由谁出、数据在谁家。每台机器只服务自己盘上的数据,挂载来的视图不再转手分发;跨平台访问先定协议再画连线,NFS、SMB 各有各的归宿。链路短一截,断点就少一截,出问题时排查半径也小一圈。