一、为什么要单独研究 /etc/exports

原始笔记明确指出,NFS 服务端最核心的配置文件就是:

  • /etc/exports

并且还补充了一点非常重要的背景:

  • systemctl 对 NFS 的管理背后,本质上会调用 exportfs

这意味着如果你真的想理解 NFS 的共享逻辑,/etc/exports 是必须掌握的入口。

二、/etc/exports 的基本格式是什么

原始笔记把配置格式拆成了两部分:

  • 第 1 部分:共享目录
  • 第 2 部分:网段(以及选项)

一个典型示例就是:

/data/ 192.168.1.0/24(rw,sync,insecure,no_subtree_check,no_root_squash)

它可以拆成:

  • 共享目录:/data/
  • 允许访问的网段:192.168.1.0/24
  • 共享选项:括号中的一组参数

三、NFS 中的网络配置怎么写

原始笔记列出了几种常见写法:

  • 172.16.1.0/24:最常用,按网段授权
  • 172.16.1.7:按单个 IP 授权
  • baidu.com:按域名授权

在实验环境和企业内网里,最常见也最好管理的通常还是:

  • 按固定网段授权

这样更适合统一管理多个客户端节点。

四、服务端核心配置选项怎么理解

原始笔记重点强调了下面这些选项。

4.1 rwro

  • rw:允许读写
  • ro:只读

它们决定了客户端挂载后是否能修改共享目录内容。

4.2 syncasync

这是 NFS 里非常重要的一组选项。

4.2.1 sync

表示同步写入:只要用户上传数据,就立即把数据写到磁盘。

优点:

  • 数据更稳妥

缺点:

  • 性能通常不如异步

4.2.2 async

表示异步写入:NFS 可以先把数据临时放在内存里,过一段时间再写入磁盘。

优点:

  • 并发性能更高

缺点:

  • 极端情况下存在数据丢失风险

4.3 怎么理解“同步”和“异步”

原始笔记用了一个很形象的比喻:

  • 同步:逐个确认,再处理
  • 异步:先集中起来,之后统一处理

放到网站架构里,也可以延伸理解为:

  • 同步更强调立即完成
  • 异步更强调先响应、后处理

五、什么是 NFS 的用户压缩

原始笔记把它称为“用户压缩”或“用户映射”。本质上就是:

  • NFS 客户端访问服务端共享目录时,服务端会把客户端用户映射成什么身份

一个典型现象是:

  • 客户端挂载后创建的文件,默认可能属于 nfsnobody

这就是用户压缩在起作用。

5.1 用户压缩相关核心选项

原始笔记列出了下面几项:

  • root_squash
  • no_all_squash
  • all_squash
  • anonuid
  • anongid

5.1.1 root_squash

如果客户端是 root 用户访问,到了服务端会被压缩成匿名用户。

这是默认行为,也是更安全的做法。

5.1.2 no_all_squash

如果客户端不是 root 用户访问,就不进行统一压缩,保留原始用户身份。

5.1.3 all_squash

所有用户都统一压缩成匿名用户。

这在某些场景下方便统一权限,但如果配置不当,也可能带来安全问题。

5.1.4 anonuidanongid

用于指定匿名用户映射成谁,例如:

  • anonuid=1999
  • anongid=1999

这样就可以把匿名访问统一映射为某个指定业务用户。

六、用户压缩案例怎么落地

原始笔记给出了一个很典型的案例:

  • 服务端共享目录:/nfsdata
  • 客户端挂载目录:/upload-video
  • 匿名用户映射为 www
  • www 的 UID/GID 统一为 1999

6.1 服务端和客户端统一用户

在所有相关主机上先创建统一的 www 用户:

groupadd -g 1999 www
useradd -u 1999 -g www -s /sbin/nologin -M www

6.2 服务端配置共享目录

原始笔记中的配置示例如下:

/data/    172.16.1.0/24(rw)
/nfsdata/ 172.16.1.0/24(rw,all_squash,anonuid=1999,anongid=1999)

这表示:

  • /nfsdata/ 对指定网段开放
  • 所有用户统一压缩
  • 匿名用户身份映射为 www

6.3 客户端挂载测试

mount -t nfs 172.16.1.31:/nfsdata /upload-video/

然后通过:

touch /upload-video/lidao.txt
ll /upload-video/

就可以验证最终文件身份是否符合预期。

七、NFS 优化时该先考虑什么

原始笔记给出了一个很有方向感的目标:

  • 尽可能让用户请求在访问网站架构之前就被处理掉,也就是尽量把请求往前推

这其实是在提醒:

  • 真正的架构优化,不一定全靠 NFS 本身
  • 很多优化应该在接入层、缓存层甚至对象存储层完成

7.1 硬件层面

NFS 的性能优化首先离不开硬件:

  • 更好的服务器
  • 更好的磁盘
  • 更稳定的网络

7.2 客户端安全挂载

原始笔记还给出了一组非常实用的安全挂载参数:

mount -o noexec,nosuid,nodev -t nfs 172.16.1.31:/data /video/

这些参数的含义分别是:

  • noexec:不允许在挂载目录执行二进制程序
  • nosuid:禁止 setuid
  • nodev:不允许创建设备文件

这类参数非常适合上传目录、媒体目录等“只希望写入和读取,不希望执行”的场景。

八、NFS 的局限性是什么

原始笔记最后也点出了 NFS 的典型问题:

  • 存在单点故障

这意味着一旦 NFS 服务端本身故障,客户端共享目录就会受到影响。

因此在更高要求的生产环境中,常见替代方向包括:

  • 分布式存储
  • 公有云对象存储,如阿里云 OSS

对象存储通常不是靠 Linux 挂载来使用,而是更多通过应用代码直接调用接口。

九、小结

NFS 学到这一步,最值得真正掌握的不是“命令能敲出来”,而是下面这些关键理解:

  • /etc/exports 是服务端配置核心
  • 网段授权方式要会写
  • rwrosyncasync 等核心选项要会解释
  • 用户压缩和匿名映射要能看懂
  • 客户端安全挂载参数要会用
  • 要清楚 NFS 有单点问题,不能无限放大它的适用范围

当这些点都真正理解之后,你对 NFS 的掌握就不再只是“会挂载”,而是已经进入“能配置、能解释、能优化”的阶段了。