RAID 0一時爽,資料(數據)火葬場
這次可說是一場「震撼教育」
RAID可以利用兩顆以上的硬碟組成一個大容量的儲存空間,組合方式有強調速度的RAID 0、最安全的RAID 1,以及速度與安全兼備的RAID 5、RAID 6等種類;這宗案例中我選的是RAID 0。一開始還是相安無事,結果過了一夜…
GG了。
肇禍原因
此次我所建置的RAID陣列是位在我自行建置的Kodi媒體中心電腦上使用mdadm這一工具,由兩顆160GB的硬碟組成,合計320GB的儲存空間,且得益於RAID 0的特性,傳輸速度提升為兩倍(但受制於網路速度,感受不到差異)。
然而過了一夜再開機(晚上我會將它關機;如果沒關的話,在早上也會自動重開機一次),竟然停在Linux的救援介面下(會自動進入此介面,代表定義於fstab檔案中的磁碟區,在開機過程有一兩個未能掛載)!後來經過一查,發現是昨天建的RAID 0不見了。
那麼問題來了,昨天還好好的,怎麼過了一夜就出包了?這著實令我百思不得其解。
追根究底找真相
經過一陣調查,發現是所建立的RAID陣列當中,有一顆硬碟「消失」了。但是,我用指令查了查,發現所安裝的硬碟全都在(連系統所在硬碟在內,總共三顆),並未短少;可是偏偏就是有一顆用作RAID的死也不肯配合。我嘗試將硬碟的SATA線對調、更換,然而都無濟於事。但是在這一連串排錯過程中,我發現了一件事:
有一顆硬碟雖然在BIOS、系統當中都能被偵測到,但是在RAID陣列中就是不出現。
舉個例子。假設有三顆硬碟,系統所在硬碟為/dev/sda,用作RAID的兩顆硬碟代號分別為/dev/sdb和/dev/sdc。
假設發生問題的是/dev/sdb,若我將sdb與sdc位置對調,那麼下次開機時出線此問題的硬碟代號就會變成/dev/sdc。
所以問題就在於這顆硬碟其實是正常的,只是不知為何與RAID 0格格不入。
到這裡,整個問題已經有個底了。
我的解決方法
既然確認硬碟是正常的,也就表示其中所包含的檔案也是完好無損的。那麼,是不是可以將這顆硬碟上的全部內容,「完全」克隆到另一顆容量相同的硬碟上,藉此令這個RAID恢復正常運作?
我知道RAID 0理論上只要有一顆硬碟故障了,則這個RAID上存放的所有檔案基本上就是沒救了。但是如今的問題是有點類似,但又不完全是如此:
- 硬碟在BIOS及系統當中都可被正確識別出來,說明硬碟本身是沒問題的
- 這顆硬碟有經過壞軌測試,檢測結果是完全正常,因此可以排除壞軌造成的故障
- 這顆硬碟的關鍵SMART參數(05、C5、C6等)並沒有異常
而我手邊正好有一顆容量相同的空硬碟,於是我就決定做個實驗:將出問題的硬碟內容完全克隆到這顆空硬碟裡,以此取代該硬碟與另一顆正常的硬碟組成RAID 0。理論上這樣是可行的,因為RAID 0 並沒有說會綁硬碟型號啊(笑)!
原本我是打算用再生龍複製,結果並沒有複製成功。而在這時我馬上就意識到:用dd這個指令!於是,我便改下這道指令:
sudo dd if=/dev/sdb of=/dev/sdc conv=noerror,sync status=progress
這道指令就是使用dd,將出問題的硬碟(代號為dev/sdb)所有內容複製到另一顆硬碟(代號/dev/sdc),無論是否遇到錯誤都繼續複製,並以同步I/O方式複製,同時顯示複製進度。
最終結果
經過一段時間的複製終於完成,沒有任何錯誤。最後我將兩顆硬碟接上,令其以RAID 0方式運作,結果:成功了!系統終於順利抓到陣列中的兩顆硬碟了。當然,這個陣列也得以順利掛載,讓我能夠將其中的所有檔案搶救出來。
完成了搶救工作之後,我便將這個RAID刪除,回復成各個硬碟各司其職的狀態。如果往後要組RAID的話,我有99%的機率會選擇RAID 1。這樣雖然不能用上多一倍的空間,但至少在出問題的時候,只要將出問題的硬碟替換掉,就能讓檔案回來了,而不必像這樣大費周章複製整顆硬碟。
結語
RAID 0在安全性上,雖然理論上來說是沒有任何安全性可言(一顆壞掉,資料就全沒了)。但假如出問題的硬碟仍然可以被系統識別,且沒有壞軌,那麼還是可以透過將硬碟完全克隆到另一顆同容量或更大容量的硬碟,來讓無法運作的RAID 0重新得以恢復運作,爭取到搶救寶貴資料的機會。不過切記:
硬碟本身必須可以被系統識別,且上面沒有出現壞軌
才能利用這個方法來嘗試搶救。如果有壞軌,可以用HDD Regenerator嘗試修復,只要不是很嚴重,原則上都能修好且能撐上一陣子不再復發;但如果嚴重到連SMART都報錯了,那麼這顆硬碟在完成救援之後就別再用了,不然萬一又出問題,可就未必還能這麼幸運了。
當然,你還得有一套Linux系統,且需要一些Linux的基礎知識(這些可以在網路上找到有關教學資源)。不過這不是個大問題,你只要利用Linux的LiveCD/DVD/USB開機進入系統之就可以進行了。