使用 mdadm 修复两个 RAID1 磁盘上丢失的超级块

使用 mdadm 修复两个 RAID1 磁盘上丢失的超级块

我的 RAID1 阵列工作正常,/dev/md128但在重新启动后似乎完全消失,并mdadm报告两个磁盘都缺少超级块。我的问题是如何解决这个问题?

背景:运行 CentOS 7 的系统。有 2xSSD ( sda, sdb) 和 2xHDD ( sdc, sdd)。应该有一个 RAID1 阵列/dev/md128sdcsdd没有显示任何内容。它一直运行良好,直到重新启动以进行内核更新为止。

数组未列出/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两台硬盘都备起来。

答案1

我解决了这个问题,为了其他人的利益,这对我有用。我通过在阵列外部安装一个 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下 on /dev/md128, check with 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

我仍然不知道问题是如何发生的,这有点令人担忧,但至少这让它再次运行。

相关内容