2013年10月29日 星期二

Linux 上處理壞軌硬碟的兩三事

Linux 上處理壞軌硬碟的兩三事


養動物園或是管理伺服器的人,難免都會碰到一些硬碟故障的問題。這篇文章略為整理一些在 Linux 上處理壞軌硬體的一些軟體知識與技巧。針對讀者為中等程度以上的使用者,文中僅僅提供參考資料,不說明實際操作或指令明細,請自行參考相關文件。作者以最大善意盡力提供參考資訊,但文中如有疏漏或錯誤造成資料遺失,作者不負任何責任。
文中說明均以 Linux Extended file system 為主,操作平臺是 Debian GNU/Linux. 所提及工具授權均為 FLOSS 。假設錯誤硬碟為 /dev/sdb,所有指令需要以 root 執行。
章節結構
  • 錯誤類型。
  • 壞軌測試。
  • 預先偵測。
  • 備份與資料回復。
  • 排除壞軌磁區。
  • 送修與資料清除。

錯誤類型

這裡討論的硬碟資料損毀,不外乎物理性傷害,摔落、靜電、停電、過熱、原件老化等等。這些傷害會造成邏輯性 (logical error) 上或物理 (physical error) 性的錯誤。
所謂的邏輯性錯誤,就是硬碟離線時,暫存資料來不及寫入,導致資料錯誤異常。所幸大部分的檔案系統都會有一個檔案系統狀態 (Filesystem state) 的值,若是最後使用未順利完成卸載 (umount),下次掛載時就會提示要求作 fsck 檢查。如果是日誌式檔案系統如 ext3/ext4,則會試著回復未完成的操作。這種錯誤偶爾會破壞檔案,fsck/e2fsck 可能會將錯誤檔案移到 lost+found 目錄下,造成困擾,但問題不大。
物理性錯誤指的是硬體磁盤受到損壞,該段磁區無法讀取,也就是壞軌。肯定導致資料遺失,最常見的是系統吐出 I/O Error,無法讀取該檔案。實際的症狀是讀取變慢、聽到 Spin-up 時的卡卡聲(Clicking sound),甚至是系統當機等問題。
當壞軌開始產生時,通常代表硬碟壽命將至,得趕快開始更換健康新硬碟。這篇文章主要討論的是壞軌這種物理性錯誤的處理辦法。

壞軌測試

最基本的測試方法是利用 badblocks (8) 來檢測硬碟是否存在壞軌,這個指令不分檔案系統。若是含有重要資料的硬碟,應該先作預設的非破壞性唯讀測試 (non-destructive read-only test),以避免寫入測試時異常,造成磁碟重置離線。
badblocks -vs /dev/sdb
上述只要一發現壞軌,請第一時間拔下備份吧。若是可承受資料損失,可以使用 “-n” 的非破壞性寫入式測試。這基本上會嘗試寫入資料,再三確認硬碟運作正常。
badblocks -nvs /dev/sdb

預先偵測

