Featured image of post PVE 磁盘健康检测

PVE 磁盘健康检测

在 PVE 上用 smartctl 与 badblocks 判断硬盘健康:SMART 关键属性的解读标准、长测试与全盘扫描流程,以及坏道风险分级与换盘建议

PVE 磁盘健康检测

一、快速查看磁盘状态

1. SMART 检测

smartctl -A /dev/sdX     # 查看属性摘要
smartctl -H /dev/sdX     # 查看健康状态(PASSED/FAILED)

也可通过 PVE Web UI 查看:选中节点 → 磁盘 → 选择磁盘 → SMART 状态。若显示"未知",先在命令行启用:

smartctl -s on /dev/sdX

实际输出:smartctl -A /dev/sda

smartctl 7.3 2022-02-28 r5338 [x86_64-linux-6.8.12-25-pve] (local build)
Copyright (C) 2002-22, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   200   195   051    Pre-fail  Always       -       1
  3 Spin_Up_Time            0x0027   220   216   021    Pre-fail  Always       -       1983
  4 Start_Stop_Count        0x0032   098   098   000    Old_age   Always       -       2523
  5 Reallocated_Sector_Ct   0x0033   193   193   140    Pre-fail  Always       -       31424
  7 Seek_Error_Rate         0x002e   200   198   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   043   043   000    Old_age   Always       -       42059
 10 Spin_Retry_Count        0x0032   100   100   000    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   100   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   099   099   000    Old_age   Always       -       1594
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       365
193 Load_Cycle_Count        0x0032   010   010   000    Old_age   Always       -       572990
194 Temperature_Celsius     0x0022   096   092   000    Old_age   Always       -       51
196 Reallocated_Event_Count 0x0032   001   001   000    Old_age   Always       -       384
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   100   253   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0032   200   200   000    Old_age   Always       -       77

二、SMART 数据解读

判断标准VALUE 范围 1~253(越大越好),低于 THRESH 标记 FAILING_NOWRAW_VALUE 为原始计数值。

以下是关键属性说明,以及上面 smartctl -A /dev/sda 输出中对应的实际数据和风险评估:

ID 属性名 含义 实际值 警戒值 风险评估
5 Reallocated_Sector_Ct 已重映射扇区数 31424 > 0 需警惕,> 100 建议换盘 🚨 极高:备用区大量消耗
196 Reallocated_Event_Count 重映射事件次数 384 持续增长说明盘面加速劣化 ⚠️ 384 次,持续分批出现
197 Current_Pending_Sector 待稳定扇区 0 > 0 说明存在不稳定扇区 ✅ 正常
198 Offline_Uncorrectable 无法纠正的扇区 0 > 0 说明存在物理坏道 ✅ 正常
1 Raw_Read_Error_Rate 原始读取错误率 1 VALUE 持续下降说明磁头/盘面有问题 ✅ 正常
7 Seek_Error_Rate 寻道错误率 0 VALUE 大幅下降说明机械臂异常 ✅ 正常
9 Power_On_Hours 通电时间 42059 机械盘一般寿命 3~5 万小时 ~4.8 年
193 Load_Cycle_Count 磁头加载/卸载次数 572990 WD 盘额定约 30~60 万次 🚨 接近寿命极限
194 Temperature_Celsius 温度 51°C 建议 < 45°C,> 55°C 加速老化 ⚠️ 偏高

磁盘经历过大量坏道(3 万+),目前虽已被固件重映射、读写正常,但备用区消耗殆尽、负载周期接近寿命极限,健康状况堪忧

快查指令

smartctl -A /dev/sdX | grep -E "^(  5|197|198)"

# 5=0, 197=0, 198=0 → 良好
# 5>0, 197=0, 198=0 → 旧坏道已被重映射,看数量判断风险
#   个位数:可监控使用,两位数及以上:建议换盘,持续增长中:立即换盘
# 197>0 或 198>0  → 当前存在坏道,需处理

三、深入扫描检测

SMART 只是磁盘固件记录的日志,如果需要确认实际扇区状况,做深度的全盘扫描。

1. SMART 长测试

smartctl -t long /dev/sdX        # 提交测试,由磁盘固件后台执行,立即返回

查看测试结果:

smartctl -l selftest /dev/sdX    # 查看自检记录
smartctl -l error /dev/sdX       # 查看 I/O 错误日志

实际输出

# 提交长测试(耗时约 6 小时,后台执行,立即返回)
smartctl -t long /dev/sda

=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Execute SMART Extended self-test routine immediately in off-line mode".
Drive command "Execute SMART Extended self-test routine immediately in off-line mode" successful.
Testing has begun.
Please wait 371 minutes for test to complete.
Test will complete after Wed Jun  3 19:12:06 2026 CST
Use smartctl -X to abort test.
# 查看自检记录
smartctl -l selftest /dev/sda

=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed: read failure       90%     42079         1427497600
# 2  Extended offline    Completed: read failure       90%     42066         1427497600
# 查看 I/O 错误日志
smartctl -l error /dev/sda

=== START OF READ SMART DATA SECTION ===
SMART Error Log Version: 1
No Errors Logged

结果解读

  • #2(LifeTime 42066h) — 第一次测试,等了约 6 小时后查到的结果,Remaining 90% 说明测试仅执行了约 10% 就遇到读取错误并终止
  • #1(LifeTime 42079h) — 第二次提交后立即就查询到结果,因为同一 LBA 仍在报错,固件在相同位置再次中止测试
  • 同一 LBA(1427497600)两次测试均报错 — 确认该扇区存在可复现的物理缺陷,非偶发性
  • No Errors Logged — 自检发现的错误记录在 selftest 日志中,与 -l error(记录主机 I/O 层面的读写错误)是两套独立的日志;自检报错不代表一定有主机 I/O 错误

