监控磁盘SMART状态的脚本如何写

wen 实用脚本 3

监控磁盘SMART状态的脚本如何写:从入门到生产级部署

目录导读

  1. 为什么必须监控磁盘SMART状态?
  2. SMART监控的核心原理与关键指标
  3. 手写第一个基础SMART监控脚本
  4. 进阶:带报警与日志的生产级脚本
  5. 常见问题与调试技巧
  6. Q&A:读者最关心的5个问题

为什么必须监控磁盘SMART状态?

在服务器运维中,磁盘故障是导致数据丢失和服务中断的头号原因,根据Backblaze发布的硬盘故障率报告(2022-2024年数据),通过SMART(Self-Monitoring, Analysis and Reporting Technology)监控,可以在磁盘物理损坏前提前发现80%以上的潜在故障。SMART是磁盘自带的健康监测系统,堪称“硬盘的体检报告”。

监控磁盘SMART状态的脚本如何写

核心收益

  • 即时发现坏道、磁头老化、马达异常
  • 在数据彻底丢失前留出备份窗口(通常有数小时至数天)
  • 降低RPO(恢复点目标)到分钟级

适用场景
无论你是管理单台Linux开发机、NAS家庭服务器,还是运维云主机(注意:云磁盘通常由云平台托管SMART,但物理机仍需自行监控),掌握SMART脚本都是基础技能。


SMART监控的核心原理与关键指标

1 必读的SMART属性解读

运行smartctl -a /dev/sda(需要安装smartmontools),输出中重点关注以下属性:

属性ID 名称 临界值 正常范围 异常信号
5 Reallocated_Sector_Ct 36 0 非零值即警告
187 Reported_Uncorrect 0 0 任何非零值
197 Current_Pending_Sector 0 0 等待重映射的坏道
198 Offline_Uncorrectable 0 0 不可纠正扇区

注意:不同品牌(西数、希捷、三星)的阈值定义可能不同,建议使用官方文档或经验值。

2 监控脚本的核心逻辑

判断条件:
- Reallocated_Sector_Ct > 0  → 立即告警
- Current_Pending_Sector > 0 → 黄色警告
- 任何Raw_Read_Error_Rate 趋势上升 → 定期检查
- Total_LBAs_Written 过高 → 预估剩余寿命

手写第一个基础SMART监控脚本

环境准备

# Debian/Ubuntu
sudo apt install smartmontools -y
# RHEL/CentOS
sudo yum install smartmontools -y

最简单的检查脚本:check_smart_basic.sh

#!/bin/bash
# 基础SMART检查脚本
DISK="/dev/sda"
# 检查SMART是否可用
if ! smartctl -H $DISK | grep -q "PASSED"; then
    echo "Warning: $DISK SMART health check FAILED!"
    exit 1
fi
# 提取高危属性
REALLOC=$(smartctl -a $DISK | grep "Reallocated_Sector_Ct" | awk '{print $10}')
UNCORRECT=$(smartctl -a $DISK | grep "Reported_Uncorrect" | awk '{print $10}')
# 判定阈值(根据磁盘品牌调整)
if [ "$REALLOC" -gt 0 ] || [ "$UNCORRECT" -gt 0 ]; then
    echo "Alert: Disk has bad sectors! Reallocated=$REALLOC, Uncorrect=$UNCORRECT"
    exit 2
fi
echo "SMART status OK"
exit 0

运行方法
chmod +x check_smart_basic.sh && ./check_smart_basic.sh

局限性

  • 只检查/dev/sda,不支持多磁盘
  • 无日志记录
  • 无邮件/钉钉报警

进阶:带报警与日志的生产级脚本

1 脚本设计要点

生产级脚本必须包含:

  1. 自动发现所有磁盘(排除NVMe、RAID卡特殊设备)
  2. 分级报警(Warning/Critical)
  3. 持久化日志(追加上一次检查结果)
  4. 集成通知(邮件、Webhook、Prometheus metrics)

2 完整脚本:smart_monitor_pro.sh

#!/bin/bash
# 生产级SMART监控,支持多磁盘、JSON日志、企业微信告警
LOG_DIR="/var/log/smart_monitor"
ALERT_EMAIL="admin@example.com"  # 替换为实际邮箱
WEBHOOK_URL="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY"  # 可选
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# 创建日志目录
mkdir -p $LOG_DIR
# 获取所有可用磁盘(排除MD阵列、RAID卷、nvme)
DISKS=$(lsblk -ndo NAME -e 7,253,254 | grep '^sd' | sort | head -8)
if [ -z "$DISKS" ]; then
    echo "No disks found"
    exit 2
