恢复具有不匹配超级块的 Linux Soft Raid6?

恢复具有不匹配超级块的 Linux Soft Raid6?

我的家庭实验室服务器正在进行 RAID5 到 RAID6 的转换操作,这时我的一张 SAS 卡半夜突然出现故障,导致其中 2 个驱动器被标记为不可用。

今天早上醒来后,看到发生了什么事,我立即重新启动了服务器,驱动器恢复了,但阵列无法再组装或启动。

首先我检查了 6 个驱动器上的事件计数:

~# mdadm --examine /dev/sd[bcdfgi] | egrep 'Event|/dev/sd'
    /dev/sdb:
        Events : 2691764
    /dev/sdc:
        Events : 2691764
    /dev/sdd:
        Events : 2691764
    /dev/sdf:
        Events : 2691764
    /dev/sdg:
        Events : 2679506
    /dev/sdi:
        Events : 2679506

在看到 4 个驱动器具有匹配的更高事件计数并且其中没有一个是正在为 RAID5 到 RAID6 转换添加的驱动器 (/dev/sdg) 后,我认为我应该能够使用 4 个好的驱动器进行强制组装:

~# mdadm --assemble --force /dev/md127 /dev/sdb /dev/sdc /dev/sdd /dev/sdf
    mdadm: Failed to restore critical section for reshape, sorry.
        Possibly you needed to specify the --backup-file

幸运的是,在重塑开始时我创建了一个备份文件,因此:

~# mdadm --assemble --backup-file=/root/raid5backup --force /dev/md127 /dev/sdb /dev/sdc /dev/sdd /dev/sdf
    mdadm: restoring critical section
        mdadm: failed to RUN_ARRAY /dev/md127: Input/output error

查看 dmesg 输出并没有太大帮助:

[ 1194.472447] md: bind<sdf>
[ 1194.473147] md: bind<sdc>
[ 1194.473274] md: bind<sdb>
[ 1194.503167] md: bind<sdd>
[ 1194.504763] md/raid:md127: reshape will continue
[ 1194.504780] md/raid:md127: device sdd operational as raid disk 0
[ 1194.504781] md/raid:md127: device sdc operational as raid disk 4
[ 1194.504781] md/raid:md127: device sdf operational as raid disk 2
[ 1194.505026] md/raid:md127: allocated 6490kB
[ 1194.505136] md/raid:md127: not enough operational devices (3/6 failed)
[ 1194.505914] RAID conf printout:
[ 1194.505915]  --- level:6 rd:6 wd:3
[ 1194.505916]  disk 0, o:1, dev:sdd
[ 1194.505917]  disk 2, o:1, dev:sdf
[ 1194.505918]  disk 4, o:1, dev:sdc
[ 1194.505918]  disk 5, o:1, dev:sdb
[ 1194.506113] md/raid:md127: failed to run raid set.
[ 1194.507014] md: pers->run() failed ...
[ 1194.507762] md: md127 stopped.
[ 1194.507766] md: unbind<sdd>
[ 1194.530614] md: export_rdev(sdd)
[ 1194.530653] md: unbind<sdb>
[ 1194.546595] md: export_rdev(sdb)
[ 1194.546637] md: unbind<sdc>
[ 1194.562584] md: export_rdev(sdc)
[ 1194.562625] md: unbind<sdf>
[ 1194.574586] md: export_rdev(sdf)

我想,如果我尝试将它组装起来,包括两个事件计数较低的驱动器,也许它会起作用:

~# mdadm --assemble --backup-file=/root/raid5backup --force /dev/md127 /dev/sdb /dev/sdc /dev/sdd /dev/sdf /dev/sdi /dev/sdg
    mdadm: restoring critical section
        mdadm: failed to RUN_ARRAY /dev/md127: Input/output error

快速浏览一下 dmesg 输出,发现它不喜欢这样:

[ 1435.180559] md: bind<sdi>
[ 1435.199716] md: bind<sdf>
[ 1435.200403] md: bind<sdg>
[ 1435.200531] md: bind<sdc>
[ 1435.200660] md: bind<sdb>
[ 1435.200918]  sdi:
[ 1435.229950] md: bind<sdd>
[ 1435.230299] md: kicking non-fresh sdg from array!
[ 1435.230302] md: unbind<sdg>
[ 1435.251031] md: export_rdev(sdg)
[ 1435.251074] md: kicking non-fresh sdi from array!
[ 1435.251079] md: unbind<sdi>
[ 1435.267034] md: export_rdev(sdi)

在继续操作之前,我快速将磁盘扫描到文件中,以防以后需要详细信息:

~# mdadm --examine /dev/sd[bcdfig] >> /root/raid.status

这让我彻底搞砸了,我尝试使用 4 个好的驱动器创建一个新的阵列,希望能够再次看到数据:

~# mdadm --create --assume-clean --level=6 --raid-devices=6 --chunk=128K /dev/md127 /dev/sdb /dev/sdc /dev/sdd /dev/sdf missing missing

但是,执行此操作后,pvscan/vgscan 等没有产生任何东西,并且对数组开头的快速 dd 显示它是空白的:

~# dd if=/dev/md127 bs=512 count=255 skip=1 of=/tmp/md2-raw-start

此时,我再次停止了阵列,以免造成任何损坏,并且不应将任何数据写入阵列。不幸的是,这确实改变了这四个驱动器的 RAID UUID,因此现在它与不同步的两个驱动器不同。

我现在已经停止在服务器上执行任何操作,并希望这里的一些好心人可以给我一些指导,告诉我如何继续。

由于该系统是我的家庭实验室服务器,因此没有备份,但是阵列中仍然有大量数据,我宁愿尝试保留这些数据,而不是将其全部删除并重新开始。

相关内容