前几天将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