linux下利用badblocks程序在线修复坏道
2008-12-26    刘世伟   
打印自: 安恒公司
地址: HTTP://es-lan.anheng.com.cn/news/article.php?articleid=1673
linux下利用badblocks程序在线修复坏道
新的硬盘修复方法,请看这个文章:
http://anheng.com/news/html/net_admin_blog/hdparm_repair_hd_bad_blocks.html

现在的硬盘,在内部会有一保留区域,来替换出现坏块的扇区,这对于磁盘外的系统来说是透明的,
如果已经存在了坏道,硬盘会在写入的时候将它替换到别的位置, 注意, 只有在写入的时候,才进行重定位。
我們完全不必要使用上层的文件系统的坏道表功能, 只要对坏块位置进行写入,就可以修复了。

使用badblocks 可以查出坏块,然后badblocks本是具有写测试功能,我們只需要用badblocks就可以了,
因为不用向上层的文件系统提供坏道表, 所以我們在扫描坏道时,不用设置块大小参数(-b),
首先扫描坏道
badblocks -b 4096 -o /root/sdb.bad /etc/sdb
经过慢长的时间,我們得到了一个文件/root/sdb.bad :
16435904
sdb 有1个坏块
先用dd尽量备份坏块
dd if=/dev/sdb bs=4096 skip=16435904 of=/tmp/15435904.dat count=1
如果显示读取字节数是0就多试几次, 不行就可能丢失此块数据, 倒是不用担心,一般不会有太大问题.
用badblocks的写测试功能,对这些坏块进行重写(注意! -w写测试会覆盖数据):
badblocks -w -f /dev/sdb5 16435904 16435904
如果前面的操作有成功的备份/tmp/15435904.dat, 就把它写回:
dd if=/tmp/15435904.dat of=/dev/sdb seek=15435904 bs=4096 count=1
其实我們不需要等待badblocks扫描完成, 就可以进行修复。

badblocks是对块设备进行处理, 所以可以实现对挂载中的系统进行处理。

数据比硬盘值钱, 这只可以作为临时措施,出现坏道, 还是应该换硬盘,现在硬盘不贵。

btw
在修复前后,利用smartctl  对磁盘进行long测试的2次结果如下:
web:~# smartctl -l selftest /dev/sdb
smartctl version 5.38 [x86_64-unknown-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed without error       00%      8308         -
# 2  Short offline       Completed: read failure       10%      8292         234908935

#2是修复前的测试 在234908935处出现读错误。
#1是修复后的情况没有错误

上面是对硬盘的坏块逐块进行修复的方式
当然可以写一个脚本把这些命令联起来, badblocks 也可以连续覆盖修复坏块 ,2个块号的参数, 后面一个是要覆盖的开始块数,前面一个是结束块数.

用smartctl对硬盘进行测试的方法如下
在线快速测试: 大约2分钟
smartctl -t short /dev/sdb
在线长测试: (1T大约4小时)
smartctl -t long /dev/sdb
此外还有几种测试模式:offline, short, long, conveyance, select,M-N, pending,N, afterselect,[on|off], scttempint,N[,p]

终止正在进行的测试
smartctl -X /dev/sdb

在测试结束后获取测试结果:
smatrctl -l selftest /dev/sdb




备份坏硬盘的整盘数据:
如果用dd来备份坏硬盘的整盘数据, 千万记住要增加 conv=noerror,sync 参数, noerror是遇到读错误继续, sync是用0填充错误的数据, 否则会造成数据错位, 硬盘映像就毁了。
最好是用dd_rescue来做硬盘的dump, 能显示当前的dump速度和平均速度。据说它还可以随时终止, 并再次继续,可以反向的做数据dump, 从磁盘的尾部向前dump。
在debian下,安装ddrescue软件包, 就可以执行dd_rescue了:
dd_rescue  /dev/sdb /home/sdb.dump

在debian的新发行版中, 已经没有dd_rescue  换成了myrescue  用法一样

责任编辑: admin