hdparm --read-sector 和 dd 与“当前待处理扇区”之间的差异

hdparm --read-sector 和 dd 与“当前待处理扇区”之间的差异

这原本是一个“答案”如何使用 hdparm 修复待处理的扇区?

几天来,我一直收到同一个“当前待处理扇区”的 SMART 通知。dd周围的解决方案没有解决任何问题(它们似乎将数据清零并重写,但不会影响智能状态)。 请注意,我不是大师在此,仅是来自论坛的货物崇拜命令。

dd我使用的不改变情况的命令:

# read to file (all cmds ran w/o errors)
dd if=/dev/sdb of=bl.$BLOCK bs=1024 count=1 iflag=direct skip=$BLOCK
# zero out
dd if=/dev/zero of=/dev/sdb bs=1024 count=1 conv=noerror,sync seek=$BLOCK
# read the zeroes back
dd if=/dev/sdb of=/dev/stdout bs=1024 count=1 iflag=direct skip=$BLOCK | xxd
# write real data back out
dd if=bl.$BLOCK of=/dev/sdb bs=1024 count=1 iflag=direct seek=$BLOCK
# verify they match
dd if=/dev/sdb of=/dev/stdout bs=1024 count=1 iflag=direct skip=$BLOCK | xxd \
 | diff - <(xxd bl.$BLOCK)
# still have the Current_Pending_Sector error
smartctl -A /dev/sdb | grep Pend
197 Current_Pending_Sector  0x0032   200   200   000 .. 1

清除 Current_Pending_Sector 计数的 hdparm 命令:

hdparm --read-sector $BLOCK /dev/sdb # data (didn't seem to match dd out)
# this was very slow on the first block
hdparm --write-sector $BLOCK /dev/sdb
hdparm --read-sector $BLOCK /dev/sdb # zeros
smartctl -A /dev/sdb | grep Pend
197 Current_Pending_Sector  0x0032   200   200   000  .. 0

在使用这些命令时我没有遇到任何读/写错误,因此没有错误可能只是因为驱动器能够以某种方式有效地掩盖它们。

此外,dd再次运行这些命令似乎可以恢复数据,但即便如此,它们hdparm --read-sector仍会显示零。我将其解释为 hdparm 在较低级别与驱动器通信并强制执行待处理写入,但 dd 只看到驱动器重新映射的结果...这可能是怎么回事?

更新 一篇随机帖子,指出了 hdparm 和 dd 输出之间的区别. hdparm-9.42 有一个修改,即“强制扇区转储(读取扇区、识别等)使用 le16 输出格式”。

相关内容