NFS 在 Linux 环境里的出镜率一直很高:嵌入式开发要用它挂载 rootfs,服务器运维要拿它做共享存储,实验环境里也经常用它在多台机器之间传文件。很多初学者跟着教程安装 NFS 时,往往复制几条命令就把服务端搭起来了,客户端也挂载成功了,但换个环境、换个系统版本就翻车:showmount能看见目录却挂不上,挂载后写文件提示Permission denied,重启机器后共享目录消失。这些问题归根结底不是命令记错了,而是没有理解 NFS 的工作链路。
本文会从 NFS 的运行机制讲起,然后在一个最小实验环境里完成 NFS 服务端的安装、配置、客户端挂载、开机自动挂载和性能测试。过程中会解释每个配置项的作用,也会把常见报错按现象、原因、检查方式、解决方案整理成排查清单。文章末尾会区分学习环境、开发环境与生产环境的使用差异,最后给出一个可以直接复用的安装检查清单。看完之后,遇到 NFS 相关的问题,至少知道从哪一层开始查。
1. 先理解 NFS 的工作链路,排错时才会知道问题在哪一层
NFS 全称是 Network File System,网络文件系统,由 Sun Microsystems 提出,目的很简单:让一台 Linux 机器通过网络把目录共享出去,其他机器像访问本地目录一样访问这些远程文件。
这里有一个关键设计:NFS 本身并不负责“找到服务端”这件事。它依赖一个叫 RPC(Remote Procedure Call,远程过程调用)的机制来做服务注册和寻址。NFS 服务启动后,会把自己监听的相关端口注册到 rpcbind(早期叫 portmap)上,客户端要挂载 NFS 时,首先向 rpcbind 询问“NFS 服务的端口是多少”,拿到端口后才会真正发起挂载请求。这也是为什么排错时经常提到rpcinfo、rpcbind的原因。
NFS 在 Linux 内核态的完整链路大致是这样的:
- 客户端执行
mount -t nfs 服务端IP:/共享路径 /本地挂载点。 - 客户端内核向服务端的 rpcbind 发起 RPC 查询,拿到 mountd 和 nfsd 的端口信息。
- 客户端与 mountd 建立连接,完成挂载协商。
- 客户端与 nfsd 建立实际的数据传输通道。
- 后续所有文件读写都走内核态的 NFS 协议,普通用户通过 VFS(虚拟文件系统)层透明访问远程文件。
从这个链路可以看出,NFS 挂不上文件,可能出在四个层面:
| 故障层面 | 典型问题 | 关键检查工具 |
|---|---|---|
| 网络层 | 服务端 IP 不通,防火墙拦截端口 | ping、telnet、ss、firewall-cmd |
| RPC 层 | rpcbind 未启动,服务未注册成功 | rpcinfo -p、showmount -e |
| 权限层 | 共享目录权限、NFS 导出权限、SELinux | ls -ld、exportfs -v、getenforce |
| 挂载层 | 挂载参数不匹配、本地挂载点不存在 | mount、dmesg、/var/log/messages |
容易误解的地方是:showmount -e能列出来服务端的共享目录,并不代表挂载一定会成功。showmount只验证了 rpcbind 和 mountd 正常,真正的挂载还涉及 nfsd、权限、网络端口开放等多个环节。所以排查 NFS 问题时,不能只看一步输出就下结论,必须沿着链路逐层检查。
2. 环境准备与版本选择,不同发行版用的服务名差别很大
NFS 服务端的实现经历了几代变化。早期经常看到nfs-utils里的nfsd,现在主流 Linux 发行版上看到的服务端套件仍然是 nfs-utils,但服务名和配置方式因发行版而异。动手安装之前,先确认系统版本,否则照着命令敲下去很容易出现“服务名不存在”的报错。
本文以两类常见环境为例:
- RHEL / CentOS / Rocky Linux / AlmaLinux 9.x
- Ubuntu Server 22.04 / 24.04 LTS(Debian 系)
在 RHEL 系发行版上,服务端软件包是nfs-utils,里面既包含服务端也包含客户端工具。在 Ubuntu 上,服务端软件包是nfs-kernel-server,客户端工具包是nfs-common。
| 发行版 | 服务端软件包 | 客户端软件包 | 服务端服务名 | 主要配置目录 |
|---|---|---|---|---|
| RHEL/CentOS/Rocky 9 | nfs-utils | nfs-utils | nfs-server | /etc/exports |
| Ubuntu 22.04/24.04 | nfs-kernel-server | nfs-common | nfs-server 或 nfs-kernel-server | /etc/exports |
| Debian 12+ | nfs-kernel-server | nfs-common | nfs-server | /etc/exports |
安装前最好先做三项检查:
cat /etc/os-release uname -r rpm -qa | grep nfs-utils # RHEL 系 dpkg -l | grep nfs # Ubuntu/Debian 系第一项确认发行版和版本,第二项确认内核版本,第三项确认是否已经装过 NFS 相关包。
如果是最小化安装的系统,通常需要手动安装。RHEL 系使用 yum/dnf,Ubuntu 使用 apt:
# RHEL / Rocky / AlmaLinux sudo dnf install -y nfs-utils # Ubuntu / Debian sudo apt update sudo apt install -y nfs-kernel-server nfs-common安装完成后,先启动 rpcbind 和 nfs-server,并设置开机自启。注意顺序很重要:rpcbind 要先启动,因为 nfs-server 要向 rpcbind 注册端口。
RHEL 系:
sudo systemctl enable --now rpcbind sudo systemctl enable --now nfs-server sudo systemctl enable --now nfs-utilsUbuntu/Debian 系:
sudo systemctl enable --now rpcbind sudo systemctl enable --now nfs-server检查注册状态时,使用rpcinfo -p:
rpcinfo -p正常情况下,输出里应该能看到nfs、mountd、portmapper等条目。如果只有 portmapper 和 rpcbind,没有 nfs 和 mountd,说明 nfs-server 没有正常启动,或者启动后注册失败。这种情况通常需要检查/etc/exports是否合法,或者直接看systemctl status nfs-server。
3. 服务端配置 /etc/exports,核心是理解权限选项的叠加关系
NFS 服务端最核心的配置文件是/etc/exports。每一行定义一个共享目录,语法如下:
共享目录 允许的主机(选项1,选项2,...)例如共享/srv/nfs给整个 192.168.10.0/24 网段,允许读写:
/srv/nfs 192.168.10.0/24(rw,sync,no_root_squash)需要先创建共享目录,并设置合理的属主和权限。这里有一个新手经常犯的错:只改/etc/exports,忘了改目录本身权限,导致客户端能以 NFS 协议挂载目录,但创建文件时仍然失败。
sudo mkdir -p /srv/nfs sudo chmod 755 /srv/nfs sudo chown root:root /srv/nfs在真实生产项目里,建议把共享目录规划成独立目录,并明确记录这个目录的用途、允许的客户端网段、以及预期的权限模型。千万不要用根目录或系统关键目录做测试。
写入/etc/exports之后,需要用exportfs -arv让配置生效,而不是重启服务。exportfs是 nfs-utils 提供的管理工具,它的作用是把/etc/exports里的规则加载到内核的导出表中。
sudo exportfs -arv然后查看当前生效的导出规则:
sudo exportfs -v输出类似:
/srv/nfs 192.168.10.0/24(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,no_all_squash)这里需要解释几个最常用的选项,因为它们是 NFS 权限问题的根源:
| 选项 | 含义 | 影响 |
|---|---|---|
| rw | 允许读写 | 只读时客户端无法创建或修改文件 |
| ro | 只读 | 客户端只能读取文件 |
| sync | 写入时先落盘再返回 | 数据安全高,性能略低 |
| async | 写入先返回再异步落盘 | 性能高,但异常断电可能丢数据 |
| root_squash | 将远程 root 用户映射为匿名用户(默认值) | 防止远程 root 直接操作服务端文件 |
| no_root_squash | 不映射远程 root,保留 root 权限 | 特殊场景使用,有安全风险 |
| all_squash | 所有远程用户都映射为匿名用户 | 适合公开共享 |
| no_subtree_check | 关闭子目录检查,提高性能 | 常用配置 |
最需要重点理解的是root_squash和no_root_squash。NFS 默认开启root_squash,意思是当客户端以 root 身份访问服务端共享目录时,服务端会把客户端 root 映射成nobody(或nfsnobody,不同发行版略有差异)。这样做是合理的:如果不映射,任何一个能挂载 NFS 的客户端 root 用户,就能以服务端 root 身份操作共享目录里的文件,破坏性极大。
所以如果客户端挂载后以 root 创建文件,服务端看到的属主不是 root,而是 nobody,这是正常现象。反过来,如果开发环境里需要保留 root 权限,可以临时加上no_root_squash,但生产环境强烈不建议这样做。下面这个例子演示了权限配置错误时出现的现象:
# 错误配置示例:目录本身没有写权限 /srv/nfs 192.168.10.0/24(rw,sync,no_root_squash)共享目录/srv/nfs的权限如果是755 root:root,客户端 root 用户通过 no_root_squash 映射为 root 后,可以在里面创建文件。但如果去掉no_root_squash,客户端 root 被映射为 nobody,而 nobody 对/srv/nfs没有写权限,创建文件就会失败。这就是为什么排查Permission denied时,既要看 exports 配置,也要看共享目录的属主和权限。
注意点:NFS 的权限判断是叠加的。同一台客户端在/etc/hosts.allow、防火墙、exports 配置里都被允许,才能真正访问;如果 exports 里写了只读,即使系统权限是 777,客户端也无法写入。
3.1 生产环境推荐的 exports 配置示例
生产环境里共享目录通常不会直接暴露给所有网段。假设内网网段是192.168.50.0/24,共享目录是/data/shared,建议写成:
/data/shared 192.168.50.0/24(rw,sync,no_subtree_check)这里没有加no_root_squash,客户端 root 会被映射为匿名用户,服务端文件得到保护。sync确保写入数据先落盘,避免异常断电丢数据。no_subtree_check是为了减少内核在每次请求时检查子目录的开销,适合目录层次比较简单的场景。
如果只是学习环境,可以简化:
/srv/nfs 192.168.10.0/24(rw,sync,no_root_squash,no_subtree_check)学习环境中加上no_root_squash可以让调试更方便,但心里要清楚,这个选项在真实服务器上会带来安全风险。
4. 客户端安装与挂载,注意挂载参数和权限映射结果
客户端操作分为三步:安装客户端工具、创建挂载点、执行挂载命令。
RHEL 系客户端安装 nfs-utils,Ubuntu/Debian 系安装 nfs-common:
# RHEL/Rocky sudo dnf install -y nfs-utils # Ubuntu/Debian sudo apt update sudo apt install -y nfs-common客户端安装完成后,先用showmount查看服务端导出的目录,验证 RPC 层和 mountd 层是否正常。
showmount -e 192.168.10.10如果输出类似:
Export list for 192.168.10.10: /srv/nfs 192.168.10.0/24说明 rpcbind 和 mountd 工作正常,可以继续挂载。如果这里就报错,比如clnt_create: RPC: Port mapper failure,说明网络不通或者 rpcbind 未启动。
挂载命令:
sudo mkdir -p /mnt/nfs sudo mount -t nfs 192.168.10.10:/srv/nfs /mnt/nfs挂载成功后执行df -h,能看到一条192.168.10.10:/srv/nfs的记录。
为了调试挂载参数,可以用mount -v输出详细过程:
sudo mount -v -t nfs 192.168.10.10:/srv/nfs /mnt/nfsNFS 挂载参数非常多,初学者不必全记,但有几个在实际生产里非常重要,需要理解:
| 参数 | 作用 | 学习环境推荐值 | 生产环境推荐值 |
|---|---|---|---|
| soft/hard | 软挂载/硬挂载 | hard | hard |
| timeo | 超时时间(0.1 秒为单位) | 600 | 600 或更高 |
| retrans | 重传次数 | 2 | 2 或 3 |
| vers | NFS 协议版本 | 4.2 | 4.2 |
| noexec | 禁止执行二进制文件 | 看需求 | 安全要求高时开启 |
| nosuid | 禁止 setuid 位 | 建议开启 | 建议开启 |
| intr | 允许中断阻塞的挂载 | 老参数,NFSv4 不生效 | NFSv4 不需要 |
学习环境里用最简单的命令就能跑通:
sudo mount -t nfs -o vers=4.2 192.168.10.10:/srv/nfs /mnt/nfs生产环境挂载建议显式加上hard,intr,timeo=600,retrans=2:
sudo mount -t nfs -o hard,intr,timeo=600,retrans=2,vers=4.2 192.168.10.10:/srv/nfs /mnt/nfs这样写的好处是:当服务端短暂不可达时,客户端不会立刻报错退出,而是重试,这对于数据库备份、日志采集这类对连续性要求高的任务更友好。
挂载成功后,可以在挂载点里创建一个测试文件:
touch /mnt/nfs/test.txt ls -l /mnt/nfs/test.txt如果挂载时没有加no_root_squash,在客户端以 root 创建的文件,服务端看到的属主是nobody或者nfsnobody。这是正确行为,不是 bug。
5. 开机自动挂载与安全加固,学习环境也要尽早养成规范
手工挂载只是临时生效,系统重启后挂载关系会消失。要让客户端开机自动挂载,推荐使用 systemd 的.mount单元,而不是传统把挂载命令写进/etc/rc.local。用 systemd 挂载 NFS 的好处是:能管理依赖关系(比如网络就绪后再挂载)、能在异常卸载时记录日志、能配合systemctl统一管理。
systemd 挂载 NFS 的方式是把挂载点路径转换成单元名。假设挂载点是/mnt/nfs,那么单元文件是/etc/systemd/system/mnt-nfs.mount:
[Unit] Description=Mount NFS share from 192.168.10.10 After=network-online.target Wants=network-online.target [Mount] What=192.168.10.10:/srv/nfs Where=/mnt/nfs Type=nfs Options=hard,intr,timeo=600,retrans=2,vers=4.2 [Install] WantedBy=multi-user.target创建单元文件后,执行:
sudo systemctl daemon-reload sudo systemctl enable --now mnt-nfs.mount启动后检查状态:
systemctl status mnt-nfs.mount如果挂载失败,查看日志:
journalctl -u mnt-nfs.mount安全加固方面,学习环境也要养成两个好习惯:
- NFS 默认依赖 rpcbind 动态分配端口,但生产环境建议把 NFS 相关端口固定下来,方便防火墙放行和监控。通过修改
/etc/nfs.conf或/etc/sysconfig/nfs(RHEL 系)可以固定mountd端口、statd端口等。 - 防火墙放行规则要尽量限制来源网段,不要对全部 IP 放行。
在 RHEL 系发行版上,如果启用了 firewalld,可以这样放行:
sudo firewall-cmd --permanent --add-service=nfs sudo firewall-cmd --permanent --add-service=rpc-bind sudo firewall-cmd --permanent --add-service=mountd sudo firewall-cmd --reloadUbuntu 上如果启用了 UFW,可以这样放行:
sudo ufw allow from 192.168.10.0/24 to any port nfs sudo ufw allow from 192.168.10.0/24 to any port 111 sudo ufw allow from 192.168.10.0/24 to any port 2049注意,NFS 的默认数据端口是 2049,这个端口必须放行。此外 rpcbind 的 111 端口也要放行,因为客户端要靠它寻找 mountd。如果 mountd 没有固定端口,防火墙会变得很难管理,这是生产环境一定要固定端口的原因。
6. 验证与性能测试,不能只看“挂上了”这一个结果
验证 NFS 是否真的可用,要分多步,而不是只看df -h里有没有记录。
第一步,确认挂载点和文件系统类型:
mount | grep nfs df -h | grep nfs第二步,验证读写权限:
sudo touch /mnt/nfs/write_test echo "nfs test" | sudo tee /mnt/nfs/readwrite_test cat /mnt/nfs/readwrite_test rm -f /mnt/nfs/write_test第三步,验证文件属性映射。在客户端创建一个文件,然后在服务端查看该文件的属主和权限:
# 客户端执行 sudo touch /mnt/nfs/owner_test ls -l /mnt/nfs/owner_test # 服务端执行 ls -l /srv/nfs/owner_test如果看到客户端的属主是 root,服务端却是 nobody,说明 root_squash 生效了。如果希望客户端 root 就是服务端 root,需要在 exports 里加no_root_squash并重新 exportfs,但正如前面所说,生产环境不推荐。
第四步,用 dd 做一个简单的写入性能测试。下面这个命令向挂载目录写入一个 500MB 的文件:
dd if=/dev/zero of=/mnt/nfs/testfile bs=1M count=500 conv=fdatasync执行后能看到类似:
500+0 records in 500+0 records out 524288000 bytes (524 MB) copied, 4.23456 s, 124 MB/s这里的速度会受网络带宽、服务端磁盘性能、NFS 版本、挂载参数共同影响。conv=fdatasync确保数据真正写入磁盘后才返回,能反映真实落盘性能。
如果需要更细致的深度测试,可以用 fio。fio 是 Linux 下常用的 IO 性能测试工具,可以模拟顺序读、随机写等不同负载:
sudo fio --name=nfs_test --directory=/mnt/nfs --size=1G \ --rw=randrw --bs=4k --iodepth=16 --numjobs=4 \ --runtime=30 --time_based --group_reporting这里解释几个参数:
| 参数 | 含义 | 含义说明 |
|---|---|---|
| --rw=randrw | 随机读写混合 | 模拟真实应用的小文件随机访问 |
| --bs=4k | 块大小 | 4KB 是数据库等应用的典型 IO 大小 |
| --iodepth | 并发 IO 深度 | 模拟应用一次能提交多少个 IO |
| --numjobs | 并发进程数 | 模拟多客户端或多线程场景 |
| --runtime | 测试时长 | 建议至少 30 秒 |
| --group_reporting | 汇总报告 | 输出聚合统计 |
fio 结果里重点看IOPS(每秒 IO 次数)和BW(带宽)。如果随机写的 IOPS 非常低,比如只有几十,可能是网络延迟高、服务端磁盘性能差、或者 NFS 挂载时没有开启合适的缓存参数。需要注意的是,在生产环境做 fio 测试前,要确认不会影响正在运行的业务,不要直接在业务数据目录里乱写测试文件。
7. 常见问题排查清单,从日志到内核按层排除
NFS 的问题表现千奇百怪,但排查路径是固定的。按照下面这个顺序逐层排查,能覆盖绝大多数场景。
7.1 服务端启动失败或者状态异常
现象:
sudo systemctl status nfs-server显示failed或activating卡住。
可能原因:
- 配置了不存在的共享目录。
/etc/exports语法错误。- 端口被占用。
- rpcbind 没有启动。
检查方式:
sudo journalctl -u nfs-server -n 50 sudo exportfs -v sudo rpcinfo -p解决方式:
- 修正
/etc/exports后执行sudo exportfs -arv。 - 确认 rpcbind 处于 active 状态。
- 用
ss -tlnp | grep 2049查看 2049 端口是否被其他进程占用。
7.2 客户端 showmount 能列出目录,挂载时报 Permission denied
现象:
sudo mount -t nfs 192.168.10.10:/srv/nfs /mnt/nfs报:
mount.nfs: access denied by server while mounting 192.168.10.10:/srv/nfs可能原因:
- 客户端 IP 不在 exports 允许列表里。
- exports 配置修改后没有重新加载。
- NFS 版本协商失败。
检查方式:
- 在服务端执行
sudo exportfs -v,确认导出规则里是否包含客户端 IP 所在网段。 - 客户端执行
showmount -e 192.168.10.10,看服务端是否能列出导出目录。 - 加上
-o vers=4.2或-o vers=3强制指定版本测试。
解决方式:
- 修改
/etc/exports,加入客户端 IP 或网段。 - 重新执行
sudo exportfs -arv。 - 如果客户端内核较老,尝试 NFSv3。
7.3 挂载成功但创建文件或写文件时报 Permission denied
现象:
touch /mnt/nfs/test.txt touch: cannot touch '/mnt/nfs/test.txt': Permission denied可能原因:
- 共享目录在服务端的属主和权限不允许写入。
- root_squash 把客户端 root 映射为 nobody,而 nobody 没有写权限。
- SELinux 或 AppArmor 拦截。
检查方式:
- 服务端执行
ls -ld /srv/nfs,查看权限。 - 客户端执行
id,确认自己是 root 还是普通用户。 - 服务端执行
getenforce(RHEL 系)确认 SELinux 状态。
解决方式:
- 修改共享目录权限,或者挂载时使用
no_root_squash(学习环境可以,生产环境谨慎)。 - 查看 SELinux booleans,执行
sudo setsebool -P nfs_export_all_rw 1。 - 在
/etc/exports里加all_squash并指定anonuid、anongid,把远程用户映射到服务端特定用户,再给该用户授予目录权限。这是生产环境比较推荐的做法,例如:
/srv/nfs 192.168.50.0/24(rw,sync,all_squash,anonuid=1001,anongid=1001)7.4 挂载后机器重启,NFS 目录没挂上
现象:systemctl status mnt-nfs.mount显示失败。
可能原因:
- 网络依赖没有配置。
- 服务端 IP 不可达。
- mount 单元文件路径和挂载点命名不匹配。
解决方式:在.mount单元里加上After=network-online.target和Wants=network-online.target,并执行sudo systemctl daemon-reload、sudo systemctl restart mnt-nfs.mount。
7.5 服务端端口无法固定,防火墙规则难以管理
现象:每次重启 NFS 服务,mountd 端口都在变化,防火墙放了一条端口规则仍然失败。
原因:mountd 默认由 rpcbind 动态分配端口。
解决方式:在 RHEL 系发行版上修改/etc/nfs.conf,找到[mountd]段,添加:
[mountd] port=40001同时修改[statd]:
[statd] port=40002重启服务后,用rpcinfo -p确认 mountd 端口已经固定为 40001,再在防火墙上放行 TCP/UDP 40001、40002 和 2049、111 端口。
8. 学习环境与生产环境的差异,别把实验配置直接搬上服务器
学习环境的目标是快速理解原理、跑通流程,所以经常会用最简配置,甚至为了调试方便加上no_root_squash。这种配置在几台实验机上没问题,但如果直接搬到生产环境,风险非常高。
生产环境与学习环境的差异,至少体现在以下几个方面:
| 维度 | 学习环境 | 生产环境 |
|---|---|---|
| 共享目录权限 | root 随意操作 | 按业务账号最小授权 |
| exports 选项 | 常用 no_root_squash | 使用 all_squash + anonuid 或明确映射 |
| 端口管理 | 动态注册 | 固定 mountd/statd 端口 |
| 防火墙 | 可能没开或全放行 | 按客户端网段最小放行 |
| 性能验证 | 简单 touch/dd | fio 压测,结合监控 |
| 高可用 | 无 | 考虑冗余、备份、监控告警 |
| 日志 | 不关注 | 集中采集 nfs 相关日志 |
生产环境中 NFS 不推荐直接读写数据库数据文件,除非网络和存储性能经过充分验证。它更适合用于文件共享、日志收集、静态资源分发、备份中转等场景。如果确实需要把数据库文件放在 NFS 上,必须经过严格的 fio 压测和故障演练,否则网络抖动一次就可能造成数据损坏。
另外,生产环境要有回滚方案。修改 exports 之前先备份/etc/exports,记录原配置。修改后不要直接重启服务,先用exportfs -v验证规则是否正确,再通知业务侧进行挂载验证。出问题时能立刻恢复原配置。
9. 最佳实践清单与扩展方向
到这里,NFS 服务端的安装、配置、客户端挂载、验证和排错已经全部走了一遍。最后整理一份可以直接抄进团队文档的最佳实践清单,适用于大多数 Linux 服务器上的 NFS 场景:
- 安装前先确认发行版和内核版本,选择对应的软件包和服务名。
- 共享目录独立规划,不要使用根目录、家目录或系统关键目录。
/etc/exports修改后先用exportfs -arv加载,再使用exportfs -v验证。- 客户端挂载时显式指定 NFS 版本,默认协商失败时排错更难。
- 学习环境可以加
no_root_squash,生产环境建议用all_squash配合anonuid、anongid做账号映射。 - 生产环境固定
mountd和statd端口,配合防火墙做最小放行。 - 客户端不要直接写静态挂载到
/etc/fstab里然后重启,优先使用 systemd.mount单元管理。 - 每次挂载后至少验证三件事:
df -h有记录、目录可读写、属主权限符合预期。 - 数据安全优先时挂载参数使用
sync,性能优先时再评估async,不要在数据库场景无脑用 async。 - 服务端和客户端的日志都要看。RHEL 系看
/var/log/messages,Ubuntu 看journalctl -u nfs-server和journalctl -k。
扩展方向上,建议接下来研究这几个方向:
- NFSv4 的 Kerberos 认证支持,适合对安全要求高的内网环境。
- NFS 与 LDAP / 集中认证结合,解决多客户端用户 ID 不一致问题。
- 基于 NFS 的自动化备份脚本,比如用
rsync定时同步共享目录。 - 进入容器和 Kubernetes 场景后,NFS 作为 PV 后端的使用方式,以及 ReadWriteMany 场景的选择。
NFS 本身不是新技术,但它在 Linux 环境里的地位一直很稳定。真正熟练使用 NFS,不只是会敲几条 mount 命令,而是能在环境变化时快速定位问题层面。按照“网络层 -> RPC 层 -> 权限层 -> 挂载层”的顺序排查,大多数故障都能在十分钟内有结论。把这个顺序刻在习惯里,遇到其他基于 RPC 的存储服务,也能复用同样思路。