S.M.A.R.T.
S.M.A.R.T. (Self-Monitoring, Analysis, and Reporting Technology,自我监控、分析和报告技术) 是许多现代存储设备内置的辅助组件,设备通过它监控、存储和分析其运行的健康状况。收集的统计数据(温度、重分配扇区数、寻道错误等)可以被软件用来衡量设备的健康状况,预测可能的设备故障,并提供关于不安全值的通知。
Smartmontools
smartmontools 包包含两个用于分析和监控存储设备的实用程序:smartctl 和 smartd,以及一个数据库更新实用程序 update-smart-drivedb。
要使用这些工具,请 安装 smartmontools 包。
要有效使用这些工具,必须在每个存储设备上可用并启用 SMART 支持。您可以使用 #smartctl 来检查和启用 SMART 支持。完成此操作后,您可以手动 #运行测试 和 #查看测试结果,或者使用 #smartd 来自动运行测试和发送电子邮件通知。
smartctl
smartctl 是一个命令行工具,它“控制内置于大多数 ATA/SATA 和 SCSI/SAS 硬盘及固态硬盘中的自我监控、分析和报告技术 (SMART) 系统。”
-i/--info 选项会打印关于设备的各种信息,包括 SMART 是否可用和已启用。
# smartctl --info /dev/sda | grep 'SMART support is:'
SMART support is: Available - device has SMART capability. SMART support is: Enabled
如果 SMART 可用但未启用,您可以启用它。
# smartctl --smart=on /dev/device
您可能需要指定设备类型。例如,指定 --device=ata 会告知 smartctl 设备类型是 ATA,这可以防止 smartctl 向该设备发出 SCSI 命令。
运行测试
设备可以执行三种类型的自检(对用户数据均安全):
- 短测试:运行最有可能检测到设备问题的测试。
- 扩展测试或长测试:与短测试相同,但没有时间限制,并对整个磁盘表面进行检查。
- 运输测试:识别设备在运输过程中是否受到损坏。
- 选择性测试:测试一系列 LBA(读取 smartctl(8) § t 获取更多信息)。
-c/--capabilities 标志会打印出设备支持哪些测试以及每个测试的近似执行时间。例如:
# smartctl -c /dev/sda
... Short self-test routine recommended polling time: ( 1) minutes. Extended self-test routine recommended polling time: ( 74) minutes. Conveyance self-test routine recommended polling time: ( 2) minutes. ...
使用 -t/--test=test_name 标志来运行测试。
# smartctl -t short /dev/device # smartctl -t long /dev/device # smartctl -t conveyance /dev/device # smartctl -t select,123+345 /dev/device
查看测试结果
您可以使用 -H 标志查看设备的整体健康状况。“如果设备报告健康状态不佳,这意味着设备已经损坏,或者它预测在接下来的 24 小时内会发生故障。如果发生这种情况……尽快将您的数据移出磁盘并移至安全的地方。”
# smartctl -H /dev/device
您还可以查看最近的测试结果列表和设备的详细信息。
# smartctl -l selftest /dev/device # smartctl -x /dev/device
生成包含所有磁盘属性的表格
#!/bin/bash
function drives_csv {
declare -A drive_values
for d in `smartctl --scan -d scsi | cut -d' ' -f1`; do
drive_values["-Drive-----------------"]="${drive_values[-Drive-----------------]},$d"
for l in `smartctl -A $d | grep ATTRIBUTE_NAME -A30 | grep -v ATTRIBUTE_NAME | column -H1,3,4,5,6,7,8,9,11,12,13,14,15 -t -o, | sed 's/ //g'`; do
key=`echo $l | cut -d',' -f1`
value=`echo $l | cut -d',' -f2`
existing=${drive_values["$key"]}
drive_values["${key}"]="${existing},${value}"
#~ echo "${key},${drive_values[$key]}"
done
done
for key in "${!drive_values[@]}"; do
echo "${key}${drive_values[$key]}"
done | sort
}
drives_csv | column -s, -t
smartd
smartd 守护进程监控 SMART 状态并在出现问题时发出通知。它可以通过 systemd 进行管理,并使用 /etc/smartd.conf 配置文件进行配置。配置文件语法比较晦涩,本 wiki 页面仅提供快速参考。有关更完整的信息,请阅读配置文件中的示例和注释,或阅读 smartd.conf(5)。
守护进程管理
要启动守护进程、检查其状态、使其在系统启动时自动启动并读取最近的日志文件条目,只需 启动/启用 smartd.service systemd 单元即可。
定义要监控的设备
要监控所有磁盘上所有可能的 SMART 错误,必须在配置文件中添加以下设置。
/etc/smartd.conf
DEVICESCAN -a
请注意,这是 smartd 的默认配置,并且 -a 参数(这是默认参数)可以省略。
要监控 /dev/sda 和 /dev/sdb 上所有可能的 SMART 错误,并忽略所有其他设备。
/etc/smartd.conf
/dev/sda -a /dev/sdb -a
要监控所有外部连接磁盘(例如 USB 备份磁盘)的所有可能的 SMART 错误,最好使用 持久化块设备命名。
/etc/smartd.conf
/dev/disk/by-uuid/820cdd8a-866a-444d-833c-1edb0f4becac -a
请注意,您可能还需要 -d removable 才能使 smartd 正常工作。
现在,即使在重启过程中 /dev/sdX 路径发生变化,您的 USB 磁盘也会被监控。
通知潜在问题
要在发生故障或新错误时发送电子邮件,请使用 -m 选项。
/etc/smartd.conf
DEVICESCAN -m address@domain.com
要能够发送外部电子邮件(即发送到非 root 邮件帐户),需要安装和配置 MTA(邮件传输代理)或 MUA(邮件用户代理)。常见的 MUA 包括 msmtp 和 Postfix,但也许最简单的 dma 就足够了。常见的 MTA 是 sendmail 和 Postfix。如果您不需要其他功能,仅配置 S-nail 就足够了,但您需要遵循 这些说明。
-M test 选项会在每次 smartd 守护进程启动时发送一封测试电子邮件。
/etc/smartd.conf
DEVICESCAN -m address@domain.com -M test
电子邮件可能需要很长时间才能送达。为确保在硬盘发生故障时立即收到警告,您还可以定义一个脚本,在发送电子邮件的同时执行。
/etc/smartd.conf
DEVICESCAN -m address@domain.com -M exec /usr/local/bin/smartdnotify
要发送电子邮件和系统通知,请在 /usr/local/bin/smartdnotify 中添加类似以下内容:
#!/bin/sh # Send email echo "$SMARTD_MESSAGE" | mail -s "$SMARTD_FAILTYPE" "$SMARTD_ADDRESS" # Notify user wall "$SMARTD_MESSAGE"
如果您运行的是桌面环境,您可能还希望在桌面上显示一个弹出窗口。在这种情况下,您可以使用此脚本(将 user 替换为用户名)。
/usr/local/bin/smartdnotify
#!/bin/sh systemd-run --machine=user@.host --user notify-send "S.M.A.R.T Error ($SMARTD_FAILTYPE)" "$SMARTD_MESSAGE" --icon=dialog-warning -u critical
您还可以将自定义脚本放入 /usr/share/smartmontools/smartd_warning.d/。
此脚本通过 libnotify 通知系统中所有已登录的用户。
/usr/share/smartmontools/smartd_warning.d/smartdnotify
#!/bin/sh for users in $(loginctl list-users --json short | jq -r '.[].user') ; do systemd-run --machine="$users"@.host --user notify-send "S.M.A.R.T Error ($SMARTD_FAILTYPE)" "$SMARTD_MESSAGE" --icon=dialog-warning -u critical done
此脚本需要 libnotify、jq 和兼容的 桌面通知服务器。
您可以执行自定义脚本(请记住使其 可执行)。
/etc/smartd.conf
DEVICESCAN -m @smartdnotify
电源 management
如果您使用的是受电源管理控制的计算机,则应指导 smartd 如何处理低功耗模式下的磁盘。通常,响应 smartd 发出的 SMART 命令,磁盘盘片会旋转起来。因此,如果未使用此选项,则当 smartd 定期轮询时,处于低功耗模式的磁盘可能会被旋转起来并进入更高功耗模式。
/etc/smartd.conf
DEVICESCAN -n standby,15,q
更多信息请访问 smartmontools wiki。
在某些设备上,-n 不起作用。您会在 syslog 中看到以下错误消息:
# journalctl -u smartd
CHECK POWER MODE: incomplete response, ATA output registers missing Device: /dev/sdb [SAT], no ATA CHECK POWER STATUS support, ignoring -n Directive
作为替代,您可以使用 smartd 的 -i 选项。它控制 smartd 旋转磁盘以检查其状态的频率。默认值为 30 分钟。要更改它,请编辑 /etc/conf.d/smartd。
/etc/conf.d/smartd
SMARTD_ARGS="-i 10800" Check status every 10800 seconds (3 hours)
有关更多信息,请参阅 smartd(8)。
安排自检
smartd 可以在计划内让磁盘执行自检。以下 /etc/smartd.conf 配置将在每天凌晨 2-3 点之间启动一个短自检,并在每周六凌晨 3-4 点之间启动一个扩展自检。
/etc/smartd.conf
DEVICESCAN -s (S/../.././02|L/../../6/03)
温度变化告警
smartd 可以跟踪磁盘温度,并在温度过快升高或达到上限时发出告警。以下配置将记录 4 度或更高的温度变化,在温度达到 35 度时记录,并在温度达到 40 度时记录/发送电子邮件警告。
/etc/smartd.conf
DEVICESCAN -W 4,35,40
- 您可以通过命令
smartctl -A /dev/device | grep Temperature_Celsius查看当前磁盘温度。 - 如果您的某些磁盘比其他磁盘运行温度高/低很多,请删除
DEVICESCAN并为每个设备定义单独的配置,并设置适当的温度设置。
完整的 smartd.conf 示例
将以上所有内容组合起来,得到以下示例配置:
DEVICESCANsmartd 会扫描磁盘并监控它找到的所有磁盘。-a监控所有属性。-o on启用自动脱机数据收集。-S on启用自动属性自动保存。-n standby,q检查磁盘是否处于待机状态,并抑制对此的日志消息,以免导致磁盘写入。-s ...安排短测试和长测试。-W ...监控温度。-m ...邮件告警。
/etc/smartd.conf
DEVICESCAN -a -o on -S on -n standby,q -s (S/../.././02|L/../../6/03) -W 4,35,40 -m username-or-email
update-smart-drivedb
此实用程序从 smartmontools 源代码存储库下载最新版本的 drivedb.h,以便能够识别新驱动器及其参数。
下载的文件可以替换位于 /usr/share/smartmontools/drivedb.h 的默认文件,它是一个纯文本文件,包含每个驱动器的逗号分隔值。
如果您的驱动器尚未被识别,可以 提交给上游。
有关完整的命令行选项,请参阅 update-smart-drivedb(8)。
控制台应用程序
- skdump — 监控和管理 SMART 设备以监控和报告硬盘健康状况的实用程序。
iostat -x(来自 sysstat)也提供了一些磁盘健康指标:特别是,f_await 列中的高值意味着磁盘响应请求缓慢,并且可能正在故障。
GUI 应用程序
- DisKMonitor — KDE 的工具,用于监控 SMART 设备和 MDRaid 健康状态。
- GNOME Disks — GNOME 前端,使用 libatasmart 来监控和报告硬盘健康状况。是 gnome 的一部分。
- GSmartControl — smartctl 的 GUI。它允许您检查驱动器的 SMART 数据以确定其健康状况,并对其运行各种测试。
- Plasma Disks — KDE Plasma 的硬盘健康监控。是 plasma 的一部分。
- QDiskInfo — smartctl 的前端。提供与 CrystalDiskInfo 类似的用户体验。
- scrutiny — smartd S.M.A.R.T. 监控的 WebUI。
故障排除
UAS 模式阻止 smartmontools 使用
在某些情况下,Linux 的 "uas" 驱动程序会禁用 SAT 传输,这会阻止 smartmontools(以及其他工具,例如 hdparm)与连接的 SATA 设备正确通信。有关解决方法,请参阅 https://www.smartmontools.org/wiki/SAT-with-UAS-Linux - 该方法会禁用 uas 模式或覆盖 NO_ATA_1X 标志,通过 usb-storage.quirks 设置,但风险自负。