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

作者:Rex Tsai | 來自:Rex's blah blah blah | 2011/5/30 8:00:22

養動物園或是管理伺服器的人,難免都會碰到一些硬碟故障的問題。這篇文章略為整理一些在 Linux 上處理壞軌硬體的一些軟體知識與技巧。針對讀者為中等程度以上的使用者,文中僅僅提供參考資料,不說明實際操作或指令明細,請自行參考相關文件。作者以最大善意盡力提供參考資訊,但文中如有疏漏或錯誤造成資料遺失,作者不負任何責任。

文中說明均以 Linux href="http://en.wikipedia.org/wiki/Extended_file_system">Extended file system 為主,操作平臺是 href="http://www.debian.org/">Debian GNU/Linux. 所提及工具授權均為 href="http://en.wikipedia.org/wiki/Free_and_open_source_software">FLOSS 。假設錯誤硬碟為 /dev/sdb,所有指令需要以 root 執行。

章節結構

  • 錯誤類型。
  • 壞軌測試。
  • 預先偵測。
  • 備份與資料回復。
  • 排除壞軌磁區。
  • 送修與資料清除。

錯誤類型

這裡討論的硬碟資料損毀,不外乎物理性傷害,摔落、靜電、停電、過熱、原件老化等等。這些傷害會造成邏輯性 (logical error) 上或物理 (physical error) 性的錯誤。

所謂的邏輯性錯誤,就是硬碟離線時,暫存資料來不及寫入,導致資料錯誤異常。所幸大部分的檔案系統都會有一個檔案系統狀態 (Filesystem state) 的值,若是最後使用未順利完成卸載 (umount),下次掛載時就會提示要求作 href="http://wiki.debian.org.hk/w/Configure_regular_filesystem_check#.E6.AA.94.E6.A1.88.E7.B3.BB.E7.B5.B1.E7.8B.80.E6.85.8B_.28Filesystem_state.29">fsck 檢查。如果是href="http://en.wikipedia.org/wiki/Journaling_file_system">日誌式檔案系統如 href="http://en.wikipedia.org/wiki/Ext3">ext3/href="http://en.wikipedia.org/wiki/Ext4">ext4,則會試著回復未完成的操作。這種錯誤偶爾會破壞檔案,fsck/e2fsck 可能會將錯誤檔案移到 lost+found 目錄下,造成困擾,但問題不大。

物理性錯誤指的是硬體磁盤受到損壞,該段href="http://en.wikipedia.org/wiki/Disk_sector">磁區無法讀取,也就是href="http://en.wikipedia.org/wiki/Bad_sector">壞軌。肯定導致資料遺失,最常見的是系統吐出 I/O Error,無法讀取該檔案。實際的症狀是href="http://en.wikipedia.org/wiki/Access_time">讀取變慢、聽到 href="http://en.wikipedia.org/wiki/Spin-up">Spin-up 時的卡卡聲(href="http://en.wikipedia.org/wiki/Click_of_death#Hard_disk">Clicking sound),甚至是系統當機等問題。

當壞軌開始產生時,通常代表硬碟壽命將至,得趕快開始更換健康新硬碟。這篇文章主要討論的是壞軌這種物理性錯誤的處理辦法。

壞軌測試

最基本的測試方法是利用 href="http://en.wikipedia.org/wiki/Badblocks">badblocks (8) 來檢測硬碟是否存在壞軌,這個指令不分檔案系統。若是含有重要資料的硬碟,應該先作預設的非破壞性唯讀測試 (non-destructive read-only test),以避免寫入測試時異常,造成磁碟重置離線。

badblocks -vs /dev/sdb

上述只要一發現壞軌,請第一時間拔下備份吧。若是可承受資料損失,可以使用 “-n” 的非破壞性寫入式測試。這基本上會嘗試寫入資料,再三確認硬碟運作正常。

badblocks -nvs /dev/sdb

預先偵測

不過 badblocks 需要在離線時才能執行。很多時候,伺服器是無法忍受長時間的離線檢查的,必須要能夠線上檢測硬碟健康狀況才行。目前市面所有 href="http://en.wikipedia.org/wiki/Advanced_Technology_Attachment">ATA 硬碟都已經支援 href="http://en.wikipedia.org/wiki/Self-Monitoring,_Analysis,_and_Reporting_Technology">S.M.A.R.T. (Self-Monitoring, Analysis, and Reporting Technology),S.M.A.R.T.  基本上提供一個界面讓管理者可以查詢幾個重要的href="http://en.wikipedia.org/wiki/Self-Monitoring,_Analysis,_and_Reporting_Technology#Known_ATA_S.M.A.R.T._attributes">參數。

