linux开机自动检测磁盘坏道并告警的正确做法是启用smartd守护进程监控smart状态,通过配置/etc/smartd.conf和自定义告警脚本实现轻量、实时、生产可用的异常预警,而非低效高损的全盘扫描。

Linux 中开机自动检测磁盘坏道并告警,不能也不应依赖每次开机都全盘扫描(如 badblocks)——那会严重拖慢启动、损耗硬盘寿命,且无必要。真正可行、安全、生产环境推荐的做法是:开机时自动检查 SMART 状态,并对异常指标触发告警。这既轻量又及时,符合“事前预警”原则。
✅ 开机自动运行 SMART 健康检查与告警
核心思路:利用 smartd 守护进程(随系统启动)持续监控,配合自定义脚本实现异常时通知(邮件/日志/弹窗等)。
1. 确保 smartmontools 已安装并启用 SMART
# Debian/Ubuntu sudo apt install smartmontools # RHEL/CentOS/Fedora sudo dnf install smartmontools # 启用并启动服务(开机自启) sudo systemctl enable smartd sudo systemctl start smartd
⚠️ 注意:
smartd默认已配置为开机启动,但需确认/etc/default/smartmontools(Debian系)或/etc/sysconfig/smartd(RHEL系)中start_smartd=yes。
2. 配置 smartd 主动监控与告警规则
编辑 /etc/smartd.conf,添加或修改对应硬盘行(以 /dev/sdb 为例):
/dev/sdb -a -o on -S on -n standby,q -m root -M exec /usr/local/bin/smart-alert.sh
说明:
-
-a:启用所有 SMART 检测项(包括重映射扇区、待处理扇区等) -
-o on:开启自动离线测试(offline testing) -
-S on:启用自动保存属性(用于趋势分析) -
-n standby,q:硬盘处于 standby 状态时也静默跳过,不唤醒;q表示 quiet mode,避免日志刷屏 -
-m root:异常时发邮件给 root(需本地 MTA 如 mailutils 或 postfix) -
-M exec /usr/local/bin/smart-alert.sh:关键!用自定义脚本替代默认邮件,实现灵活告警
3. 编写告警脚本 /usr/local/bin/smart-alert.sh
#!/bin/bash # 参数说明:$1=设备名(如 /dev/sdb),$2=类型(如 "DISK FAILURE"),$3=详情 DEVICE="$1" ALERT_TYPE="$2" DETAIL="$3" # 写入系统日志(确保可查) logger -t "SMART-ALERT" "CRITICAL: $DEVICE - $ALERT_TYPE: $DETAIL" # 可选:发邮件(需已配置本地 sendmail/postfix) echo "Subject: [SMART ALERT] $DEVICE failure detected" | \ cat - > /var/log/smart-alerts.log # 可选:触发桌面通知(仅限有 GUI 的终端用户,非服务器场景) if [ -n "$DISPLAY" ] && command -v notify-send >/dev/null; then notify-send -u critical "⚠️ SMART Alert on $DEVICE" "$ALERT_TYPE" fi
赋予执行权限:
sudo chmod +x /usr/local/bin/smart-alert.sh
4. 验证配置并重启服务
# 检查语法是否正确 sudo smartd -d -c /etc/smartd.conf --config-file-test # 重载配置并重启 sudo systemctl restart smartd # 查看运行状态和最近日志 sudo systemctl status smartd sudo journalctl -u smartd -n 20 --no-pager
✅ 正常情况下,
smartd每30分钟轮询一次(可调),一旦发现Reallocated_Sector_Ct > 0或Current_Pending_Sector > 0等硬故障信号,立即触发脚本。
❌ 不推荐的“开机扫描”方式(为什么避开?)
-
badblocks -nsv全盘扫描:耗时数小时(TB级盘),阻塞启动,且必须卸载分区 → 无法用于根盘或挂载中业务盘 - 开机 rc.local 或 systemd 服务调用
badblocks:易因设备未就绪失败,无重试机制,不可靠 - 每次启动都跑 SMART long test:影响 I/O,非必要(日常用 short test + continuous monitoring 即可)
? 补充建议:让告警更实用
- 在脚本中加入
smartctl -A /dev/sdb | awk '/Reallocated_Sector_Ct|Current_Pending_Sector/ {print}'提取具体数值,让告警带原始数据 - 将
/var/log/smart-alerts.log加入 logrotate,避免膨胀 - 对于多盘服务器,用
for dev in /dev/sd[a-z]; do ...批量生成配置,或使用smartd的通配符(如DEVICESCAN -d removable -n standby,q -m root)
不复杂但容易忽略。











