最直接判断Linux挂载状态是否正常需三步验证:存在性(test -d)、挂载状态(findmnt -T)、可写性(touch+rm),而非仅依赖mount|grep;脚本应加timeout防NFS假死,并支持邮件告警与Prometheus集成。

Linux 文件系统挂载状态是否正常,直接影响服务可用性。最直接的判断方式不是看 /etc/fstab 是否写对了,而是实时确认目标挂载点是否真正处于“已挂载且可读写”状态。
核心监控指标:挂载点存在性 + 可访问性 + 可读写性
仅检查 mount | grep /path 是否输出,容易漏判:比如挂载点目录被误删、NFS 服务器宕机导致挂载点“假死”(显示挂载但实际卡住)、或权限变化导致无法写入。真正可靠的判断需三步验证:
-
存在性:目录路径是否存在(
test -d /mnt/data) -
挂载状态:该路径是否为独立挂载点(
findmnt -T /mnt/data > /dev/null) -
可写性:尝试创建并删除临时文件(
touch /mnt/data/.health_check && rm -f /mnt/data/.health_check)
编写轻量级检查脚本(支持邮件告警)
以下脚本可放入 /usr/local/bin/check-mount.sh,支持多挂载点批量检测,并在异常时发邮件(需系统已配置 sendmail 或 msmtp):
#!/bin/bash
MOUNT_POINTS=("/mnt/nfs" "/data" "/backup")
ALERT_EMAIL="admin@example.com"
<p>for mp in "${MOUNT_POINTS[@]}"; do
if [[ ! -d "$mp" ]]; then
echo "ERROR: $mp does not exist" | mail -s "Mount Alert on $(hostname)" "$ALERT_EMAIL"
continue
fi
if ! findmnt -T "$mp" > /dev/null; then
echo "ERROR: $mp is not mounted" | mail -s "Mount Alert on $(hostname)" "$ALERT_EMAIL"
continue
fi
if ! touch "$mp/.health_check" 2>/dev/null || ! rm -f "$mp/.health_check" 2>/dev/null; then
echo "ERROR: $mp is mounted but not writable" | mail -s "Mount Alert on $(hostname)" "$ALERT_EMAIL"
fi
done赋予执行权限:chmod +x /usr/local/bin/check-mount.sh,再通过 crontab 每5分钟执行一次:*/5 * * * * /usr/local/bin/check-mount.sh
规避常见陷阱:NFS 挂载的特殊处理
NFS 挂载失败常表现为“stale file handle”或无限等待,此时 findmnt 可能仍返回成功,但 touch 会 hang 住。建议加超时控制:
- 用
timeout 5 touch "$mp/.health_check"防止脚本阻塞 - 对 NFS 路径单独设置更宽松的重试逻辑(如尝试两次)
- 避免在检查脚本中执行
umount -f等危险操作,只告警不自动修复
集成进 Prometheus + Grafana(可选进阶)
若已有 Prometheus 监控体系,可用 node_exporter 的 node_filesystem_mounted 指标配合自定义 node_filesystem_readonly 判断只读状态。更推荐的方式是用 textfile_collector 输出自定义指标:
- 脚本末尾输出类似
mount_health{mountpoint="/mnt/nfs"} 1到/var/lib/node_exporter/textfile/mount.status.prom - 配置 node_exporter 加载该目录,Prometheus 抓取后即可设告警规则
- Grafana 中用
avg by (mountpoint) (mount_health == 0)可视化异常挂载点


