后续操作

# 确认重映射扇区数是否增加
smartctl -A /dev/sda | grep -E "^(  5|196|197|198)"

  5 Reallocated_Sector_Ct   0x0033   193   193   140    Pre-fail  Always       -       31424
196 Reallocated_Event_Count 0x0032   001   001   000    Old_age   Always       -       384
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   100   253   000    Old_age   Offline      -       0

重映射数未增加,所有属性值与初始检测时一致。说明:

  • 固件已知该 LBA 有问题(长测试两次确认),但未分配备用扇区进行重映射
  • 最可能的原因:备用区已耗尽(31424 个),无可用扇区
  • Current_Pending_Sector 仍为 0 是因为长测试报的是读取失败,而非等待重映射的待稳定状态,两者机制不同

2. badblocks 全盘扫描

逐扇区读写校验,是检测坏道最严格的手段(1TB 盘约 4~8 小时),耗时较长用 nohup 后台执行:

# 只读扫描(不破坏数据)
nohup badblocks -sv /dev/sdX > /root/badblocks-scan.log 2>&1 &

# 非破坏性读写扫描(写入→校验→恢复,更严格)
nohup badblocks -svn /dev/sdX > /root/badblocks-scan.log 2>&1 &
# 查看进度
tail -f /root/badblocks-scan.log

扫描结果

Checking for bad blocks in non-destructive read-write mode
From block 0 to 1953514583
Testing with random pattern: done
Pass completed, 0 bad blocks found. (0/0/0 errors)

全盘约 1TB 范围全部通过,零个坏块

3. smartctl 与 badblocks 的区别

两个工具检测的维度和方式完全不同:


smartctl badblocks
检测对象 磁盘固件记录的 SMART 日志和属性 实际的磁盘扇区
检测方式 读取磁盘内置的 SMART 数据(由磁盘固件持续记录) 逐扇区读写校验
能否发现已重映射的坏道 ✅ 能,从 Reallocated_Sector_Ct 看出历史累计量 ❌ 不能,坏道已被映射到备用区,读的是好数据
能否发现不稳定扇区 Current_Pending_Sector > 0 ✅ 读写不稳定会报错
执行速度 毫秒级(读固件数据) 数小时到数天(逐扇区扫描)
影响数据 只读,无影响 -n 模式无影响,-w 模式会破坏数据
主要用途 快速初筛、历史追踪、趋势分析 深度扫描、确认坏道位置、触发重映射

使用建议

  • 先用 smartctl -A 快速查看属性,几分钟就能做完初步判断
  • 如果 SMART 数据正常,一般不需要跑 badblocks
  • 如果 SMART 数据异常(Reallocated_Sector_Ct 高、Current_Pending_Sector > 0),再针对性地跑 badblocks 做深度扫描

FAQ

为什么 SMART 差但 badblocks 无坏道?

磁盘固件已将坏道重映射到备用区,badblocks 读的是备用扇区的好数据,因此不报错。

逻辑层(badblocks 看到的):
  LBA 0  → 正常读取
  LBA 1  → 正常读取
  LBA 2  → 被重映射 → 实际读取的是备用扇区 → 数据正常
  LBA 3  → 正常读取
  结论:所有 LBA 都能正常读写 → 0 bad blocks

物理层(盘面实际情况):
  LBA 2 对应的物理位置已损坏(坏道)
     ↓
  固件自动将 LBA 2 映射到盘片深处的备用区(G-List)
     ↓
  上层(包括 badblocks)读 LBA 2 → 去备用区读 → 一切正常
  • badblocks 工作在逻辑层,读的是 LBA。坏道已被重映射到备用区,它读到的是好数据,自然报 0
  • Reallocated_Sector_Ct 不可逆地记录磁盘一生中遇到过的所有物理缺陷
  • badblocks 通过不代表磁盘健康,必须结合 SMART 综合判断
badblocks 报出坏道的场景
情况 badblocks 结果
磁盘健康 0 bad blocks ✅
坏道已被固件重映射 0 bad blocks ⚠️(假阴性)
有不稳定扇区但未重映射 报出坏道
备用区已耗尽,新坏道无法重映射 报出坏道 🚨
综合判断

结合上面的数据综合评估:

指标 数据 结论
Reallocated_Sector_Ct 31424 🚨 备用区大量消耗
Reallocated_Event_Count 384 次 ⚠️ 持续分批出现,盘面加速劣化
Load_Cycle_Count 572990 🚨 接近设计寿命上限
Temperature 51°C ⚠️ 偏高,加速老化
Current_Pending_Sector 0 ✅ 当前无活跃坏道
badblocks 0 bad blocks ✅ 当前读写正常
Power_On_Hours 42059 约 4.8 年
SMART 长测试 两次 read failure 于同一 LBA(1427497600) 🚨 存在可复现的物理缺陷,且重映射数未增加
Reallocated_Sector_Ct(复查) 仍为 31424 🚨 备用区已耗尽,固件无法分配新扇区

结论:磁盘健康状况堪忧,建议尽快替换。 原因不是"当前有坏道"(已被固件挡住),而是备用区已消耗殆尽,一旦下一个坏道出现就可能导致数据丢失。