Raid

使用 mdadm 修復兩個 RAID1 磁碟上失去的超級塊

  • April 30, 2022

我的 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 物理卷。

  1. 使用其中一個磁碟創建一個新陣列,
mdadm --create /dev/md128 --raid-devices=2 --level=1 /dev/sdc1 missing
  1. 重新創建 LVM 結構。您可以手動執行此操作或從自動備份中恢復:
pvcreate vg00 /dev/md128
vgcfgrestore --list vg00
vgcfgrestore --force -f /etc/lvm/backup/vg00 vg00
  1. 重命名卷組(臨時):
vgrename yyyyyy-9OHC-OlB2-izuQ-dyPi-jw2S-zzzzzz vg00new
  1. 在另一個磁碟上找到文件系統的開始。我沒有任何東西,/etc/mdadm.conf所以我無法輕易獲得這些資訊。所以我只是尋找文件系統簽名:
grep -a -b -o LABELONE /dev/sdd1

簽名在LVM 規範中進行了描述,該文件告訴我們它儲存在第二個扇區中。我的扇區是 512 字節,所以我從上面返回的數字中減去 512,並創建一個只讀循環設備:

losetup -f /dev/sdd1 --read-only -o 134217728
  1. 掃描循環設備上的 LVM 數據:
vgscan
lvscan

lsblk和之類的命令現在應該在和lvdisplay中顯示卷。檢查設備是否存在,如果不存在則啟動卷,.vg00``vg00new``/dev/vg00``lvchange -a y vg00/<volname>

  1. 將數據複製到 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 很重要,因為它避免了完全分配空間。

  1. 現在可以斷開循環設備,
lvchange -a n vg00/<volname>
losetup -d loop0
  1. 這應該只留下你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找到

我仍然不知道問題是如何發生的,這有點令人擔憂,但至少這讓它再次執行。

引用自:https://unix.stackexchange.com/questions/700684