fi
# 报警计数
CRITICAL_COUNT=0
WARN_COUNT=0
TIMESTAMP=$(date '+%Y%m%d_%H%M%S')
REPORT_FILE="$LOG_DIR/report_$TIMESTAMP.log"
for DISK in $DISKS; do
    DEVICE="/dev/$DISK"
    echo -e "Checking ${YELLOW}$DEVICE${NC}..."
    # 获取原始值
    realloc=$(smartctl -A $DEVICE | awk '/Reallocated_Sector_Ct/{print $10}')
    pending=$(smartctl -A $DEVICE | awk '/Current_Pending_Sector/{print $10}')
    raw_read=$(smartctl -A $DEVICE | awk '/Raw_Read_Error_Rate/{print $10}')
    # 默认值处理(如果没找到属性则为0)
    realloc=${realloc:-0}
    pending=${pending:-0}
    raw_read=${raw_read:-0}
    # 判断严重程度
    if [ "$realloc" -gt 0 ] || [ "$pending" -gt 0 ]; then
        echo -e "${RED}CRITICAL: $DEVICE has bad sectors!${NC}"
        echo "CRITICAL: $DEVICE realloc=$realloc pending=$pending" >> $REPORT_FILE
        ((CRITICAL_COUNT++))
    elif [ "$raw_read" -gt 10000 ]; then
        echo -e "${YELLOW}WARNING: $DEVICE raw read rate high ($raw_read)${NC}"
        echo "WARNING: $DEVICE raw_read=$raw_read" >> $REPORT_FILE
        ((WARN_COUNT++))
    else
        echo -e "${GREEN}PASSED${NC}"
    fi
done
SUMMARY="SMART监控报告 ($(date))\n"
SUMMARY+="检查磁盘数: $(echo $DISKS | wc -w)\n"
SUMMARY+="严重问题(Critical): $CRITICAL_COUNT\n"
SUMMARY+="警告(Warning): $WARN_COUNT\n"
echo -e "$SUMMARY" >> $REPORT_FILE
# 报警逻辑
if [ $CRITICAL_COUNT -gt 0 ]; then
    # 发送邮件(需配置mailx或postfix)
    echo "$SUMMARY" | mail -s "SMART Critical Alert" "$ALERT_EMAIL"
    # 发送Webhook(例如企业微信机器人)
    if [ -n "$WEBHOOK_URL" ]; then
        curl -s -X POST -H "Content-Type: application/json" \
            -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$SUMMARY\"}}" \
            "$WEBHOOK_URL"
    fi
    exit 1
fi
exit 0

3 部署到定时任务

# 每6小时检查一次
0 */6 * * * /opt/scripts/smart_monitor_pro.sh >> /var/log/smart_monitor_cron.log 2>&1

4 扩展功能:Prometheus输出

如果您使用Prometheus+Grafana监控,可将脚本输出改为exporter格式:

# 在循环中添加
echo "smart_disk_realloc{sector=\"sda\"} $realloc"
# 通过node_exporter的textfile收集器收集
# 配置:--collector.textfile.directory=/var/lib/node_exporter/textfile

常见问题与调试技巧

问题 解决方案
smartctl: device lacks SMART capability 部分虚拟化磁盘不支持SMART(如KVM虚拟磁盘)需跳过
脚本运行极慢(扫描20块盘耗时30秒) 增加缓存机制,每1小时执行一次全扫描,平时只读缓存
对NVMe SSD失效 NVMe使用nvme smart-log /dev/nvme0,需单独适配
RAID卡上的磁盘 使用smartctl -d megaraid,N /dev/sda(N为设备编号)

调试技巧

# 获取单个磁盘的所有SMART属性(跳过解释)
smartctl -A /dev/sda | grep -E "^(  5|197|198)" | awk '{print $1": "$10}'

Q&A:读者最关心的5个问题

Q1:SMART监控能100%防止数据丢失吗?
不能,SMART只能检测到约60%~80%的磁盘故障(突发掉电、主控芯片故障无法预知)。必须结合RAID、定期备份、坏道检查

Q2:如何判断我的磁盘支持SMART?
执行smartctl -i /dev/sda,查看“SMART support is: Available”和“Enabled”,如果为Disabled,先启用:smartctl -s on /dev/sda

Q3:Reallocated_Sector_Ct出现5个,需要立刻换盘吗?
分情况:

  • 如果磁盘还在保修期内,建议换盘。
  • 如果仅5个且不再增长,可能是物理震荡导致,可观察1周。
  • 如果持续增长(每天增加≥1),必须换盘。

Q4:脚本中awk '{print $10}'有时获取不到值怎么办?
因为SMART输出格式因品牌而异,建议使用grep -A1sed定位行,再提取值,更稳健的方法是用smartctl -x输出JSON格式(smartmontools 7.0+支持)。

Q5:Windows如何监控SMART?
推荐使用CrystalDiskInfo的CLI版(无GUI脚本环境),或Windows计划任务配合PowerShell调用Get-PhysicalDisk命令,但生产环境建议基于Linux/FreeBSD。


本文从SMART基础原理出发,提供了基础检查脚本生产级集成报警脚本两个版本,核心要点:

  1. 监控属性优先看Reallocated_Sector_Ct、Current_Pending_Sector
  2. 生产脚本必须自动发现磁盘、分级告警、记录日志
  3. 没有完美监控,必须结合SMART+RAID+备份三层防御

建议行动:立即登录你的服务器,运行smarctl -a /dev/sda查看原始数据进行评估,再部署本文的脚本到cron,数据安全始于一次简单的检查。

抱歉,评论功能暂时关闭!