修复有坏道的磁盘

前几天将proxmox/zfs的有坏道的盘换下来后,一直想着怎么能修复一下废物利用。今天周末,刚好有时间查阅相关资料把磁盘修复了,记录下来方便有缘人。

注意:此文章讲的怎么修复有坏道的磁盘(hdd),不包括ssd,ssd原理是不一样的。

由于自己不是专门搞磁盘的,一些术语可能不准确,请见谅。

磁盘坏道修复原理

现代的磁盘(HDD)在出厂的时候,已经预留了更多的sector,这些sector在平时不会用,在出现bad sector的时候,HDD的驱动会自动将坏掉的sector隔离掉,并使用保留的sector来替换坏掉的sector。当然,预留的sector是有限的,如果按照本文的修复方法,还是有部分bad sector没有修复,说明bad sector太多了,磁盘最好别用了(这里有待商榷,下文会给出一些想法)。

基于上面的原理,修复磁盘就比较简单了。只要把磁盘的每个sector都写一遍,HDD的驱动遇到坏掉的sector时,就会自动的替换bad sector了。

示例

修复前

使用smartctl -i /dev/sda可以看到bad sector的一些统计信息:

197 Current_Pending_Sector  0x0012   100   001   000    Old_age   Always       -       12
198 Offline_Uncorrectable   0x0010   100   001   000    Old_age   Offline      -       12

修复命令

sudo su -
nohup dd bs=512k if=/dev/zero of=/dev/sda &

注意上面的bs的值,需要是sector size的倍数。sector size可以如下命令查看:

$ smartctl -i /dev/sda

...
=== START OF INFORMATION SECTION ===
...
Sector Size:      512 bytes logical/physical
...

修复命令会运行很长时间,因为磁盘的每个sector都要被写一遍。耐心点吧。

修复后

使用smartctl -i /dev/sda可以看到:

197 Current_Pending_Sector  0x0012   100   001   000    Old_age   Always       -       0 
198 Offline_Uncorrectable   0x0010   100   001   000    Old_age   Offline      -       0 

可以看到,错误数变为0了,修复成功

假如还是有坏道怎么办

如果HDD预留的sector不够用,修复后,还有坏道。是否可以在新分区的时候,将坏道所在的sector分在新的单独的分区,并且后续别使用。

因为自己还没有遇到这种更复杂的情况,还没有实践,这种解决方案仅供参考。

参考

how to quickly format a hdd with bad sectors in linux

how to fix repair bad blocks in linux

fix hard disk bad sectors in linux

bad block how to