如何恢復崩潰的 Linux md RAID5 陣列?
前段時間我家裡有一個RAID5系統。4 個磁碟中的一個發生故障,但在移除並放回它之後似乎沒問題,所以我開始重新同步。完成後,令我驚恐的是,4 個磁碟中有 3 個發生故障。但是我不相信這是可能的。磁碟上有多個分區,每個分區屬於不同的 RAID 陣列。
- md0 是一個 RAID1 陣列,由 sda1、sdb1、sdc1 和 sdd1 組成。
- md1 是一個 RAID5 陣列,由 sda2、sdb2、sdc2 和 sdd2 組成。
- md2 是一個 RAID0 陣列,由 sda3、sdb3、sdc3 和 sdd3 組成。
md0 和 md2 報告所有磁碟已啟動,而 md1 報告 3 個失敗(sdb2、sdc2、sdd2)。我的理解是,當硬碟驅動器出現故障時,所有分區都應該失去,而不僅僅是中間分區。
那時我關閉了電腦並拔下驅動器。從那以後,我一直在使用帶有較小新磁碟的電腦。
有沒有恢復數據的希望?我能以某種方式讓 mdadm 相信我的磁碟確實在工作嗎?唯一可能真正有問題的磁碟是 sdc 但其他陣列也報告了該磁碟。
更新
我終於有機會連接舊磁碟並從 SystemRescueCd 啟動這台機器。以上都是憑記憶寫的。現在我有一些硬數據。這是輸出
mdadm --examine /dev/sd*2
/dev/sda2: Magic : a92b4efc Version : 0.90.00 UUID : 53eb7711:5b290125:db4a62ac:7770c5ea Creation Time : Sun May 30 21:48:55 2010 Raid Level : raid5 Used Dev Size : 625064960 (596.11 GiB 640.07 GB) Array Size : 1875194880 (1788.33 GiB 1920.20 GB) Raid Devices : 4 Total Devices : 4 Preferred Minor : 1 Update Time : Mon Aug 23 11:40:48 2010 State : clean Active Devices : 3 Working Devices : 4 Failed Devices : 1 Spare Devices : 1 Checksum : 68b48835 - correct Events : 53204 Layout : left-symmetric Chunk Size : 64K Number Major Minor RaidDevice State this 0 8 2 0 active sync /dev/sda2 0 0 8 2 0 active sync /dev/sda2 1 1 8 18 1 active sync /dev/sdb2 2 2 8 34 2 active sync /dev/sdc2 3 3 0 0 3 faulty removed 4 4 8 50 4 spare /dev/sdd2 /dev/sdb2: Magic : a92b4efc Version : 0.90.00 UUID : 53eb7711:5b290125:db4a62ac:7770c5ea Creation Time : Sun May 30 21:48:55 2010 Raid Level : raid5 Used Dev Size : 625064960 (596.11 GiB 640.07 GB) Array Size : 1875194880 (1788.33 GiB 1920.20 GB) Raid Devices : 4 Total Devices : 4 Preferred Minor : 1 Update Time : Mon Aug 23 11:44:54 2010 State : clean Active Devices : 2 Working Devices : 3 Failed Devices : 1 Spare Devices : 1 Checksum : 68b4894a - correct Events : 53205 Layout : left-symmetric Chunk Size : 64K Number Major Minor RaidDevice State this 1 8 18 1 active sync /dev/sdb2 0 0 0 0 0 removed 1 1 8 18 1 active sync /dev/sdb2 2 2 8 34 2 active sync /dev/sdc2 3 3 0 0 3 faulty removed 4 4 8 50 4 spare /dev/sdd2 /dev/sdc2: Magic : a92b4efc Version : 0.90.00 UUID : 53eb7711:5b290125:db4a62ac:7770c5ea Creation Time : Sun May 30 21:48:55 2010 Raid Level : raid5 Used Dev Size : 625064960 (596.11 GiB 640.07 GB) Array Size : 1875194880 (1788.33 GiB 1920.20 GB) Raid Devices : 4 Total Devices : 4 Preferred Minor : 1 Update Time : Mon Aug 23 11:44:54 2010 State : clean Active Devices : 1 Working Devices : 2 Failed Devices : 2 Spare Devices : 1 Checksum : 68b48975 - correct Events : 53210 Layout : left-symmetric Chunk Size : 64K Number Major Minor RaidDevice State this 2 8 34 2 active sync /dev/sdc2 0 0 0 0 0 removed 1 1 0 0 1 faulty removed 2 2 8 34 2 active sync /dev/sdc2 3 3 0 0 3 faulty removed 4 4 8 50 4 spare /dev/sdd2 /dev/sdd2: Magic : a92b4efc Version : 0.90.00 UUID : 53eb7711:5b290125:db4a62ac:7770c5ea Creation Time : Sun May 30 21:48:55 2010 Raid Level : raid5 Used Dev Size : 625064960 (596.11 GiB 640.07 GB) Array Size : 1875194880 (1788.33 GiB 1920.20 GB) Raid Devices : 4 Total Devices : 4 Preferred Minor : 1 Update Time : Mon Aug 23 11:44:54 2010 State : clean Active Devices : 1 Working Devices : 2 Failed Devices : 2 Spare Devices : 1 Checksum : 68b48983 - correct Events : 53210 Layout : left-symmetric Chunk Size : 64K Number Major Minor RaidDevice State this 4 8 50 4 spare /dev/sdd2 0 0 0 0 0 removed 1 1 0 0 1 faulty removed 2 2 8 34 2 active sync /dev/sdc2 3 3 0 0 3 faulty removed 4 4 8 50 4 spare /dev/sdd2
自上次啟動以來,情況似乎發生了變化。如果我正確閱讀了 sda2,sdb2 和 sdc2 正在工作並包含同步數據,而 sdd2 是備用的。我清楚地記得看到 3 個故障磁碟,但這是個好消息。然而陣列仍然無法正常工作:
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md125 : inactive sda2[0](S) sdb2[1](S) sdc2[2](S) 1875194880 blocks md126 : inactive sdd2[4](S) 625064960 blocks md127 : active raid1 sda1[0] sdd1[3] sdc1[2] sdb1[1] 64128 blocks [4/4] [UUUU] unused devices: <none>
md0 似乎已重命名為 md127。md125 和 md126 很奇怪。它們應該是一個數組而不是兩個。以前叫md1。md2 完全消失了,但那是我的交換,所以我不在乎。
我可以理解不同的名稱,這並不重要。但是為什麼具有 3 個“活動同步”磁碟的陣列無法讀取?sdd2 在一個單獨的數組中是怎麼回事?
更新
備份超級塊後,我嘗試了以下操作:
root@sysresccd /root % mdadm --stop /dev/md125 mdadm: stopped /dev/md125 root@sysresccd /root % mdadm --stop /dev/md126 mdadm: stopped /dev/md126
到目前為止,一切都很好。由於 sdd2 是備用的,我還不想添加它。
root@sysresccd /root % mdadm --assemble /dev/md1 /dev/sd{a,b,c}2 missing mdadm: cannot open device missing: No such file or directory mdadm: missing has no superblock - assembly aborted
顯然我不能那樣做。
root@sysresccd /root % mdadm --assemble /dev/md1 /dev/sd{a,b,c}2 mdadm: /dev/md1 assembled from 1 drive - not enough to start the array. root@sysresccd /root % cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md1 : inactive sdc2[2](S) sdb2[1](S) sda2[0](S) 1875194880 blocks md127 : active raid1 sda1[0] sdd1[3] sdc1[2] sdb1[1] 64128 blocks [4/4] [UUUU] unused devices: <none>
那也沒有用。讓我們嘗試使用所有磁碟。
mdadm --stop /dev/md1 mdadm: stopped /dev/md1 root@sysresccd /root % mdadm --assemble /dev/md1 /dev/sd{a,b,c,d}2 mdadm: /dev/md1 assembled from 1 drive and 1 spare - not enough to start the array. root@sysresccd /root % cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md1 : inactive sdc2[2](S) sdd2[4](S) sdb2[1](S) sda2[0](S) 2500259840 blocks md127 : active raid1 sda1[0] sdd1[3] sdc1[2] sdb1[1] 64128 blocks [4/4] [UUUU] unused devices: <none>
沒有運氣。基於這個答案,我打算嘗試:
mdadm --create /dev/md1 --assume-clean --metadata=0.90 --bitmap=/root/bitmapfile --level=5 --raid-devices=4 /dev/sd{a,b,c}2 missing mdadm --add /dev/md1 /dev/sdd2
安全嗎?
更新
我在我的評論中發布了我用來製作該表的超級塊解析器腳本。也許有人會發現它很有用。感謝你的幫助。
首先檢查磁碟,嘗試執行智能自檢
for i in a b c d; do smartctl -s on -t long /dev/sd$i done
可能需要幾個小時才能完成,但每隔幾分鐘檢查一次每個驅動器的測試狀態,即
smartctl -l selftest /dev/sda
如果由於讀取錯誤而導致磁碟狀態報告未完成,則該磁碟應被認為是不安全的 md1 重組。自檢完成後,您可以開始嘗試重新組裝陣列。或者,如果您想格外小心,請在繼續之前將磁碟移動到另一台機器上(以防 ram/controller/etc 損壞)。
最近,我遇到了一個和這個一模一樣的案例。一個驅動器出現故障,我在陣列中重新添加,但在重建期間 4 個驅動器中的 3 個完全出現故障。/proc/mdadm 的內容與您的相同(可能順序不同)
md1 : inactive sdc2[2](S) sdd2[4](S) sdb2[1](S) sda2[0](S)
但我很幸運並用這個重新組裝了陣列
mdadm --assemble /dev/md1 --scan --force
通過查看您提供的 –examine 輸出,我可以判斷發生了以下情況:sdd2 失敗,您將其刪除並重新添加,因此它成為嘗試重建的備用驅動器。但是在重建 sda2 失敗,然後 sdb2 失敗。所以事件計數器在 sdc2 和 sdd2 中更大,它們是陣列中最後一個活動驅動器(儘管 sdd 沒有機會重建,所以它是最過時的)。由於事件計數器的差異, –force 將是必要的。所以你也可以試試這個
mdadm --assemble /dev/md1 /dev/sd[abc]2 --force
總而言之,我認為如果上述命令失敗,您應該嘗試像這樣重新創建數組:
mdadm --create /dev/md1 --assume-clean -l5 -n4 -c64 /dev/sd[abc]2 missing
如果你這樣做了
--create
,這missing
部分很重要,不要嘗試在陣列中添加第四個驅動器,因為這樣就會開始建構,你會失去數據。創建缺少驅動器的陣列不會更改其內容,您將有機會在其他地方獲取副本(raid5 與 raid1 的工作方式不同)。如果無法啟動陣列,請在此處嘗試此解決方案(perl 腳本)重新創建陣列
如果您最終設法啟動陣列,則文件系統將不干淨並且可能已損壞。如果一個磁碟在重建過程中出現故障,預計陣列將停止並凍結而不對其他磁碟進行任何寫入。在這種情況下,兩個磁碟發生故障,可能係統正在執行無法完成的寫入請求,因此您失去一些數據的可能性很小,但也有可能您永遠不會注意到它:-)
編輯:添加了一些說明。