作者:李汉强 发文时间:2003.11.06 
 
电脑硬盘出现坏道后,如果不及时更换或进行技术处理,坏道就会越来越多,并会造成频繁死机和数据丢失。硬盘出现坏道最好对硬盘进行重新分区,把坏道部分单独分成一个区,并把它隐藏起来。在Linux下硬盘坏道有两种修复方法,下面我将介绍比较这两种方法,它们是在ext2文件格式下修改的,也同样适用ext3格式,因为ext3只不过是ext2journal 

修复方法一 

为了检查坏道,可以使用mkfs.ext2的命令,带上参数-C用只读的方式检查硬盘。我们使用man命令查看“mkfs.ext 2” 需要带上的参数,输入下面命令: 

#man mkfs.ext2
 


由其结果可以看到显示“mkfs.ext 2” 可以支持的功能和参数。 

#man mkfs.ext2 
mke2fs [ -c | -l filename ] [ -b block-size ] [ -f fragment-size ] [ -i 
……
 


上面代码表示使用-c在创建文件系统前检查坏道的硬盘,-bblock的大小,-f碎裂的大小。这个操作已经很清楚地告知我们可以采用“mkfs.ext2 -c”选项用“read-only”方式检查硬盘。这个命令会在格式化硬盘时检查硬盘,并标出错误的硬盘“block”。用这个方法格式化硬盘,需要有相当大的耐心,因为命令运行后,会一个个用读的方式检查硬盘。做法如下: 

# mkfs.ext2 -c /dev/hda1
 


修复方法二 

根据经验,坏道通常会波及到其它的区域,尤其是邻近的“block”。此外还有些“block”会有以下的情况:读写16次中有一两次会出现读写错误的情况。类似这种要坏不坏的情况具体修复方法如下,先输入下面命令: 

# man badblocks
 


查看一下badblocks所带的参数,由结果可以看到显示“badblocks”可以支持的功能和参数。 

NAME 
badblocks - search a device for bad blocks 
badblocks [ -svwnf ] [ -b block-size ] 
[ -c blocks_at_once ] [ -i input_file ]
 [ -o output_file ] [ -p num_passes ] device [ last-block ] [ start-block ] 
-b block-size 
-c number of blocks 
……
 


上面的说明中表明badblocks 检查寻找一个设备上的坏道;-bblock的大小,-c是检查的次数,-i输出文件,-o输入文件,-p是通过的数量。 

硬盘在格式化时会指定一个“block”的大小,默认值为“block 4K ”(4K/block)“badblocks”在检查坏道时并不知道将来想要格式化时所指定的“block-size”,所以必须告知“badblocks”硬盘的“block size” 

“-c number of blocks”
是检查的次数,默认是16次。这样的命令需要耐心等待。语法如下: 

# badblocks -b 4096 -c 16 /dev/hda1 -o hda-badblocks-list
 


其中,“badblocks”4096的一个block,每一个block检查16次,将结果输出到“hda-badblocks-list”文件里。 

“hda-badblocks-list”
是个文本文件,内容如下: 

# cat hda-badblocks-list 
51249 
51250 
51251 
51253 
51254 
……
61245 
……
 


如果希望能找出可疑的“blocks”,并一起“mark”起来,可以针对可疑的区块多做几次操作: 

# badblocks -b 4096 -c 1 /dev/hda1 -o hda-badblocks-list.1 63000 51000
 


“badblocks”
4096字节为一个“block”,每一个“block”检查1将结果输出到“hda-badblocks-list .1” 文件中,由第51000 block开始,到63000 block结束。这次花费的时间比较短,硬盘在指定的情况下在很短的时间就产生嘎嘎嘎嘎的响声。由于检查条件的不同,其输出的结果也不完全是相同的。 

# cat hda-badblocks-list.1 
51248 
51250 
51251 
51253 
……
61243 
61245 
……
 


重复几次上述的操作,因条件多少都有些不同,所以结果也有所不同。进行多次操作后,产生了最后的“hda-badblock-list.final” ,最后要格式化硬盘。输入下面代码: 

#man mkfs.ext2
 


结果可以看到显示“mkfs.ext2 ”可以支持的功能和参数。 

NAME mke2fs - create an ext2/3 filesystem 
……
 


mkfs.ext2
是用来创建一个ext2/3系统文件。 

总结 

以上介绍的是Linux下硬盘有了坏道的解决方法,希望这些方法能给大家带来帮忙。 

硬盘有了坏道,如果不是因为老化问题,则说明平时在使用上有不妥之处,比如对硬盘过分频繁地整理碎片、内存太少以致应用软件对硬盘频频访问等,而忽略对硬盘的防尘处理也会导致硬盘磁头因为定位困难引发机械故障。另外,对CPU超频引起外频增高,迫使硬盘长时间在过高的电压下工作,也会引发故障。所以,平时对硬盘的使用还应以谨慎操作为上策。 

Linux
操作系统相比Windows要复杂得多,修复硬盘的方法及技巧绝不仅限与此,本文只是抛砖引玉,希望广大电脑爱好者能更好地熟悉Lnux环境下硬盘。

本文旨在通过一个具体的事例来说明,由于某些原因(如非正常关机)导致系统无法启动且无法用救援模式(rescue)来修复的情况下,如何运用fdisk工具来挽救硬盘上的有用数据。由于本人认识有限,文档中难免有描述不清甚至错误的地方,欢迎指正:[email protected]

平台描述:
硬件平台:IBM Xseries 336
cpu xeon 2.6G
内存 1024M
scsi硬盘 73.4G
DVD驱动器
操作系统:Great Turbo Enterprise Server 10
内核: 2.6.9
硬盘分区情况:
设备 大小 mount point 类型
/dev/sda1 120M /boot EXT3
/dev/sda2 20000M / EXT3
/dev/sda3 2048M SWAP
/dev/sda4 49000M EXTENED
/dev/sda5 49000M /u EXT3

故障描述:
由于未知原因,导致机器死机。无法ping通主机,终端无反应,无法输入任何指令。CTRL+ALT+F1~F7也不起作用。只好冷关机。开机自检后,进入操作系统选择界面,确定进入。在操作系统检查磁盘后提示,系统异常关机,需要检查文件系统。确认后fsck,并修复(切记,fsck相当危险,慎用)。最终进入操作系统,但系统有些异常。于是再次重启。当进入操作系统文件系统检测时,便无法继续。最终屏显为:switch to new root

修复过程:
IBM XSeries 336自带的硬盘检测工具扫描硬盘,并未发现硬件上有任何故障。
试图用操作系统的rescue模式恢复系统,但进行至:搜索已安装的操作系统时死机。
将硬盘插入另一台正常的336机器,试图mount。但系统启动异常(很多模块加载失败),且mount失败(可能是因为操作系统检测到硬件有较大改动的缘故)
由于用户数据在单独的一个分区(/u,dev/sda5),所以试着重装操作系统并保留分区/u不格式化。但同样当进行到:搜索已安装的操作系统这一步时死机。

咨询turbo linux工程师,对方告知可以在死机之前,ALT+F2进入控制台,再用fdisk删除用户数据以外的其他分区:
准备:
1.
插入Server 10安装盘重启系统
2.
在安装提示下输入text,进入文本安装模式
3.
安装程序初始化完毕后,选择语言,键盘等。直道导致死机的搜索已安装的操作系统那一步之前
4. ALT+F2
进入控制台
5. dmesg|grep scsi
查看scsi硬盘信息,发现并无报错。再次验证硬盘无硬件故障
fdisk:
1. fdisk /dev/sda
屏幕提示:Command (m for help):
这时候如果键入m可以查看帮助
2.
键入p查看分区情况:
/dev/sda1 120M /boot EXT3
/dev/sda2 20000M / EXT3
/dev/sda3 2048M SWAP
/dev/sda4 49000M EXTENED
/dev/sda5 49000M /u EXT3
屏幕提示:Command (m for help):
3.
键入d删除/boot分区
屏幕提示:Command (m for help):
4.
键入w确认删除并回到提示:
Command (m for help):
5.
键入p查看分区情况:
这时发现少了一个分区。分区情况可能有所改变,我们需要记住新的分区情况
6.
用第34步的方法依次删除除了用户数据区(/u)之外的其他分区

退出控制台(大概是quit或者其他什么命令,记不清了)继续安装。当进入搜索已安装的操作系统时,并没有死机。于是按照正常步骤进行重新分区,并配置安装过程中的其他参数(记住一定保留/u分区)。系统安装完成后,便可通过mount挂载/u分区(mount -t ext3 /dev/sda5 /mnt),里面的数据都完好无损。

修复过程到此结束!


要点总结:
1.
尽量避免冷关机的情况
2.
慎重使用fsck
3. Turbo Linux
在引导过程中,可以通过ALT+F2进入控制台
4.
在涉及到分区问题时,可以试试fdisk