透過讀取這些參數,管理者能夠預先警覺href="http://en.wikipedia.org/wiki/Hard_disk_failure">硬碟錯誤。根據 Google 的調查十萬顆硬碟後的href="http://antbsd.twbbs.org/~ant/wordpress/?p=592">研究報告 (href="http://research.google.com/pubs/pub32774.html">Failure Trends in a Large Disk Drive Population),S.M.A.R.T. 的數值的確反應硬碟錯誤率 – 六十天內,出現 S.M.A.R.T. 掃描錯誤的硬碟是其他硬碟的 39 倍高。

在 Linux 上,可以使用 href="http://sourceforge.net/apps/trac/smartmontools/wiki">smartmontools 中的 smartctl (8) 來查詢硬碟的 S.M.A.R.T. 狀態。指令如下

smartctl --attributes /dev/sdb

根據 Google 的研究以及 href="http://smartmontools.sourceforge.net/badblockhowto.html">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 的設定可以參考 title="Permanent Link to 檢測硬碟狀態 – smartmontools" rel="bookmark" href="http://blog.ssh.tw/?p=778">檢測硬碟狀態 – smartmontools 一文。S.M.A.R.T. 也支援 Self-Test,可以讓硬碟作效能與功能檢查,詳情請見 smartctl (8)./>

備份與資料回復

在發現壞軌之際,應該第一優先備份資料。如果還能夠掛起檔案系統,則趕緊利用 href="http://en.wikipedia.org/wiki/Rsync">rsync, href="http://www.gnu.org/software/tar/">tar 等工具備份檔案。或者利用 href="http://en.wikipedia.org/wiki/Dd_%28Unix%29">dd 將整顆硬碟資料或分割區存檔,未來置換到新硬碟上

dd if=/dev/sdb of=sdb.img

若要確保資料正確複製,可使用 href="http://dcfldd.sourceforge.net/">dcfldd 來複製,它會邊複製邊作 href="http://en.wikipedia.org/wiki/Hash_function">hash 確保資料複製正確。不過由於壞軌處常常無法讀取,這會造成 dd 執行失敗。此時可以改用 href="http://www.gnu.org/software/ddrescue/ddrescue.html">dd_rescue, 它可以略過無法讀取的部分,儘可能複製其他健康的資料。

不過天有不測風雲,人有旦夕禍福。萬一資料損壞的區域不是資料區域,而是存放重要的系統資訊,那就需要額外的處置。建議無論任何時候,都不要在壞硬碟上直接操作,永遠先備份,再於備份碟上進行處理。以下略談三種情境的可用工具

  • 若不幸你的 href="http://en.wikipedia.org/wiki/Partition_table_%28master_boot_record%29">MBR 爛掉以至於 partition table 消失,可以嘗試使用href="http://en.wikipedia.org/wiki/Partition_table_%28master_boot_record%29"> href="http://www.cgsecurity.org/wiki/TestDisk">testdisk 來猜測各 partition table 的位址,或許可以救回 partition table 資料。
  • 若是檔案系統的 superblock 損壞,會看到 “can’t read superblock” 訊息,ext? 系列檔案系統通常有多個 superblock 備份,你可以從備份的 superblock 進行復原工作 (href="http://www.cyberciti.biz/faq/recover-bad-superblock-from-corrupted-partition/">Recover Corrupted Partition From A Bad Superblock,style="font-family: 宋体;"> href="http://blogold.chinaunix.net/u1/48373/showart_1331657.html">硬盘href="http://blogold.chinaunix.net/u1/48373/showart_1331657.html">ext2/3style="font-family: 宋体;">文件系统superblockstyle="font-family: 宋体;">损坏修复试验)。
  • 若你手忙腳亂已經把硬碟重新格式化,那麼只能透過 href="http://foremost.sourceforge.net/">foremost 或 href="http://www.sleuthkit.org/sleuthkit/">Sleuth Kit 慢慢的揀出硬碟中仍可辨識的檔案。祝你幸運。

排除壞軌區域

通常如果你的硬碟還在保固範圍,一般原廠均會更換健康的硬碟給你。但如果硬碟已經超過保固,壞軌硬碟仍堪用,可以用來存一些低度重要的資料。

對於這些壞軌,可以用 href="http://en.wikipedia.org/wiki/Sector_slipping">sector slipping 或叫做 href="http://www.pcguide.com/ref/hdd/geom/errorMapping-c.html">defect mapping 的機制來跳過不用。基本上分成兩種形式,一是透過href="http://en.wikipedia.org/wiki/Disk_controller">硬碟控制器或是透過檔案系統的 bad block table 來記錄。

傳統的 (1990 年代中期以前的硬碟)是可以進行href="http://en.wikipedia.org/wiki/Disk_formatting#Low-level_formatting_.28LLF.29_of_hard_disks">低階格式化 (href="http://www.pcguide.com/ref/hdd/geom/formatLow-c.html">Low-Level Formatting) 的,透過原廠的指令來重新定義物理儲存格式、重新定義 href="http://en.wikipedia.org/wiki/Cylinder-head-sector">CHS、若是硬碟中有壞軌,可以在低階格式化時避開不用。

