Linux 軟體 RAID6:3 個驅動器離線 - 如何強制線上?
這類似於從 Raid6 mdadm 中掉出的 3 個驅動器 - 重建?除非它不是由於電纜故障。相反,第三個驅動器在重建另一個驅動器期間離線。
驅動器出現故障:
kernel: end_request: I/O error, dev sdc, sector 293732432 kernel: md/raid:md0: read error not correctable (sector 293734224 on sdc).
重新啟動這兩個扇區及其周圍的扇區後都很好。這讓我相信錯誤是間歇性的,因此設備只是花費了太長時間來錯誤糾正扇區並重新映射它。
我希望 RAID 失敗後沒有數據寫入。因此,我希望如果我可以線上啟動最後一個失敗的設備,那麼 RAID 是好的並且 xfs_filesystem 是好的,也許有一些最近失去的文件。
備份 RAID 中的磁碟需要 24 小時,所以我希望該解決方案在第一次就可以工作。
因此,我設置了一個測試場景:
export PRE=3 parallel dd if=/dev/zero of=/tmp/raid${PRE}{} bs=1k count=1000k ::: 1 2 3 4 5 parallel mknod /dev/loop${PRE}{} b 7 ${PRE}{} \; losetup /dev/loop${PRE}{} /tmp/raid${PRE}{} ::: 1 2 3 4 5 mdadm --create /dev/md$PRE -c 4096 --level=6 --raid-devices=5 /dev/loop${PRE}[12345] cat /proc/mdstat mkfs.xfs -f /dev/md$PRE mkdir -p /mnt/disk2 umount -l /mnt/disk2 mount /dev/md$PRE /mnt/disk2 seq 1000 | parallel -j1 mkdir -p /mnt/disk2/{}\;cp /bin/* /mnt/disk2/{}\;sleep 0.5 & mdadm --fail /dev/md$PRE /dev/loop${PRE}3 /dev/loop${PRE}4 cat /proc/mdstat # Assume reboot so no process is using the dir kill %1; sync & kill %1; sync & # Force fail one too many mdadm --fail /dev/md$PRE /dev/loop${PRE}1 parallel --tag -k mdadm -E ::: /dev/loop${PRE}? | grep Upda # loop 2,5 are newest. loop1 almost newest => force add loop1
下一步是添加 loop1 - 這就是我卡住的地方。
之後進行 xfs 一致性檢查。
如果可行,請檢查該解決方案是否也適用於真實設備(例如 4 個 USB 記憶棒)。
魔法似乎是
mdadm -A --force
然後只給已知良好的設備+最後一個失敗的設備。對於測試場景,這將是:mdadm -A --force /dev/md$PRE /dev/loop${PRE}[125]
這將啟動 RAID 設備。
xfs_check
告訴您掛載磁碟以重播日誌:mount /dev/md$PRE /mnt/disk2
此時不要使用該目錄:在測試場景中我至少有一次 xfs 抱怨和崩潰。所以與其:
umount /mnt/disk2
進而:
xfs_check /dev/md$PRE
在 50 TB 的文件系統上,這需要 20 分鐘。奇怪的是,大部分時間是 CPU 時間而不是等待磁碟 I/O。它使用了大約 100 GB RAM。
現在文件系統再次可用:
mount /dev/md$PRE /mnt/disk2
直到最後一切都
sync
還可以。只有在最後一次同步之後寫的東西是易碎的。添加一些備件並進行重建。
明天現有磁碟的複製完成後,我將測試上述內容。如果它有效,那麼上面就是一個答案。否則將開始對原始集合進行新的複制,歡迎提出新的想法(但請在測試場景中進行測試)。
==
現在已添加備件並開始重建。每 1000 個文件都被複製到文件系統上的一個目錄中,這不會導致日誌出現問題。所以看起來文件系統沒問題。使用者是否錯過了一些文件還有待觀察。
==
到目前為止,沒有使用者報告失去的文件,所以它似乎工作。