很抱歉发了这么长的帖子;简而言之,我收到了几个“严重介质错误”消息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 吗?;-)