研究了一下hdparm 发现,用dd重写不能修复的硬盘坏扇区,可以用hdparm的--write-sector 参数,进行修复。
参数是lba扇区数, 跟smartctl -a 报告出来的相同, 每次修复一个512的扇区,
不过因为现在的磁盘都是4096字节的扇区, 所以要分别执行8次, 才能真正修复一个扇区:
假设 smartctl -a 报出221147150有错误,:
Num | Test_Description Status | Remaining | LifeTime(hours) | LBA_of_first_error | |
# 1 | Short offline Completed: read failure | 90% | 5503 | 221147150 |
用dd命令, 定位一下, 一共有8个LBA扇区读错误:
dd if=/dev/sdb skip=221147143 bs=512 count=1 of=/tmp/221147143
记录了1+0 的读入
记录了1+0 的写出
512字节(512 B)已复制,0.0128338 秒,39.9 kB/秒
dd if=/dev/sdb skip=221147144 bs=512 count=1 of=/tmp/221147144
dd: 正在读入"/dev/sdb": 输入/输出错误
记录了0+0 的读入
记录了0+0 的写出
0字节(0 B)已复制,21.1198 秒,0.0 kB/秒
dd if=/dev/sdb skip=221147144 bs=512 count=1 of=/tmp/221147144
dd: 正在读入"/dev/sdb": 输入/输出错误
记录了0+0 的读入
记录了0+0 的写出
0字节(0 B)已复制,21.1198 秒,0.0 kB/秒
....
....
....
221147144-221147151 一个8个扇区错误。
用hdparm 修复:
hdparm --yes-i-know-what-i-am-doing --write-sector 221147144 /dev/sdb
hdparm --yes-i-know-what-i-am-doing --write-sector 221147145 /dev/sdb
hdparm --yes-i-know-what-i-am-doing --write-sector 221147146 /dev/sdb
hdparm --yes-i-know-what-i-am-doing --write-sector 221147147 /dev/sdb
hdparm --yes-i-know-what-i-am-doing --write-sector 221147148 /dev/sdb
hdparm --yes-i-know-what-i-am-doing --write-sector 221147149 /dev/sdb
hdparm --yes-i-know-what-i-am-doing --write-sector 221147150 /dev/sdb
hdparm --yes-i-know-what-i-am-doing --write-sector 221147151 /dev/sdb
/dev/sdf:
re-writing sector 221147151: succeeded
现在再检测一下:
root@bak1:~# dd if=/dev/sdb of=/tmp/221147144 count=8 bs=512 skip=221147144
记录了8+0 的读入
记录了8+0 的写出
4096字节(4.1 kB)已复制,0.000288426 秒,14.2 MB/秒 已经修复。
要得到坏扇区列表, 可以用badblock命令:
badblocks -b 512 /dev/sdb -o /sdb.bad
然后根据文件 /sdb.bad 进行修复。