blk_update_request:严重介质错误,但 hdparm 成功

blk_update_request:严重介质错误,但 hdparm 成功

很抱歉发了这么长的帖子;简而言之,我收到了几个“严重介质错误”消息dmesg,但hdparm可以正常读取受影响的扇区。这是怎么回事?!

请继续阅读以了解所有血腥细节。

今天我将一台 Dell H310(编辑:刷新至 IT 模式)放入我的家用服务器,使用 SAS-SATA 电缆连接硬盘,启动后不久(没有任何复杂情况),我看到控制台上出现以下错误:blk_update_request: critical medium error, dev sdc, sector 440819800。我立即感到担忧,登录并检查dmesg,发现以下令人恐慌的行:

[3868.082497] mpt2sas_cm0:log_info(0x31080000):发起者(PL),代码(0x08),子代码(0x0000)
[3868.082516] mpt2sas_cm0:log_info(0x31080000):发起者(PL),代码(0x08),sub_code(0x0000)
[3868.082526] mpt2sas_cm0:log_info(0x31080000):发起者(PL),代码(0x08),子代码(0x0000)
[3868.082534] mpt2sas_cm0:log_info(0x31080000):发起者(PL),代码(0x08),子代码(0x0000)
[3868.082541] mpt2sas_cm0:log_info(0x31080000):发起者(PL),代码(0x08),子代码(0x0000)
[3868.082549] mpt2sas_cm0:log_info(0x31080000):发起者(PL),代码(0x08),子代码(0x0000)
[3868.082652] sd 2:0:2:0:[sdc] 标签#3 失败 结果:hostbyte = DID_OK driverbyte = DRIVER_SENSE
[3868.082665] sd 2:0:2:0: [sdc] 标签#3 感知键:中等错误 [当前]
[ 3868.082676] sd 2:0:2:0: [sdc] 标签#3 添加。感知:未恢复的读取错误
[3868.082688]sd 2:0:2:0:[sdc] 标签#3 CDB:读取(10)28 00 1a 46 5b 00 00 05 80 00
[3868.082696] blk_update_request:严重介质错误,dev sdc,扇区 440819800
[3872.487468] mpt2sas_cm0:log_info(0x31080000):发起者(PL),代码(0x08),子代码(0x0000)
[3872.487484] mpt2sas_cm0:log_info(0x31080000):发起者(PL),代码(0x08),子代码(0x0000)
[3872.487559] sd 2:0:2:0:[sdc] 标签#1 失败 结果:hostbyte = DID_OK driverbyte = DRIVER_SENSE
[3872.487571] sd 2:0:2:0: [sdc] 标签#1 感知键:中等错误 [当前]
[ 3872.487590] sd 2:0:2:0: [sdc] 标签#1 Add. Sense: 未恢复的读取错误
[3872.487601]sd 2:0:2:0:[sdc]标签#1 CDB:读取(10)28 00 1a 46 60 58 00 00 08 00
[3872.487610] blk_update_request:严重介质错误,dev sdc,扇区 440819800

知道足够多的信息以致于很危险(并且假设错误消息中的“dev sdc”表示/dev/sdc),我尝试使用以下命令读取该扇区hdparm

root@home:~# hdparm --read-sector 440819800 --direct /dev/sdc

/dev/sdc:
读取扇区 440819800:成功

hdparm -a /dev/sdc告诉readahead, 并且是256(我猜是扇区)。我不想从 256 次以上的连续调用的输出中挑选hdparm,所以我写了一个小脚本来读取所谓坏块两侧的 512 个扇区:

错误扇区=440819800
startfromsector=$((${erroringsector} - 512))
对于 $(seq 0 1024) 中的 x
当前扇区=$((${起始扇区} + ${x}))
状态 = $ (hdparm --read-sector $((${currentsector})) --direct /dev/sdc 2>&1)
z=$?
[ $z -ne 0 -o -n "$(echo "${status}" | grep -i error)" ] && echo "读取扇区 ${currentsector} 时出错:${status}"
完毕

hdparm由于不知道遇到 I/O 错误时的行为(手册页没有帮助,或者我错过了有帮助的小字体),我尝试通过stderr折叠stdout、检查退出代码和检查输出中的“错误”来涵盖所有基础。

当我运行上述小脚本时,我根本没有得到任何输出,我认为这意味着它hdparm能够读取我告诉它读取的所有扇区,对吗?

我还手动检查了问题扇区两侧的大约 50 个扇区,只发现读取成功。

smartctl -A /dev/sdc没有暴露任何特别令人担忧的数据:

ID# ATTRIBUTE_NAME 标志值 最差阈值类型 已更新 WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate 0x000f 200 200 051 预失败始终 - 12
  3 Spin_Up_Time 0x0003 163 163 021 始终预故障 - 4816
  4 启动停止计数 0x0032 100 100 000 Old_age 始终 - 57
  5 Reallocated_Sector_Ct 0x0033 200 200 140 预故障始终 - 0
  7 Seek_Error_Rate 0x000e 200 200 000 Old_age 始终 - 0
  9 通电时间 0x0032 079 079 000 Old_age 始终 - 15924
 10 Spin_Retry_Count 0x0012 100 253 000 Old_age 始终 - 0
 11 校准重试计数 0x0012 100 253 000 Old_age 始终 - 0
 12 Power_Cycle_Count 0x0032 100 100 000 Old_age 始终 - 55
192 Power-Off_Retract_Count 0x0032 200 200 000 Old_age 始终 - 37
193 Load_Cycle_Count 0x0032 113 113 000 Old_age 始终 - 262898
194 温度_摄氏度 0x0022 105 090 000 Old_age 始终 - 42
196 Reallocated_Event_Count 0x0032 200 200 000 Old_age 始终 - 0
197 Current_Pending_Sector 0x0012 200 200 000 Old_age 始终 - 0
198 Offline_Uncorrectable 0x0010 200 200 000 Old_age 离线 - 0
199 UDMA_CRC_Error_Count 0x003e 200 200 000 Old_age 始终 - 0
200 Multi_Zone_Error_Rate 0x0008 200 200 000 Old_age 离线 - 0

Raw_Read_Error_Rate实际上里面有一个数字,但除此之外,我认为该报告显示硬盘有点老旧了,但除此之外还很健康。请用最少的火爆来纠正我缺乏经验的评估 :-)

我对 SCSI Sense 消息的进一步研究和分析并没有取得成果,可能是因为直到今天我对此一无所知。

是的,我检查了(并重新安装)HBA 卡和电缆。

归根结底,这一切意味着什么?为什么会出现“严重介质错误”消息,但随后却成功读取扇区?更重要的是,我可以以此为理由升级到 SSD 吗?;-)

相关内容