Skip to content

利用 smartctl + prometheus 监控硬盘健康状态

安装 exporter

依赖

smartmontools >= 7.0

安装包

根据自身系统下载相应的软件包

wget https://github.com/prometheus-community/smartctl_exporter/releases/download/v0.14.0/smartctl_exporter-0.14.0.linux-amd64.tar.gz

解压可运行文件到 /usr/local/bin/

创建服务

sudo tee /etc/systemd/system/smartctl_exporter.service > /dev/null <<EOF
[Unit]
Description=Prometheus Smartctl Exporter
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/smartctl_exporter \
 --smartctl.interval=60s \
 --smartctl.rescan=10m \
 --web.listen-address=:9633 \
 --log.level=info
Restart=on-failure
RestartSec=5s
TimeoutStopSec=10s
Environment="SMARTCTL_EXPORTER_ENABLE_INTERVAL=15s"
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=smartctl_exporter

[Install]
WantedBy=multi-user.target
EOF

启动服务

sudo systemctl daemon-reload
sudo systemctl enable smartctl_exporter
sudo systemctl start smartctl_exporter

验证服务状态

sudo systemctl status smartctl_exporter

配置 Prometheus

- job_name: "smartctl_exporter"
  static_configs:
    - targets: ["localhost:9633"]

将上述配置添加到 Prometheus 的配置文件 prometheus.yml 中,然后重启 Prometheus 服务以应用更改。

重点指标

🚨 硬盘健康监控关键指标(Prometheus/Grafana 告警规则)

规则类型 规则表达式 监控对象 阈值设定 物理含义 风险等级 监控建议
坏道检测 smartctl_device_attribute{attribute_id="5", attribute_value_type="raw"} > 0 重分配扇区计数
(Reallocated_Sector_Ct)
>0 触发告警 每增加 1=1 个物理坏扇区被替换
机械盘致命隐患
⚠️⚠️⚠️ 致命 立即更换硬盘
即使 1 也需重点关注
SSD 寿命 smartctl_device_attribute{attribute_id="173", attribute_value_type="value"} < 80 磨损平衡健康度
(厂商自定义, SSD 常见)
<80 触发告警 值下降速度反映 SSD 磨损:
- 80≈ 剩余 20%寿命
- 需结合备用块数综合判断
⚠️⚠️ 高危 企业盘: <70 换盘
消费盘: <50 换盘
SSD 寿命 smartctl_device_attribute{attribute_id="233", attribute_value_type="value"} < 50 剩余寿命百分比
(Media_Wearout_Indicator)
<50 触发告警 企业级 SSD: 直接显示百分比寿命
0 时写入锁定风险
⚠️ 中危 进入 50 区间即备盘
老化风险 smartctl_device_attribute{attribute_id="9", attribute_value_type="raw"} / (24 * 365) > 5 通电时间
(Power_On_Hours)
>5 年 触发告警 机械盘:
- 5 年故障率陡增
- 轴承/电机老化
SSD: 电子元件寿命衰减
⚠️⚠️ 高危 生产环境: >4 年即标记为高危
建议循环使用年限:
- 企业盘: 5 年
- 消费盘: 3 年
物理冲击 smartctl_device_attribute{attribute_id="12", attribute_value_type="raw"} > 100 启停次数
(Power_Cycle_Count)
>100 触发警告 频繁启停加速磁头磨损
特别警惕
- 单日>3 次异常重启
- 与温度骤变关联
⚠️ 中低危 结合ID 190(温度)监控
突发增高需排查供电/振动问题
数据完整性 smartctl_device_attribute{attribute_id="187", attribute_value_type="raw"} > 0 不可纠正错误
(Reported_Uncorrect)
>0 触发告警 数据完整性风险
物理损坏或传输错误
⚠️⚠️⚠️ 致命 出现即立即检查文件系统
温度监控 smartctl_device_attribute{attribute_id="194", attribute_value_type="value"} > 55 工作温度
(Temperature_Celsius)
>55℃ 触发告警 关键协同指标
- 高温加速老化
- SSD>60℃ 性能降级
- 机械盘>70℃ 磁头故障风险
⚠️ 中危 告警阈值建议:
- HDD: 50℃
- SSD: 60℃
数据传输异常 smartctl_device_attribute{attribute_id="184", attribute_value_type="value"} > 0 数据传输异常
(End-to-End_Error)
>0 触发告警 关键协同指标
- 传输错误
⚠️ 中危 出现即立即检查文件系统,数据存在丢失风险

在 Prom 中查询,带硬盘序列号

(smartctl_device_attribute{attribute_id="5",attribute_value_type="raw"} *
on(instance,device) group_left(serial_number,model_name,job) smartctl_device) > 0
(smartctl_device_attribute{attribute_id="173",attribute_value_type="value"} *
on(instance,device) group_left(serial_number,model_name,job) smartctl_device) < 80
(smartctl_device_attribute{attribute_id="233",attribute_value_type="value"} *
on(instance,device) group_left(serial_number,model_name,job) smartctl_device) < 80
(smartctl_device_attribute{attribute_id="184",attribute_value_type="raw"} *
on(instance,device) group_left(serial_number,model_name,job) smartctl_device) > 0

smartctl 命令查看

smartctl -A /dev/sda | awk '$1 ~ /^(5|9|173|233|9|187|ID)/ {print}'
  • Pre-fail 表示潜在故障风险
  • Old_age 表示正常老化指标

告警信息

