去年有一块盘,SMART 里 Current_Pending_Sector 从 0 变成 8。我当时看了眼「健康状态:良好」,就没管。两周后它开始掉盘,重建时又把另一块拖下水——那次之后我才认真读了 SMART 的字段说明。

硬盘的故障绝大多数不是瞬时的,是渐进的:坏道一点点扩散,磁头读写越来越吃力,重试次数越来越多。这些过程都会写进 SMART,只是默认没人看,或者看了也不知道该看哪几个数。

这篇只说有用的:8 个指标、三档处置、一套能直接跑的监控脚本。

一、先分清三种「坏」

不同故障类型,SMART 的价值完全不同:

故障类型 表现 SMART 能不能提前发现
渐进性坏道 读某些文件变慢、报 I/O 错误 能,提前几天到几周
磁头/电机衰减 异响、寻道变慢、重试增多 能,看错误计数增长
链路问题 掉盘、CRC 报错、速率协商降级 能,但容易误判成盘坏
电路板击穿 直接不识别 基本不能
固件锁死 突然变砖、容量异常 基本不能
断电/震动损伤 突然出现大量坏道 事后才能看到

所以 SMART 的定位是:管得住「慢慢坏」,管不住「突然死」。 这也是为什么它永远不能替代备份。

二、8 个真正该盯的指标

SATA 盘的属性有几十项,绝大多数是厂商自用、没有统一含义。下面这 8 个是跨品牌都有意义、且能直接指导动作的:

ID 名称 正常值 危险信号 说明
5 Reallocated_Sector_Ct 0 从 0 开始涨,短期到两位数 已用备用扇区替换的坏道数
187 Reported_Uncorrect 0 > 0 无法纠正的读写错误
197 Current_Pending_Sector 0 > 0 有扇区读不出来、等待重映射
198 Offline_Uncorrectable 0 > 0 离线扫描发现的不可纠正扇区
199 UDMA_CRC_Error_Count 0 或稳定 持续增长 链路错误,先怀疑线不是盘
194 Temperature_Celsius < 45℃ ≥ 50℃ 处理,≥ 55℃ 危险 盘体温度
9 Power_On_Hours — > 30000h 提高警惕 通电时长,寿命参考
193 Load_Cycle_Count — > 300000 磁头加载次数,频繁休眠的盘最容易被它耗死

几个必须说清的点:

197 是最急的那个。 它表示「有扇区现在读不出来,等着被重映射」。一旦大于 0,说明盘上已经有读不到的地方了,立刻备份,然后准备换盘,别等它涨。

5 要看增长,不看绝对值。 有些盘出厂就带几个,多年不涨,那是出厂测试留下的,不用管。真正危险的是从 0 开始涨,而且涨得快——那说明坏道在扩散。

199 是最容易被误判的那个。 CRC 错误九成不是盘的问题:SATA 线老化、接口氧化、背板接触不良、机箱震动导致瞬时断开,都记在这里。处置顺序是换线 → 换接口 → 换盘位 → 还涨才怀疑盘。我上次那 2 个 CRC,换根线就停了。

193 是被忽略的那个。 硬盘频繁休眠唤醒,磁头反复加载,这个数会飞快地涨。西数某些型号有过「LCC 门」,几十万次之后磁头就废了。NAS 上如果设了「硬盘休眠」,又跑着定时任务天天唤醒,等于慢性自杀——要么真休眠,要么别设。

三、趋势比绝对值重要

单次快照只能告诉你「现在怎么样」,判断不了「正在往哪走」。

我的做法很简单:每小时把所有盘的关键值追加到一行文本里,比对上一轮,只有变了才告警。这样既不会被 24 小时重复推送淹没,也不会漏掉变化。

理想情况下你会看到这样的曲线:

1
2
3
4
5   重映射: 0 → 0 → 0 → 2 → 2 → 8 → 47      ← 危险,坏道在扩散
197 待映射: 0 → 0 → 0 → 0 → 1 → 1 → 3 ← 立刻备份
199 CRC : 0 → 2 → 2 → 2 → 2 → 2 ← 换线后停止,安全
194 温度: 38 → 39 → 41 → 44 → 47 → 49 ← 该清灰/加风扇了