不過 badblocks 需要在離線時才能執行。很多時候,伺服器是無法忍受長時間的離線檢查的,必須要能夠線上檢測硬碟健康狀況才行。目前市面所有 ATA 硬碟都已經支援S.M.A.R.T. (Self-Monitoring, Analysis, and Reporting Technology),S.M.A.R.T.  基本上提供一個界面讓管理者可以查詢幾個重要的參數
透過讀取這些參數,管理者能夠預先警覺硬碟錯誤。根據 Google 的調查十萬顆硬碟後的研究報告 (Failure Trends in a Large Disk Drive Population),S.M.A.R.T. 的數值的確反應硬碟錯誤率 – 六十天內,出現 S.M.A.R.T. 掃描錯誤的硬碟是其他硬碟的 39 倍高。
在 Linux 上,可以使用 smartmontools 中的 smartctl (8) 來查詢硬碟的 S.M.A.R.T. 狀態。指令如下
smartctl --attributes /dev/sdb
根據 Google 的研究以及 Bad block HOWTO for smartmontools 指出,與硬碟失效關係最高的數值是 Reallocated Sectors Count/Reallocations event count, Current Pending Sector Count, Uncorrectable Sector Count。這幾組數據代表硬碟發現該磁區已經損毀,它會重新從備用磁區分配一位置取代該損壞磁區,或磁區已發現問題尚未替換或無法替換。這通常可以視為磁區損耗 (surface wear) 的狀況。當你發現這些值不為 0 時,就該開始準備備份資料並作壞軌檢查了。
除了使用 smartctl 手動檢測外,也可以設定 smarted,讓系統自動觀測 S.M.A.R.T. 狀態,有錯誤會顯示於桌面訊息或發送郵件。smartd 的設定可以參考 檢測硬碟狀態 – smartmontools 一文。S.M.A.R.T. 也支援 Self-Test,可以讓硬碟作效能與功能檢查,詳情請見 smartctl (8).

備份與資料回復

在發現壞軌之際,應該第一優先備份資料。如果還能夠掛起檔案系統,則趕緊利用rsynctar 等工具備份檔案。或者利用 dd 將整顆硬碟資料或分割區存檔,未來置換到新硬碟上
dd if=/dev/sdb of=sdb.img
若要確保資料正確複製,可使用 dcfldd 來複製,它會邊複製邊作 hash 確保資料複製正確。不過由於壞軌處常常無法讀取,這會造成 dd 執行失敗。此時可以改用dd_rescue, 它可以略過無法讀取的部分,儘可能複製其他健康的資料。
不過天有不測風雲,人有旦夕禍福。萬一資料損壞的區域不是資料區域,而是存放重要的系統資訊,那就需要額外的處置。建議無論任何時候,都不要在壞硬碟上直接操作,永遠先備份,再於備份碟上進行處理。以下略談三種情境的可用工具

排除壞軌區域

通常如果你的硬碟還在保固範圍,一般原廠均會更換健康的硬碟給你。但如果硬碟已經超過保固,壞軌硬碟仍堪用,可以用來存一些低度重要的資料。
對於這些壞軌,可以用 sector slipping 或叫做 defect mapping 的機制來跳過不用。基本上分成兩種形式,一是透過硬碟控制器或是透過檔案系統的 bad block table 來記錄。
傳統的 (1990 年代中期以前的硬碟)是可以進行低階格式化 (Low-Level Formatting) 的,透過原廠的指令來重新定義物理儲存格式、重新定義 CHS、若是硬碟中有壞軌,可以在低階格式化時避開不用。
由於低階格式化常因為操作錯誤而損壞 (bricked) 硬碟,新款硬碟已經不提供使用者透過指令作低階格式化的工具。取而代之的是透過 hard-drive defect management 功能,以 Hard drive defects table – P & G Lists 來記錄 Bad Sector Mapping。所謂 Primary defect list 是代表出廠時已經產生缺陷的磁區列表,而 Grown defect list 則是使用中產生缺陷的磁區列表。
當硬碟發現壞軌時,便會自動將該磁區列入 G-List 中,並從備用的磁區中替換。因此現在已經沒有所謂低階格式化,目前所謂低階格式化大多指的是 Zero-filled,對磁區填入空值,強迫硬碟重新分配損壞磁區,這也是前述 S.M.A.R.T. 所謂 Reallocated Sectors。
所以你可以做的事情是對壞軌區域寫入空值,迫使它重置。你可以直接透過一開始的 badblocks 所產生之數值直接覆寫錯誤區塊,範例請見 Bad block HOWTO for smartmontools
上述 HOWTO 中詳述了,怎麼計算 e2fsck 吐出來數值,人工計算有點麻煩。以下介紹如何處理利用工具自動處理。

不保留資料

