启用 smartd 的定期 self-test 和通知服务
smartd 是用来定期轮询硬盘的 SMART 状态,记录错误并发送通知的服务。启用 SMART 定期测试和通知能让我们更早发现硬盘上潜在的故障。

smartd.conf 配置格式

smartd.conf 的格式是每行一个设备;每行开头是设备名,后面跟着用于该设备的参数。如:

/dev/sda -n standby -m root -M exec /usr/share/smartmontools/smartd-runner

其中,设备名可以用 DEVICESCAN 代替。 DEVICESCAN 会扫描未被单独配置的所有硬盘,并把本行指定的参数应用到这些硬盘上。另外,DEVICESCAN 应该是最后一行有效配置,后面的配置都会被 smartd 忽略。

我现在不需要对每块硬盘单独配置,所以只需要一行 DEVICESCAN -d removable. 这里的 -d removable 让 smartd 在硬盘消失时不会报错。

其它的参数中, -n standby 用于忽略 standby 状态(停转)的磁盘(我们不希望为了读取 SMART 状态把停转的硬盘唤醒起来); -m root 指定通知邮件的收件人为 root; -M exec /usr/... 指定了用于发送邮件的命令。

打开定期 short self-test

SMART short self-test 是硬盘自带的 self test, 具体的实现细节是由硬盘固件决定的。但根据规范,一般包含以下部分:

  1. 对电路部分的测试:包括缓存 RAM, 读写电路。
  2. 寻道测试:检测能不能正确寻道。
  3. 局部读取测试:检测能不能完成数据读取。

定期运行 short self-test 有助于我们及时发现故障的硬盘。

在 smartd.conf 中, self-test 由 -s 开关控制。具体的格式为:

-s T/MM/DD/d/HH

其中:

  • T 是测试类型,S 是 short, L 是 long.
  • MM/DD/d/HH 是月、日、星期几、小时。

这串参数是正则格式,所以如果我们要每周测试一次,就可以写成:

S/../../1/00

其中 . 在正则里面是匹配任意字符,把它放在 MM/DD 字段,意为匹配任意月份和日期,1 是星期一, 00 是 0 点;也就是在每周一 0 点运行 short self test.

使用 HTTP API 发送通知

默认的通知是基于邮件的,需要配置 MTA, 很复杂。不过 smartd 提供了插件机制来自定义通知。

smartd 的插件机制会在收件人 -m 参数设置为 @<plugin> 时,去调用 smartd_warning.d/<plugin> 命令来发送通知,而不会去调用邮件。 smartd_warning.d/ 目录的路径在不同发行版上可能不一样。在 debian 上,完整路径是 /etc/smartmontools/smartd_warning.d/.

我这里用 pushover 来发送通知,使用的脚本是:

#!/bin/sh
curl -X POST https://api.pushover.net/1/messages.json -d token=<token> -d user=<receiver_user_id> -d title="SMART ${SMARTD_FAILTYPE}: ${SMARTD_DEVICE}" -d message="${SMARTD_MESSAGE}" < /dev/null > /dev/null

放置在 smartd_warning.d/pushover. 对应的 -m 参数为 -m @pushover. 当然,不要忘记给 smartd_warning.d/pushover 文件添加 x 权限。

完整的 smartd.conf 配置为:

DEVICESCAN -d removable -n standby -m @pushover -M exec /usr/share/smartmontools/smartd-runner -s S/../../1/00

测试通知

为了检测通知能不能正确发送出去,我们需要测试一下。 smartd 提供了 -M test 参数来在启动的时候发送一条测试通知。把配置改成:

DEVICESCAN -d removable -n standby -m @pushover -M exec /usr/share/smartmontools/smartd-runner -M test -s S/../../1/00

重启 smartd.service, 就应该能收到标题为 SMART EmailTest: /dev/sda 的通知。测试完成后,可以把 -M test 删掉。


最后修改于 2025-08-17