摘要:在日常运维或开发环境中,很多人会用NFS(Network File System)共享文件。但如果服务器宕机、网络闪断、挂载点失效,就可能出现一种非常糟糕的情况——NFS 挂载僵死(stale NFS handle)。
在日常运维或开发环境中,很多人会用 NFS(Network File System) 共享文件。
但如果服务器宕机、网络闪断、挂载点失效,就可能出现一种非常糟糕的情况——NFS 挂载僵死(stale NFS handle)。
表现为:
ls /mnt/nfs、df 等命令直接卡死;kill -9 杀不掉相关进程;umount 无法卸载,提示 device is busy。别急,这其实是老问题。下面教你如何几步内快速“解冻” NFS!
NFS 是通过网络访问文件系统的。如果 NFS 服务器断开、网络中断或句柄失效,
客户端内核会一直等待响应,导致访问请求卡死在内核态。
这时普通的 kill、df、ls 都会被挂死,因为它们都在等待无法返回的 I/O。
sudo umount -l /mnt/nfs-l 表示 lazy umount(延迟卸载):
系统会立刻从挂载表中移除该目录;等不再有进程占用后再真正卸载;不会阻塞终端。这是“快速恢复”的首选命令,安全又有效。
-f(force)用于强制卸载,某些发行版(如 Red Hat 系)支持,但在部分系统上可能无效。
如果仍有进程在占用挂载点:
sudo fuser -mv /mnt/nfssudo fuser -km /mnt/nfs或使用:
sudo lsof | grep /mnt/nfs强制杀掉访问该路径的进程后,再重新卸载。
如果是客户端异常:
sudo systemctl restart nfs-client.target或者:
sudo systemctl restart nfs-common如果是服务端宕机:
sudo systemctl restart nfs-serverexportfs -ra恢复导出后,客户端可重新挂载。
卸载后重新挂载即可恢复访问:
sudo mount -t nfs nfs-server:/path /mnt/nfs或者在 /etc/fstab 中配置自动挂载,执行:
sudo mount -asoft:超时后返回错误,不会永久卡死;timeo=5:超时 0.5 秒;retrans=2:重试 2 次。autofs 能实现按需挂载、空闲自动卸载,从根本上避免 NFS 长期挂死。
在 /etc/systemd/system/mnt-nfs.mount 中加入:
[Mount]TimeoutSec=10防止系统启动或停止时被卡死。
可用命令检测 NFS 是否可达:
rpcinfo -t nfs-server nfs结合 cron 脚本定时检测挂载状态,自动恢复。
当 NFS 挂死时,直接执行这几步:
mount | grep nfssudo umount -l /mnt/nfssudo fuser -km /mnt/nfssudo mount -a几秒钟就能让整个系统恢复正常。
NFS 挂载僵死的问题,说大不大,说小也能卡死一整台机器。
关键是要知道——问题不在文件,而在内核等待网络响应。
使用 umount -l 是最快的“急救法”,
加上合理的 soft 参数、autofs、超时保护,
就能让你的系统在面对 NFS 故障时更加从容。
来源:linux运维菜