如果確認整顆硬碟資料都不需要保留,可以直接下達一下 dd 指令,重寫整顆硬碟。
dd if=/dev/zero of=/dev/sdb
或者在格式化時下達 -c -c 參數,讓 mkfs.ext3 順便檢查壞軌。
mkfs.ext3 -c -c /dev/sdb1

保留資料

如果硬碟已有資料,並想保留此資料,可以用 badblocks 檢查,並生成 badblocks list,再將 badblocks 吐出的列表,餵給 e2fsck -l.。但是必須確認執行 badblocks 時,指派了正確的 block size,可用 dumpe2fs -h 確認 block size.然後指示給 badblocks。
上述操作有點複雜,比較保險的做法是直接讓 e2fsck 用 badblocks 去作壞軌檢查,指令如下
e2fsck -k -c  -c /dev/sdb1
如此 e2fsck 會將壞軌寫入檔案系統列表中,可以用下述指令查詢目前壞軌列表
dumpe2fs -b /dev/sdb1

其他做法

本節前述可用低階格式化重置硬碟磁區分配,但是新款硬碟已少提供工具程式給終端使用者。有些工具透過反組譯硬碟韌體的方式取得 vendor specific ATA commands。另外,像是 Seagate 等品牌,則在硬碟上留有 TTLserial communication 的界面,於是你可以透過終端機連上硬碟韌體,以 Diagnostic Commands 進行一些偵錯以及重新格式化的動作。

轉載 : http://blog.nutsfactory.net/2011/05/30/manage-bad-blocks-on-linux/

使用fsck,檢測文件系統錯誤

1.首先先開機進入 Single Mode 
2.接下來進去後先按一下 Enter ,以我的系統為例,輸入下列指令

# mount -a
# df

/dev/da0s1a   10154158      70668   9271158     1%    /
devfs                1          1         0   100%    /dev
/dev/da1s1d 2055518950 1106617646 784459788    59%    /home
/dev/da0s1e   10154158    1037240   8304586    11%    /tmp
/dev/da0s1f   80729226   30448924  43821964    41%    /usr
/dev/da0s1d   81245672     800846  73945174     1%    /var
3.先確認有哪些目錄後,就一個一個 umont 做 fsck 修復的動作,修復完再 mount 回來
# umount /home
# fsck -y /home
# mount /home
若一開始連 / 都 mount 不起來的話,記得要先 fsck 根目錄才行唷!
參考來源:http://bojack.pixnet.net/blog/post/20082824

==========================
補充些fsck的用法:
對文件系統進行檢查,並對損害的文件系統進行修復。
fsck的語法如下:
fsck (-F fstype) (-v) (-m) (-special.)
fsck (-F fstype) (-v) (-y|Y|n|N)
(-o fstype options) (special.)
其中:
-F fstype : 說明被檢查的文件系統的類型
-v : 返回完成的命令行,但不運行
-y|Y: 對所有問題均回答Yes
-n|N: 對所有問題均回答No
-m: 對文件系統進行檢查,不修覆文件系統,
如果文件系統經檢查後是可安裝的,則顯示
ufs fsck : sanity check : /dev/rdsk/c0t0d0s0 okay.
-o: 文件系統類型選項,選項由逗號分隔,
最常用的選項有兩個:
P: 整理(preen)模式
F: 強制檢查模式,此選項忽略文件系統狀態標誌。
1) 移去一個沒有相關文件的目錄入口 答Yes或Y來刪除該目錄入口
2) 重連接一個已分配但不能訪問的文件
對fsck的」RECONNECT?」回答Yes,即把該I節點連接到lost+found目錄下,文件名即是I節點號
3) 連接數調整 回答Yes或Y來改正連接數
4) 自由塊表不一致 回答Yes或Y來修正超級塊
對於fsck詢問的問題大多數情況下都可以用Yes來回答,所以在實際應用時,可以用」 -y」選項來執行該命令
對硬盤進行檢查和修復。