使用 mdadm 修復兩個 RAID1 磁碟上失去的超級塊
我的 RAID1 陣列工作正常,
/dev/md128
但在重新啟動後似乎完全消失了,mdadm
報告兩個磁碟都缺少超級塊。我的問題是如何解決這個問題?背景:執行 CentOS 7 的系統。有 2xSSD (
sda
,sdb
) 和 2xHDD (sdc
,sdd
)。應該有一個 RAID1 陣列,/dev/md128
但沒有顯示。在重新啟動以進行核心更新之前,它一直執行良好。sdc``sdd
未列出的數組
/etc/mdadm.conf
:# cat /etc/mdadm.conf # mdadm.conf written out by anaconda MAILADDR root AUTO +imsm +1.x -all ARRAY /dev/md/boot level=raid1 num-devices=2 UUID=a2f6b6fe:31c80062:67e7a858:a21502a9 ARRAY /dev/md/boot_efi level=raid1 num-devices=2 UUID=ffbc39c9:ff982933:b77aece5:b44bec5f ARRAY /dev/md/root level=raid1 num-devices=2 UUID=b31f6af6:78305117:7ca807e7:7691d745 ARRAY /dev/md/swap level=raid0 num-devices=2 UUID=f31db9e8:e136e642:1ae8f2d0:7178c956
嘗試手動組裝陣列:
# mdadm --verbose --assemble /dev/md128 /dev/sdc1 /dev/sdd1 mdadm: looking for devices for /dev/md128 mdadm: no recogniseable superblock on /dev/sdc1 mdadm: /dev/sdc1 has no superblock - assembly aborted # mdadm -E /dev/sdc1 mdadm: No md superblock detected on /dev/sdc1. # mdadm -E /dev/sdd1 mdadm: No md superblock detected on /dev/sdd1.
檢查的其他事項:
smartctl
沒有顯示錯誤(兩個驅動器都使用了大約 3 個月大並且很少使用),mdadm -E /dev/sdc
沒有在設備級別顯示任何超級塊。恢復到舊核心,沒有任何變化。我很高興添加其他輸出,只是盡量不要讓問題變得不必要地冗長。任何想法表示讚賞!與此同時,我計劃將
dd
兩個驅動器都放在手頭上。
我解決了這個問題,為了其他人的利益,這對我有用。我通過在陣列外部安裝一個 RAID1 磁碟來做到這一點。小心,在開始之前複製磁碟。在我的例子中,RAID1 包含一個 LVM 物理卷。
- 使用其中一個磁碟創建一個新陣列,
mdadm --create /dev/md128 --raid-devices=2 --level=1 /dev/sdc1 missing
- 重新創建 LVM 結構。您可以手動執行此操作或從自動備份中恢復:
pvcreate vg00 /dev/md128 vgcfgrestore --list vg00 vgcfgrestore --force -f /etc/lvm/backup/vg00 vg00
- 重命名卷組(臨時):
vgrename yyyyyy-9OHC-OlB2-izuQ-dyPi-jw2S-zzzzzz vg00new
- 在另一個磁碟上找到文件系統的開始。我沒有任何東西,
/etc/mdadm.conf
所以我無法輕易獲得這些資訊。所以我只是尋找文件系統簽名:grep -a -b -o LABELONE /dev/sdd1
簽名在LVM 規範中進行了描述,該文件告訴我們它儲存在第二個扇區中。我的扇區是 512 字節,所以我從上面返回的數字中減去 512,並創建一個只讀循環設備:
losetup -f /dev/sdd1 --read-only -o 134217728
- 掃描循環設備上的 LVM 數據:
vgscan lvscan
lsblk
和之類的命令現在應該在和lvdisplay
中顯示卷。檢查設備是否存在,如果不存在則啟動卷,.vg00``vg00new``/dev/vg00``lvchange -a y vg00/<volname>
- 將數據複製到 RAID1。可以通過安裝和來完成
cp
,mkdir /data/old mount -t <fstype> /dev/vg00/<volname> /data/old cp -pr /data/old/* /data/current/
或者,根據您的數據,您可能希望
dd
對每個邏輯卷使用,dd if=/dev/vg00/vol1 of=/dev/vg00new/vol1 bs=1M conv=sparse
請注意,這
conv=sparse
對於精簡配置的 LV 很重要,因為它避免了完全分配空間。
- 現在可以斷開循環設備,
lvchange -a n vg00/<volname> losetup -d loop0
- 這應該只留下你
vg00new
,/dev/md128
檢查lsblk
。將 VG 重命名回原來的名稱:vgrename yyyyyy-9OHC-OlB2-izuQ-dyPi-jw2S-zzzzzz vg00
最後,在您 100% 確定所有內容都已複製並正常工作並完成
fsck
您需要做的任何事情后,重新添加/dev/sdd1
到 RAID1 陣列中。mdadm --manage /dev/md128 --add /dev/sdd1
歸功於@frostschutz 解決方案的精髓,可在https://unix.stackexchange.com/a/98803/384096找到
我仍然不知道問題是如何發生的,這有點令人擔憂,但至少這讓它再次執行。