江苏省吴江市双板桥路3号兴源网络

0512-63028342

ly@wjxy.net.cn

linux下利用badblocks程序在线修复坏道

测试块:badblocks -s -v -o sdbbadblocks.log /dev/sdb

测试块:badblocks -s -v -o sdbbadblocks.log /dev/sdb END START

重写块(会覆盖数据):badblocks -w -s /dev/sdb END START

测试500G大约一小时左右

现在的硬盘,在内部会有一保留区域,来替换出现坏块的扇区,这对于磁盘外的系统来说是透明的,

如果已经存在了坏道,硬盘会在写入的时候将它替换到别的位置, 注意, 只有在写入的时候,才进行重定位。

我們完全不必要使用上层的文件系统的坏道表功能, 只要对坏块位置进行写入,就可以修复了。

 

使用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

 

发表评论

邮箱地址不会被公开。 必填项已用*标注