ITlover00 2011-05-26
概述
随着硬盘容量、速度的快速发展,硬盘的可靠性问题越来越重要,今天的单块硬盘存储容量可轻松达到1TB,硬盘损坏带来的影响非常巨大。
不同的文件系统(xfs,reiserfs,ext3)都有自己的检测和修复工具。检测之前可以先使用dmesg命令查看有没有硬件I/O故障的日志,如果有,先用fsck看看是不是文件系统有问题,如果不是则可以使用下面介绍硬盘检测和优化方法来修复它。grep"error"/va/log/messages*;
Linux检测硬盘坏道
使用SMART检测硬盘
SMART是一种磁盘自我分析检测技术,早在90年代末就基本得到了普及每一块硬盘(包括IDE、SCSI),在运行的时候都会将自身的若干参数记录下来,这些参数包括型号、容量、温度、密度、扇区、寻道时间、传输、误码率等。硬盘运行了几千小时后,很多内在的物理参数都会发生变化,某一参数超过报警阈值,则说明硬盘接近损坏,此时硬盘依然在工作,如果用户不理睬这个报警继续使用,那么硬盘将变得非常不可靠,随时可能故障。
启用SMART
SMART是和主板BIOS上相应功能配合的,要使用SMART,必须先进入到主板BIOS设置里边启动相关设置。一般从Pentium2级别起的主板,都支持SMART,BIOS启动以后,就是操作系统级别的事情了(Windows没有内置SMART相关工具,需要安装第三方工具软件),好在Linux上很早就有了SMART支持了,如果把Linux装在VMware等虚拟机上,在系统启动时候可以看到有个服务启动报错:smartd。这个服务器就是smart的daemon进程(因为vmware虚拟机的硬盘不支持SMART,所以报错)。smartd是一个守护进程(一个帮助程序),它能监视拥有自我监视,分析和汇报技术(Self-Monitoring,Analysis,andReportingTechnology-SMART)的硬盘。SMART体系使得硬盘能监视并汇报自己的运行状况.它的一个重要特性是能够预测失败,使得系统管理员能避免数据丢失。
smartctl简单用法
smartctl-a<device>检查该设备是否已经打开SMART技术。smartctl-son<device>如果没有打开SMART技术,使用该命令打开SMART技术。smartctl-tshort<device>后台检测硬盘,消耗时间短;smartctl-tlong<device>后台检测硬盘,消耗时间长;smartctl-C-tshort<device>前台检测硬盘,消耗时间短;smartctl-C-tlong<device>前台检测硬盘,消耗时间长。其实就是利用硬盘SMART的自检程序。smartctl-X<device>中断后台检测硬盘。smartctl-lselftest<device>显示硬盘检测日志。smartctl-lerror<device>显示硬盘错误汇总。
首先通过dmesg工具,确认一下硬盘的设备符号。例如一个IDE硬盘连接到PrimaryIDE总线上的Slave位置,硬盘设备符号是/dev/hdb,hdb中的h代表IDE,如果显示为sdb,则代表SATA和SCSI,最后一个字幕b代表Primary总线,第二块硬盘即Slave位置,确认硬盘是否打开了SMART支持:
#smartctl-i/dev/sda
smartctl5.402010-10-16r3189[i386-redhat-linux-gnu](localbuild)
Copyright(C)2002-10byBruceAllen,http://smartmontools.sourceforge.net
===STARTOFINFORMATIONSECTION===
DeviceModel:HITACHIHTS543225L9SA00
SerialNumber:090131FB2F32YLG28JEA
FirmwareVersion:FBEZC48C
UserCapacity:250,059,350,016bytes
Deviceis:Notinsmartctldatabase[fordetailsuse:-Pshowall]
ATAVersionis:8
ATAStandardis:ATA-8-ACSrevision3f
LocalTimeis:WedMay2510:10:392011CST
SMARTsupportis:Available-devicehasSMARTcapability.
SMARTsupportis:Enabled//表示启用了smart支持
如果看到SMARTsupportis:Disabled表示SMART未启用,执行如下命令,启动SMART
#smartctl--smart=on--offlineauto=on--saveauto=on/dev/sda
smartctl5.402010-10-16r3189[i386-redhat-linux-gnu](localbuild)
Copyright(C)2002-10byBruceAllen,http://smartmontools.sourceforge.net
===STARTOFENABLE/DISABLECOMMANDSSECTION===
SMARTEnabled.
SMARTAttributeAutosaveEnabled.
SMARTAutomaticOfflineTestingEnabledeveryfourhours.
现在硬盘的SMART功能已经被打开,执行如下命令查看硬盘的健康状况
#smartctl-H/dev/sda
smartctl5.402010-10-16r3189[i386-redhat-linux-gnu](localbuild)
Copyright(C)2002-10byBruceAllen,http://smartmontools.sourceforge.net
===STARTOFREADSMARTDATASECTION===
SMARToverall-healthself-assessmenttestresult:PASSED
请注意result后边的结果:PASSED,这表示硬盘健康状态良好;如果这里显示Failure,那么最好立刻给服务器更换硬盘。SMART只能报告磁盘已经不再健康,但是报警后还能继续运行多久是不确定的。通常,SMART报警参数是有预留的,磁盘报警后,不会当场坏掉,一般能坚持一段时间,有的硬盘SMART报警后还继续跑了好几年,有的硬盘SMART报错后几天就坏了。但是一旦出现报警,侥幸心里是万万不能的……
#smartctl-A/dev/sda查看硬盘的详细信息
#smartctl-son/dev/sda如果没有打开SMART技术,使用该命令打开SMART技术。
#smartctl-tshort/dev/sda后台检测硬盘,消耗时间短;
#smartctl-tlong/dev/sda后台检测硬盘,消耗时间长;
#smartctl-C-t/dev/sdashort前台检测硬盘,消耗时间短;
#smartctl-C-t/dev/sdalong前台检测硬盘,消耗时间长。其实就是利用硬盘SMART的自检程序。
#smartctl-X/dev/sda中断后台检测硬盘。
#smartctl-lselftest/dev/sda显示硬盘检测日志。
#smartctl-lerror/dev/sda显示硬盘错误汇总。
如果需要定期登录到服务器上运行smartctl比较麻烦时,linux还提供了系统进程smartd,编辑配置文件:1vi/etc/smartd.conf
这个配置文件中大部分可能是注释掉的说明,只需要写入和当前硬盘相关的配置即可:
/dev/[email protected]//监控磁盘的健康状态,当SMART中报告PASSED的时候不理睬。一旦出现Failure,立刻用邮件通知用户指定的邮箱
/dev/[email protected],root@localhost//监控磁盘的所有属性,当SMART中报告PASSED的时候不理睬。一旦出现Failure,立刻用邮件通知用户指定的邮箱
/dev/twa0-d3ware,0-a-sL/../../7/00
//监控3ware9000控制器上的第一个ATA磁盘的所有属性,在每个礼拜天的00:00--01:00进行长格式的自我检测
/dev/sg2-dareca,1-a-sL/../(01|15)/./22//监控ArecaRaid控制器上的第一个SATA磁盘的所有属性,在每个礼拜月的第1天和第15天的22:00--23:00进行长格式的自我检测
-s(O/../.././(00|06|12|18)|S/../.././01|L/../../6/03)//在每天的00:00,06:00,12:00,18:00进行离线的自检,并在每天的01:00-02:00进行短格式的自检,并在每个礼拜6的03:00-04:00进行长格式的自检
配置好smartd.conf后需执行
/etc/init.d/smartdrestart即可生效
其他和smartd.conf相关的配置可参见:
http://smartmontools.sourceforge.net/man/smartd.conf.5.html
使用badblocks检测硬盘坏块
badblocks命令可以检查磁盘装置中损坏的区块。执行该指令时须指定所要检查的磁盘装置,及此装置的磁盘区块数。
语法与参数:语法:badblocks[-svw][-b][-o][磁盘装置][磁盘区块数][启始区块]参数:-b指定磁盘的区块大小,单位为字节。-o将检查的结果写入指定的输出文件。-s在检查时显示进度。-v执行时显示详细的信息。-w在检查时,执行写入测试。[磁盘装置]指定要检查的磁盘装置。[磁盘区块数]指定磁盘装置的区块总数。[启始区块]指定要从哪个区块开始检查。
badblocks检测磁盘坏块:
badblocks-s//显示进度-v//显示执行详细情况/dev/sda1
#badblocks-s-v/dev/sda
正在检查从0到244198583的块
Checkingforbadblocks(read-onlytest):^C0.10%done,0:04elapsed
Interruptedatblock272896
$badblocks-s//显示进度-w//以写去检测-v//显示执行详细情况/dev/sda2
#badblocks-w-s-v/dev/sda1
Checkingforbadblocksinread-writemode
Fromblock0to25607577
Testingwithpattern0xaa:^C0.73%done,0:03elapsed
注意,不能以写的方式检测已经挂载的硬盘
使用hdparm测试
测试硬盘读写速度
#hdparm-Tt/dev/sda
/dev/sda:
Timingcachedreads:
1918MBin2.00seconds=959.62MB/sec
Timingbuffereddiskreads:184MBin3.00seconds=61.26MB/sec
hdparm可检测,显示与设定IDE或SCSI硬盘的参数。
语法:
hdparm[-CfghiIqtTvyYZ][-a<快取分区>][-A<0或1>][-c<I/O模式>][-d<0或1>][-k<0或1>][-K<0或1>][-m<分区数>][-n<0或1>][-p<PIO模式>][-P<分区数>][-r<0或1>][-S<时间>][-u<0或1>][-W<0或1>][-X<传输模式>][设备]
-a<快取分区>设定读取文件时,预先存入块区的分区数,若不加上<快取分区>选项,则显示目前的设定。-A<0或1>启动或关闭读取文件时的快取功能。-c<I/O模式>设定IDE32位I/O模式。-C检测IDE硬盘的电源管理模式。-d<0或1>设定磁盘的DMA模式。-f将内存缓冲区的数据写入硬盘,并清楚缓冲区。-g显示硬盘的磁轨,磁头,磁区等参数。-h显示帮助。-i显示硬盘的硬件规格信息,这些信息是在开机时由硬盘本身所提供。-I直接读取硬盘所提供的硬件规格信息。-k<0或1>重设硬盘时,保留-dmu参数的设定。-K<0或1>重设硬盘时,保留-APSWXZ参数的设定。-m<磁区数>设定硬盘多重分区存取的分区数。-n<0或1>忽略硬盘写入时所发生的错误。-p<PIO模式>设定硬盘的PIO模式。-P<磁区数>设定硬盘内部快取的分区数。-q在执行后续的参数时,不在屏幕上显示任何信息。-r<0或1>设定硬盘的读写模式。-S<时间>设定硬盘进入省电模式前的等待时间。-t评估硬盘的读取效率。-T平谷硬盘快取的读取效率。-u<0或1>在硬盘存取时,允许其他中断要求同时执行。-v显示硬盘的相关设定。-W<0或1>设定硬盘的写入快取。-X<传输模式>设定硬盘的传输模式。-y使IDE硬盘进入省电模式。-Y使IDE硬盘进入睡眠模式。-Z关闭某些Seagate硬盘的自动省电功能。
参考至:http://hi.baidu.com/dmkj2008/blog/item/df3b031bb514abc1ac6e757f.html
http://smartmontools.sourceforge.net/man/smartd.conf.5.html
http://www.bsdlover.cn/html/32/n-5332.html