跳转至内容

S.M.A.R.T.

来自 ArchWiki
(从 Smartctl 重定向而来)

S.M.A.R.T. (Self-Monitoring, Analysis, and Reporting Technology,自我监控、分析和报告技术) 是许多现代存储设备内置的辅助组件,设备通过它监控、存储和分析其运行的健康状况。收集的统计数据(温度、重分配扇区数、寻道错误等)可以被软件用来衡量设备的健康状况,预测可能的设备故障,并提供关于不安全值的通知。

Smartmontools

smartmontools 包包含两个用于分析和监控存储设备的实用程序:smartctlsmartd,以及一个数据库更新实用程序 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

生成包含所有磁盘属性的表格

本文或本节需要在语言、wiki 语法或风格方面进行改进。请参阅 Help:Style 获取参考。

原因: Wiki 不是代码开发平台。长脚本应在其他地方维护。(在 Talk:S.M.A.R.T. 中讨论)
#!/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 包括 msmtpPostfix,但也许最简单的 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

这需要 libnotify 和兼容的 桌面通知服务器

您还可以将自定义脚本放入 /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

此脚本需要 libnotifyjq 和兼容的 桌面通知服务器

您可以执行自定义脚本(请记住使其 可执行)。

/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 示例

将以上所有内容组合起来,得到以下示例配置:

  • DEVICESCAN smartd 会扫描磁盘并监控它找到的所有磁盘。
  • -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 设备以监控和报告硬盘健康状况的实用程序。
https://0pointer.de/blog/projects/being-smart.html || libatasmart
  • iostat -x(来自 sysstat)也提供了一些磁盘健康指标:特别是,f_await 列中的高值意味着磁盘响应请求缓慢,并且可能正在故障。

GUI 应用程序

  • DisKMonitor — KDE 的工具,用于监控 SMART 设备和 MDRaid 健康状态。
https://github.com/papylhomme/diskmonitor || diskmonitorAUR
https://apps.gnome.org.cn/DiskUtility/ || gnome-disk-utility
  • GSmartControl — smartctl 的 GUI。它允许您检查驱动器的 SMART 数据以确定其健康状况,并对其运行各种测试。
https://gsmartcontrol.shaduri.dev/ || gsmartcontrol
  • Plasma Disks — KDE Plasma 的硬盘健康监控。是 plasma 的一部分。
https://invent.kde.org/plasma/plasma-disks/ || plasma-disks
  • QDiskInfo — smartctl 的前端。提供与 CrystalDiskInfo 类似的用户体验。
https://github.com/edisionnano/QDiskInfo || qdiskinfoAUR
  • scrutiny — smartd S.M.A.R.T. 监控的 WebUI。
https://github.com/AnalogJ/scrutiny || scrutinyAUR

故障排除

UAS 模式阻止 smartmontools 使用

在某些情况下,Linux 的 "uas" 驱动程序会禁用 SAT 传输,这会阻止 smartmontools(以及其他工具,例如 hdparm)与连接的 SATA 设备正确通信。有关解决方法,请参阅 https://www.smartmontools.org/wiki/SAT-with-UAS-Linux - 该方法会禁用 uas 模式或覆盖 NO_ATA_1X 标志,通过 usb-storage.quirks 设置,但风险自负。

参见