四、绿黄红三档处置

不要一看到数字不对就慌,也不要一直「再观察观察」。定死标准:

绿:全部为 0,温度正常。 什么都不用做,每月看一次趋势。

黄:出现以下任一,开始准备。

  • 重映射或不可纠正有小数值,但三个月不增长;
  • CRC 增长过一次,换线后停止;
  • 温度长期 48-52℃;
  • 通电时长超过 5 年(约 44000 小时)。

动作:下一块替换盘加进购物车,异地备份改成每周一次,SMART 检测频率从每月改成每周。

红:出现以下任一,立刻行动。

  • 197 或 198 大于 0;
  • 重映射在两周内明显增长(比如 2 → 20);
  • SMART 自检失败(Self-test execution status 报错);
  • 温度持续 ≥ 55℃ 且降不下来;
  • 出现异响(咔哒、刮擦声)。

动作:先备份,再换盘。 顺序不能反——先拔盘再备份,等于把唯一一份数据放在一块正在坏的盘上。

五、自动化:一条脚本 + 计划任务

群晖上先确认有没有 smartctl:

1
which smartctl || echo "需要装 SynoCommunity 的 smartmontools 包"

脚本放在 /volume1/scripts/smart-watch.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/bash
# 每小时跑一次:只在关键指标「比上次变了」时推送
set -u
TG_TOKEN="${TG_TOKEN:-}"
TG_CHAT="${TG_CHAT:-}"
STATE=/volume1/scripts/.smart-state
TEMP_MAX=50

say() {
if [ -z "$TG_TOKEN" ]; then echo "$1"; return; fi
curl -s --max-time 10 \
"https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
-d chat_id="$TG_CHAT" --data-urlencode "text=$1" >/dev/null
}

NEW=$(mktemp)
for dev in /dev/sata* /dev/sd?; do
[ -b "$dev" ] || continue
out=$(smartctl -H -A "$dev" 2>/dev/null) || continue
model=$(echo "$out" | sed -n 's/^Device Model:[[:space:]]*//p' | head -1)
[ -z "$model" ] && model=$(echo "$out" | sed -n 's/^Model Family:[[:space:]]*//p' | head -1)

val() { echo "$out" | awk -v id="$1" '$1==id {print $10; exit}'; }

realloc=$(val 5); pending=$(val 197); uncorr=$(val 187)
crc=$(val 199); temp=$(val 194); lcc=$(val 193)

tips=""
[ "${realloc:-0}" -gt 0 ] 2>/dev/null && tips="$tips 重映射=${realloc}"
[ "${pending:-0}" -gt 0 ] 2>/dev/null && tips="$tips 待映射=${pending}"
[ "${uncorr:-0}" -gt 0 ] 2>/dev/null && tips="$tips 不可纠正=${uncorr}"
[ "${crc:-0}" -gt 0 ] 2>/dev/null && tips="$tips CRC=${crc}"
[ -n "${temp:-}" ] && [ "$temp" -ge "$TEMP_MAX" ] 2>/dev/null && tips="$tips 温度=${temp}C"

cur="${realloc:-0}/${pending:-0}/${crc:-0}"
prev=$(grep -F "$dev " "$STATE" 2>/dev/null | awk '{print $2}')

if [ -n "$tips" ] && [ "$cur" != "$prev" ]; then
say "⚠️ $(hostname) $dev $model:$tips"
fi
echo "$dev $cur" >> "$NEW"
done
mv "$NEW" "$STATE"

配上环境变量(Token 别写在脚本里):

1
2
export TG_TOKEN="123456:ABC..."
export TG_CHAT="你的 chat id"

群晖上不要直接改 /etc/crontab(重启会丢),用控制面板 → 任务计划 → 新增 → 计划的任务 → 用户定义的脚本,用户选 root,计划每小时,命令填:

1
TG_TOKEN=xxx TG_CHAT=yyy /bin/bash /volume1/scripts/smart-watch.sh

跑之前先手动执行一遍,看有没有语法错误,再等一小时确认能收到推送。

六、群晖自带的能力别浪费

