S.M.A.R.T.

来自 ArchWiki
(重定向自 Smartmontools

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 命令。

运行测试

设备可以执行三种类型的自检(所有自检对用户数据都是安全的)

  • Short(短):运行高概率检测设备问题的测试,
  • Extended 或 Long(扩展或长):测试与短检查相同,但没有时间限制,并进行完整的磁盘表面检查,
  • Conveyance(运输):识别设备在运输过程中是否受到损坏。
  • Selective(选择性):测试 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"

如果您正在运行桌面环境,您可能还希望在桌面上显示一个弹出窗口。在这种情况下,您可以使用此脚本(将 X_userX_userid 替换为运行 X 的用户和用户 ID) 

/usr/local/bin/smartdnotify
#!/bin/sh

sudo -u X_user DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/X_userid/bus 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

IFS=$'\n'
for LINE in `w -hs`
do
    USER=`echo $LINE | awk '{print $1}'`
    USER_ID=`id -u $USER`
    DISP_ID=`echo $LINE | awk '{print $8}'`
    sudo -u $USER DISPLAY=$DISP_ID DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$USER_ID/bus notify-send "S.M.A.R.T Error ($SMARTD_FAILTYPE)" "$SMARTD_MESSAGE" --icon=dialog-warning -u critical
done

此脚本需要 libnotifyprocps-ng 以及兼容的桌面环境。

您可以使用以下命令执行您的自定义脚本

/etc/smartd.conf
DEVICESCAN -m @smartdnotify

电源管理

如果您在电源管理控制下使用计算机,则应指示 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 列中的高值意味着磁盘对请求的响应速度不快,并且可能正在发生故障。

图形界面应用程序

  • DisKMonitor — 用于 KDE 监控 SMART 设备和 MDRaid 健康状态的工具。
https://github.com/papylhomme/diskmonitor || diskmonitorAUR
https://apps.gnome.org/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

参见