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"

如果您正在运行桌面环境,您可能还希望在桌面上显示一个弹出窗口。在这种情况下,您可以使用此脚本(将 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 的图形界面。它允许您检查驱动器的 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

参见