脚本管趋势,DSM 管检测,两边都要开:

  1. 存储管理器 → HDD/SSD → 选盘 → 健康信息:看属性、看历史曲线,比脚本直观;
  2. 存储管理器 → 设置 → 计划 SMART 检测:快速检测每周一次,扩展检测每月一次(扩展检测会占 IO,放凌晨);
  3. 存储池 → 数据清理计划:Btrfs 建议每月一次,能提前发现静默损坏;
  4. 控制面板 → 通知设置:把「存储空间/硬盘警告」的邮件或推送打开,别只留一个网页红点。

七、五个误报和坑

  1. USB 硬盘盒读不到 SMART。 加 -d sat 参数(smartctl -d sat -A /dev/sdb),桥接芯片不支持就只能靠系统日志判断。
  2. 休眠的盘会被唤醒。 脚本每小时跑一次会让盘永远不睡。要么接受(本来也不建议 NAS 休眠),要么加 -n standby 让它在休眠时直接跳过。
  3. 群晖设备名会变。 新 DSM 是 /dev/sata1..N,老版本是 /dev/sdX;加了盘或换了盘位,顺序可能变。脚本里用 [ -b ] 过滤是对的,但告警里务必带设备名和型号,别只看编号。
  4. NVMe 的指标完全不同。 固态没有重映射扇区,要看 Percentage Used(磨损百分比)、Available Spare(剩余备用块)、Media and Data Integrity Errors(介质错误)。拿 SATA 那套去套 NVMe 会得出错误结论。
  5. SMR 盘重建慢不等于快坏了。 重建时间异常长、写入掉到几 MB/s,先查型号是不是 SMR,别急着判死。

八、这套东西的实际价值

配好之后,我收到的第一次告警是温度:一块盘在夏天连续三天 51℃。清了一次灰、加了个 12cm 风扇,降到 43℃。

第二次是 CRC 增长——换线,停止。

第三次是 197 出现。那次我按流程先备份、再换盘,全程没丢数据。这就是 SMART 的意义:它不阻止硬盘坏,它让「坏」变成一件有时间准备的事。

如果你的 NAS 里还只有 RAID 没有异地备份,先去把那件事补上:RAID 挡不住误删和勒索,SMART 也挡不住。两篇配合着看,才算把「硬盘会坏」这件事处理完。

常见问题

SMART 全部正常,硬盘就不会坏吗?

不能保证。SMART 能覆盖的是渐进性故障(坏道扩散、磁头衰减、电机异常),对电路板击穿、固件锁死、突然断电导致的损坏基本没有预警。行业里的经验是 SMART 能提前发现约一半到七成的机械故障,所以它只是预警系统的一层,异地备份才是最后那道保险。

重映射扇区是 0 就一定安全?

数值为 0 是好事,但要看历史。有些盘出厂时就带几个重映射(厂内测试留下的),一直不增长就没问题;真正危险的是「从 0 开始涨」,尤其是短期涨到两位数。所以看 SMART 不能只看快照,要留历史记录看斜率。

UDMA CRC 错误一直涨,是不是硬盘要坏了?

多数情况不是盘,是链路:SATA 线老化、接口氧化、背板接触不良、机箱震动导致接触瞬间断开。处置顺序是先换线、换接口、换盘位,再看数值是否停止增长。如果换了线还在涨,才怀疑盘侧的接口电路。

群晖自带的 SMART 检测够用吗?

检测够用,告警不够用。DSM 的存储管理器能看到属性和历史曲线,也能设定计划检测和邮件通知,但它不会替你判断「这个数字在涨」。建议用它做定期检测,用一条自己写的脚本做趋势比对和推送——两条腿走路。

硬盘温度多少算高?

机械盘长期高于 50℃ 就该处理,55℃ 以上属于危险区。注意 SMART 读的是盘体温度,机箱风道差、盘位挤在一起时,盘体可能比环境高 10-15℃。降温的性价比顺序是:加风扇 > 拉开盘间距 > 降低转速 > 换机箱。

微信扫码关注公众号 Rhua NAS
跑不通,或者你机器上表现不一样?

每台机器的系统版本、权限、磁盘布局都不一样,文章里的命令不一定一次就对。踩坑了直接邮件问我,我看到会回。

邮件聊看全部折腾记录