groups:
- name: smartctl_disk_failure_alert
  rules:

  # 1. 坏道检测 - 重分配扇区计数
  - alert: HDD_Reallocated_Sectors_Critical
    expr: smartctl_device_attribute{attribute_id="5", attribute_value_type="raw"} > 0
    for: 5m
    labels:
      severity: critical
      category: storage
    annotations:
      summary: "硬盘物理坏道告警 (ID 5)"
      description: "{{ $labels.instance }} 的硬盘 {{ $labels.device }} 检测到物理坏扇区!\n序列号: {{ $labels.serial_number }}\n型号: {{ $labels.model_name }}\n当前值: {{ $value }} (大于0表示已触发备用扇区替换)\n处理建议: 立即备份数据并更换硬盘"

  # 2. SSD健康度 (磨损平衡)
  - alert: SSD_Wear_Leveling_Warning
    expr: smartctl_device_attribute{attribute_id="173", attribute_value_type="value"} < 80
    for: 30m
    labels:
      severity: warning
      category: storage
    annotations:
      summary: "SSD磨损健康度下降 (ID 173)"
      description: "{{ $labels.instance }} 的SSD {{ $labels.device }} 寿命低于80%\n序列号: {{ $labels.serial_number }}\n型号: {{ $labels.model_name }}\n当前值: {{ $value }}\n处理建议: 检查备用块计数,准备更换硬盘"

  # 3. SSD剩余寿命
  - alert: SSD_Remaining_Life_Warning
    expr: smartctl_device_attribute{attribute_id="233", attribute_value_type="value"} < 50
    for: 15m
    labels:
      severity: warning
      category: storage
    annotations:
      summary: "SSD剩余寿命不足 (ID 233)"
      description: "{{ $labels.instance }} 的SSD {{ $labels.device }} 剩余寿命低于50%\n序列号: {{ $labels.serial_number }}\n型号: {{ $labels.model_name }}\n当前值: {{ $value }}%\n处理建议: 企业级SSD应立即更换,消费级建议更换"

  # 4. 老化风险检测 (修复模板语法)
  - alert: Disk_Aging_Risk
    expr: smartctl_device_attribute{attribute_id="9", attribute_value_type="raw"} / (24 * 365) > 4
    for: 1h
    labels:
      severity: warning
      category: storage
    annotations:
      summary: "硬盘老化风险 (ID 9)"
      description: "{{ $labels.instance }} 的硬盘已连续工作超过4年!\n序列号: {{ $labels.serial_number }}\n型号: {{ $labels.model_name }}\n当前通电小时数: {{ $value | humanizeDuration | printf \"%.0f\" }}\n处理建议: 标记为高危设备,优先考虑替换"

  # 5. 物理冲击警告 (移除无效函数)
  - alert: Disk_Physical_Shock
    expr: smartctl_device_attribute{attribute_id="12", attribute_value_type="raw"} > 100
    for: 10m
    labels:
      severity: warning
      category: storage
    annotations:
      summary: "异常物理冲击 (ID 12)"
      description: "{{ $labels.instance }} 的硬盘 {{ $labels.device }} 检测到异常启停!\n序列号: {{ $labels.serial_number }}\n型号: {{ $labels.model_name }}\n总启停次数: {{ $value }}\n处理建议: 检查电源稳定性和物理振动源"

  # 6. 数据完整性风险
  - alert: Data_Integrity_Failure
    expr: smartctl_device_attribute{attribute_id="187", attribute_value_type="raw"} > 0
    for: 2m
    labels:
      severity: critical
      category: storage
    annotations:
      summary: "不可纠正数据错误 (ID 187)"
      description: "{{ $labels.instance }} 的硬盘 {{ $labels.device }} 检测到数据完整性损坏!\n序列号: {{ $labels.serial_number }}\n型号: {{ $labels.model_name }}\n错误计数: {{ $value }}\n处理建议: 立即运行文件系统检查,考虑更换硬盘"

  # 7. 温度过高告警 (修复正则语法)
  - alert: Disk_Overtemperature
    expr: >-
      (smartctl_device_attribute{attribute_id="194", attribute_value_type="value"} > 55 and
       smartctl_device_attribute{attribute_id="194", model_name=~".*HDD.*"})
      or
      (smartctl_device_attribute{attribute_id="194", attribute_value_type="value"} > 60 and
       smartctl_device_attribute{attribute_id="194", model_name=~".*SSD.*"})
    for: 10m
    labels:
      severity: warning
      category: storage
    annotations:
      summary: "硬盘温度异常 (ID 194)"
      description: "{{ $labels.instance }} 的硬盘 {{ $labels.device }} 温度过高!\n序列号: {{ $labels.serial_number }}\n型号: {{ $labels.model_name }}\n当前温度: {{ $value }}°C\n处理建议: 检查散热系统,改善机柜通风"

  # 8. 数据传输异常
  - alert: Data_Transfer_Error
    expr: smartctl_device_attribute{attribute_id="184", attribute_value_type="raw"} > 0
    for: 5m
    labels:
      severity: critical
      category: storage
    annotations:
      summary: "端到端数据校验失败 (ID 184)"
      description: "{{ $labels.instance }} 的硬盘 {{ $labels.device }} 数据传输完整性错误!\n序列号: {{ $labels.serial_number }}\n型号: {{ $labels.model_name }}\n错误计数: {{ $value }}\n处理建议: 检查数据线/背板连接,更换SATA线缆"