由於低階格式化常因為操作錯誤而href="http://en.wikipedia.org/wiki/Brick_%28electronics%29">損壞 (bricked) 硬碟,新款硬碟已經不提供使用者透過href="http://en.wikipedia.org/wiki/SCSI_Format_Unit_Command">指令作低階格式化的工具。取而代之的是透過 href="http://www.dataclinic.co.uk/hard-drive-defects-table.htm">hard-drive defect management 功能,以 href="http://www.dataclinic.co.uk/hard-drive-defects-table.htm">Hard drive defects table – P & G Lists 來記錄 href="http://www.mjm.co.uk/sectorremapping.html">Bad Sector Mapping。所謂 Primary defect list 是代表出廠時已經產生缺陷的磁區列表,而 Grown defect list 則是使用中產生缺陷的磁區列表。

當硬碟發現壞軌時,便會自動將該磁區列入 G-List 中,並從備用的磁區中替換。因此現在已經沒有所謂低階格式化,目前所謂低階格式化大多指的是 Zero-filled,對磁區填入空值,強迫硬碟重新分配損壞磁區,這也是前述 S.M.A.R.T. 所謂 Reallocated Sectors。

所以你可以做的事情是對壞軌區域寫入空值,迫使它重置。你可以直接透過一開始的 badblocks 所產生之數值直接覆寫錯誤區塊,範例請見 href="http://smartmontools.sourceforge.net/badblockhowto.html">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 等品牌,則在硬碟上留有 href="http://en.wikipedia.org/wiki/Differential_TTL">TTLhref="http://en.wikipedia.org/wiki/Serial_communication">serial communication 的href="http://sites.google.com/site/seagatefix/">界面,於是你可以透過終端機連上硬碟韌體,以 href="http://www.scribd.com/doc/39042992/Seagate-Diagnostic-Command">Diagnostic Commands 進行一些偵錯以及重新格式化的動作。

送修與資料清除

爲了避免href="http://zh.wikipedia.org/wiki/%E9%99%B3%E5%86%A0%E5%B8%8C%E8%A3%B8%E7%85%A7%E4%BA%8B%E4%BB%B6">陳冠希裸照事件發生,送修前最好確保資料已經完全刪除。

就如前述所說,若只是進行快速格式化,硬碟資料也可能被href="http://en.wikipedia.org/wiki/Data_remanence">回復。事實上,根據 href="http://en.wikipedia.org/wiki/Peter_Gutmann_%28computer_scientist%29">Peter Gutmann 的在 90 年代的href="http://en.wikipedia.org/wiki/Data_remanence#Feasibility_of_recovering_overwritten_data">研究,他可以用href="http://en.wikipedia.org/wiki/Magnetic_force_microscopy">磁力顯微鏡取得複寫過三十五次以上的磁區資料。而美國 href="http://en.wikipedia.org/wiki/National_Institute_of_Standards_and_Technology">National Institute of Standards and Technology 的研究 rel="nofollow" href="http://csrc.nist.gov/publications/nistpubs/800-88/NISTSP800-88_rev1.pdf">“Guidelines for Media Sanitization” 或title="View content where Author is Craig Wright" href="http://www.springerlink.com/content/?Author=Craig+Wright"> Craig Wright, Dave Kleiman, Shyaam Sundhar R.S. 的論文 href="http://www.springerlink.com/content/408263ql11460147/">Overwriting Hard Drive Data: The Great Wiping Controversy 指出,新型硬碟只需要複寫一次即可。

爲了達到資料保密措施,各國軍方也因此設定有不同的資料清除href="http://en.wikipedia.org/wiki/Data_remanence#Standards">標 href="http://en.wikipedia.org/wiki/Data_erasure#Standards">準。總之,無論你的資料是否重要,在 Linux 上,建議使用這兩種 href="http://lambda-diode.com/software/wipe/">wipe, href="http://code.google.com/p/diskscrub/">scrub 指令之一來抹除資料,這兩種工具支援上述的各國標準。你也可下載使用 href="http://en.wikipedia.org/wiki/Darik%27s_Boot_and_Nuke">DBAN 製作開機片來清除硬碟資料。

References

  • href="http://smartmontools.sourceforge.net/badblockhowto.html">Bad block HOWTO for smartmontools
  • href="http://www.pcguide.com/ref/hdd/geom/format.htm">The PC Guide: Hard Disk Formatting and Capacity
src="http://people.debian.org.tw/~chihchun/?ak_action=api_record_view&id=2957&type=feed" alt="" />