配置smartmontools监控硬盘状态

需求

前几天偶然发现服务器的ZPOOL已经DEGRADED了,再一查:

smartctl -a /dev/sda

不看不知道,一看吓一跳,已经有17个错误记录了。最后一条错误记录已经是十个月前,还好撑到现在,赶紧做了备份。

不过也可以理解,毕竟这块硬盘的通电时间已经长达5年3个月了,寿命也差不多了。

为了防范这种风险,还是得把硬盘状态监控起来。

smartmontools配置

基本配置可以参考使用 smartmontools 查看硬盘的健康状态

先在/etc/default/smartmontools里启用服务:

start_smartd=yes
smartd_opts="--interval=7200"  # 指定间隔时间

然后在/etc/smartd.conf里配置一条测试记录:

/dev/sda -m [email protected] -M test
  • -m: 接收告警信息的邮箱
  • -M: 消息类型,test表示测试,在重启服务时会发一封测试邮件

然后重启smartd:

systemctl restart smartd

正常应该可以收到一封测试邮件。但是难免会有不正常的情况,见后文说明。

常规的配置类似这样:

/dev/sda -a -d sat -o on -S on -s (S/../.././02|L/../../6/03) -m [email protected]
  • -a: 所有smart信息
  • -d sat: 磁盘类型为SATA
  • -o on: 启用smart
  • -S on: 启用属性自动保存
  • -s: 检测周期,格式为:测试类型/月/日/星期/时,可以有多个,用“|”隔开,其中类型S为短测试,L为长测试,用“.”表示所有值,几个点表示几位,其中只有星期是一位的,其它都是两位,可以用“[1-5]”表示范围。

其中-a等参数就是smartctl命令的参数。

邮件不能正常发送的问题处理

smartmontools的告警发送在默认情况下是执行这个命令/usr/share/smartmontools/smartd-runner,而这个命令的内容其实很简单,就是通过run-parts命令去执行这个路径下的所有命令:/etc/smartmontools/run.d/,这其中默认的只有一个命令:10mail,内容是调用系统默认的邮件工具发送邮件,如果没有安装就发不了,建议安装mailx或mailutils。

试了一下,安装了这两个东西,也还是发不了,不知道是不是因为它们需要本机有SMTP服务器,那个装起来就麻烦了,所以我参考旧文《通过命令行发送邮件的两种方法》安装了一个s-nail来发。

不过因为10mail里是调用mail命令的,所以还需要做一个符号链接:

sudo ln -s /usr/bin/s-nail /usr/bin/mail

当然,最重要的还是在root用户下配置一个/root/.mailrc,在其中填好有效的外部SMTP服务器配置:

set from="username <[email protected]>"
set smtp-use-starttls
set mta=smtp://smtp.yourserver.com:587
set smtp-auth=login
set smtp-auth-user="sender"
set smtp-auth-password="password"

这样smartmontools就可以正常发出邮件了。

现在知道了这个原理,如果你想用其它方式发送告警,比如Telegram机器人推送,也可以仿照10mail写一个脚本来实现。

还有另一个方法就是-M exec <执行命令>,这个就是直接用自己的命令替换掉默认的操作。

推送到[go4pro.org]