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 命令。
运行测试
设备可以执行三种类型的自检(所有自检对用户数据都是安全的)
- 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
生成包含所有磁盘属性的表格
#!/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"
如果您正在运行桌面环境,您可能还希望在桌面上弹出一个窗口。在这种情况下,您可以使用此脚本(将 X_user
和 X_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
您还可以将您的自定义脚本放入 /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
此脚本需要 libnotify 和 procps-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 设备以监控和报告硬盘驱动器健康状况的实用程序。
iostat -x
(来自 sysstat)也提供一些磁盘健康指标:特别是,f_await
列中的高值意味着磁盘对请求的响应速度不快,并且可能正在发生故障。
图形界面应用
- DisKMonitor — 用于 KDE 的工具,用于监控 SMART 设备和 MDRaid 健康状态。
- GNOME 磁盘 — GNOME 前端,它使用 libatasmart 来监控和报告硬盘驱动器健康状况。是 gnome 的一部分。
- GSmartControl — smartctl 的 GUI。它允许您检查驱动器的 SMART 数据以确定其健康状况,并对其运行各种测试。
- Plasma 磁盘 — 用于 KDE Plasma 的硬盘健康状况监控。是 plasma 的一部分。
- QDiskInfo — smartctl 的前端。提供类似于 CrystalDiskInfo 的用户体验。
- scrutiny — 用于 smartd S.M.A.R.T 监控的 WebUI。