磁盘坏道的在线修复

现在硬盘很贵, 有必要把一些有坏道的硬盘, 拿出来修一下继续用, 磁盘在读取时出错, 会在smart里面记录一下,  读取时, 是没法进行重定位修复的,所以在smart寄存器里, 记录为197号寄存器197 Current_Pending_Sector, 用 smartctl -A /dev/sda 可以看, 如果它非0, 就是有扇区需要修复。 读取时, 是没法修复的, 只能在写入时修复, 写入时, 会把这些坏的扇区, 重定位到预留区。 

196号寄存器, 记录了有多少个扇区被进行了重定位

维修步骤, 首先用badblock命令扫描获得坏块表, 现在的硬盘, 一个物理扇区一般是4096字节, 当然逻辑扇区一般是512字节, 我们用4096的扇区大小进行扫描:
badblock -b 4096 /dev/sdx -o /tmp/sdx.bad

几个小时或者几十个小时之后, 扫描完成,

/tmp/sda.bad文件里面就是坏快表,数量应该和197号寄存器对的上。

修复时, 使用dd命令, 如果坏块所在的位置是raid1的, 那么直接dd修复就行了, 可以最后再做raid的repair, 如果不是raid1/raid5/raid6/raidz, 那么, 可以先试试读取, 能不能读出内容,
读取
 dd bs=4096 if=/dev/sdx of=/tmp/184859.dat  skip=184859 count=1
如果读取成功, 就写入修复
dd bs=4096 if=/tmp/184859.dat of=/dev/sdx seek=184859 count = 1

如果读取不成功, 那就直接用0进行修复:
dd bs=4096 if=/dev/zero of=/dev/sddx seek=184859 count=1

如果扇区比较多,可以用脚本:
while read b
do
echo dd bs=4096 if=/dev/zero of=/dev/sdx seek=$b count=1
done </tmp/sdx.bad 

所有的扇区都处理完成后,开始repair
如果分区是软raid1/raid5/raid6/raid10, 使用这个命令启动rapair:

echo repair > /sys/block/mdx/md/sync_action
进度:cat /proc/mdstat

如果是btrfs的raid, 可以用这个命令:
btrfs scrub start /mount_point
进度: btrfs scrub status