隨着硬盤容量、速度的快速發展,硬盤的可靠性問題越來越重要,今天的單塊硬盤存儲容量可輕松達到1TB,硬盤損壞帶來的影響非常巨大。
不同的文件系統(xfs,reiserfs,ext3)都有自己的檢測和修復工具。
檢測之前可以先使用 dmesg 命令查看有沒有硬件I/O故障的日志,如果有,先用 fsck 看看是不是文件系統有問題,如果不是則可以使用下面介紹的硬盤檢測和優化方法來修復它。
檢測硬盤壞道
使用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, and Reporting Technology - SMART)的硬盤。SMART體系使得硬盤能監視並匯報自己的運行狀況.它的一個重要特性是能夠預測失敗,使得系統管理員能避免數據丟失。
Ubuntu軟件包
smartmontools - control and monitor storage systems using S.M.A.R.T.
gsmartcontrol - graphical user interface for smartctl
smartctl簡單用法
smartctl -a <device> 檢查該設備是否已經打開SMART技術。
smartctl -s on <device> 如果沒有打開SMART技術,使用該命令打開SMART技術。
smartctl -t short <device> 后台檢測硬盤,消耗時間短;
smartctl -t long <device> 后台檢測硬盤,消耗時間長;
smartctl -C -t short <device> 前台檢測硬盤,消耗時間短;
smartctl -C -t long <device> 前台檢測硬盤,消耗時間長。其實就是利用硬盤SMART的自檢程序。
smartctl -X <device> 中斷后台檢測硬盤。
smartctl -l selftest <device> 顯示硬盤檢測日志。
smartctl -l error <device> 顯示硬盤錯誤匯總。
smartctl -A /dev/sda 查看硬盤的詳細信息
首先通過dmesg工具,確認一下硬盤的設備符號。例如一個IDE硬盤連接到Primary IDE 總線上的Slave位置,硬盤設備符號是/dev/hdb,hdb中的h代表IDE,如果顯示為sdb,則代表SATA和SCSI,最后一個字幕b代表Primary總線,第二塊硬盤即Slave位置,確認硬盤是否打開了SMART支持:
# smartctl -i /dev/sda
smartctl 5.40 2010-10-16 r3189 [i386-redhat-linux-gnu] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net
=== START OF INFORMATION SECTION ===
Device Model: HITACHI HTS543225L9SA00
Serial Number: 090131FB2F32YLG28JEA
Firmware Version: FBEZC48C
User Capacity: 250,059,350,016 bytes
Device is: Not in smartctl database [for details use: -P showall]
ATA Version is: 8
ATA Standard is: ATA-8-ACS revision 3f
Local Time is: Wed May 25 10:10:39 2011 CST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled //表示啟用了smart支持
如果看到SMART support is: Disabled表示SMART未啟用,執行如下命令,啟動SMART:
# smartctl --smart=on --offlineauto=on --saveauto=on /dev/sda
smartctl 5.40 2010-10-16 r3189 [i386-redhat-linux-gnu] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net
=== START OF ENABLE/DISABLE COMMANDS SECTION ===
SMART Enabled.
SMART Attribute Autosave Enabled.
SMART Automatic Offline Testing Enabled every four hours.
現在硬盤的SMART功能已經被打開,執行如下命令查看硬盤的健康狀況:
# smartctl -H /dev/sda
smartctl 5.40 2010-10-16 r3189 [i386-redhat-linux-gnu] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
請注意result后邊的結果:PASSED,這表示硬盤健康狀態良好;如果這里顯示Failure,那么最好立刻給服務器更換硬盤。SMART只能報告磁盤已經不再健康,但是報警后還能繼續運行多久是不確定的。通常,SMART報警參數是有預留的,磁盤報警后,不會當場壞掉,一般能堅持一段時間,有的硬盤SMART報警后還繼續跑了好幾年,有的硬盤SMART報錯后幾天就壞了。但是一旦出現報警,僥幸心里是萬萬不能的……
如果需要定期登錄到服務器上運行smartctl比較麻煩時,linux還提供了系統進程smartd,編輯配置文件:/etc/smartd.conf。
這個配置文件中大部分可能是注釋掉的說明,只需要寫入和當前硬盤相關的配置即可:
/dev/sda -H -m test@test123123.com // 監控磁盤的健康狀態,當SMART中報告 PASSED的時候不理睬。一旦出現 Failure,立刻用郵件通知用戶指定的郵箱
/dev/sda -a -m admin@example.com,root@localhost // 監控磁盤的所有屬性,當SMART中報告 PASSED的時候不理睬。一旦出現 Failure,立刻用郵件通知用戶指定的郵箱
/dev/twa0 -d 3ware,0 -a -s L/../../7/00 // 監控3ware 9000控制器上的第一個ATA磁盤的所有屬性,在每個禮拜天的00:00--01:00進行長格式的自我檢測
/dev/sg2 -d areca,1 -a -s L/../(01|15)/./22 // 監控Areca Raid控制器上的第一個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/smartd restart 即可生效。
其他和smartd.conf相關的配置可參見: http://smartmontools.sourceforge.net/man/smartd.conf.5.html
使用badblocks檢測硬盤壞塊
badblocks命令可以檢查磁盤裝置中損壞的區塊。執行該指令時須指定所要檢查的磁盤裝置,及此裝置的磁盤區塊數。
Ubuntu軟件包
e2fsprogs - ext2/ext3/ext4 file system utilities
語法與參數
語法:
badblocks [-svw][-b ][-o ][磁盤裝置][磁盤區塊數][啟始區塊]
參數:
-b 指定磁盤的區塊大小,單位為字節。
-o 將檢查的結果寫入指定的輸出文件。
-s 在檢查時顯示進度。
-v 執行時顯示詳細的信息。
-w 在檢查時,執行寫入測試。 [磁盤裝置] 指定要檢查的磁盤裝置。[磁盤區塊數] 指定磁盤裝置的區塊總數。 [啟始區塊] 指定要從哪個區塊開始檢查。
檢測磁盤壞塊
# badblocks -s -v /dev/sda
正在檢查從 0 到 244198583的塊
Checking for bad blocks (read-only test): ^C0.10% done, 0:04 elapsed
Interrupted at block 272896
# badblocks -w -s -v /dev/sda1
Checking for bad blocks in read-write mode
From block 0 to 25607577
Testing with pattern 0xaa: ^C0.73% done, 0:03 elapsed
注意,不能以寫的方式檢測已經掛載的硬盤
使用hdparm測試
Ubuntu軟件包
hdparm - tune hard disk parameters for high performance
測試硬盤讀寫速度
# hdparm -Tt /dev/sda
/dev/sda:
Timing cached reads:
1918 MB in 2.00 seconds = 959.62 MB/sec
Timing buffered disk reads: 184 MB in 3.00 seconds = 61.26 MB/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硬盤的自動省電功能。