mdadm raid5恢复双磁盘失败 – 扭曲(驱动器顺序)

让我首先承认我犯了错误,并且对这个RAID上的大部分数据都有一个备份。 我仍然希望恢复其余的数据。 我没有那种把钱带到恢复专家公司的钱。

错误#0,没有100%的备份。 我知道。

我有一个4x3TB的mdadm RAID5系统。 驱动器/ dev / sd [be],全部使用一个分区/dev/sd[be]1 。 我意识到非常大的驱动器上的RAID5是有风险的,但我仍然做到了。

最近发生的事件

双驱动器故障后,RAID会降级。 一个驱动器[/ dev / sdc]确实没有了,另外一个[/ dev / sde]在重新上电后恢复,但不会自动重新添加到RAID中。 所以我剩下的只有2个活动驱动器[/ dev / sdb和/ dev / sdd]的4个设备RAID。

错误#1,不使用驱动器的dd副本来恢复RAID。 我没有驱动器或时间。 错误#2,没有备份其他驱动器的超级块和mdadm -E

恢复尝试

我重新组装了降级模式下的RAID

 mdadm --assemble --force /dev/md0, using /dev/sd[bde]1. 

我可以访问我的数据。 我用备件replace了/dev/sdc ; 空; 相同的驱动。

我从RAID中删除了旧的/dev/sdc1

 mdadm --fail /dev/md0 /dev/sdc1 

错误#3, 更换驱动器之前不要这样做

然后,我将新的/dev/sdc分区并将其添加到RAID。

 mdadm --add /dev/md0 /dev/sdc1 

然后开始恢复RAID。 ETA 300分钟 我通过/proc/mdstat到2%,然后去做其他的东西。

检查结果

几个小时(但less于300分钟)后,我检查了过程。 由于/dev/sde1上的读取错误,它已经停止。

这是麻烦真正开始的地方

然后我从RAID中删除/dev/sde1并重新添加它。 我不记得我为什么这样做, 天色已晚。

 mdadm --manage /dev/md0 --remove /dev/sde1 mdadm --manage /dev/md0 --add /dev/sde1 

但是, /dev/sde1现在被标记为备用。 所以我决定使用–assume-clean重新创build整个数组,使用我认为是正确的顺序,并用/dev/sdc1丢失。

 mdadm --create /dev/md0 --assume-clean -l5 -n4 /dev/sdb1 missing /dev/sdd1 /dev/sde1 

这工作,但文件系统无法识别,而试图安装。 (应该是EXT4)。

设备顺序

然后,我检查了最近的备份/proc/mdstat ,并find了驱动器的顺序。

 md0 : active raid5 sdb1[0] sde1[4] sdd1[2] sdc1[1] 8790402048 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU] 

然后我想起了这个RAID在一年前遭受了驱动器的损失,并且通过用一个备用的驱动器replace出现故障的驱动器而恢复了它。 这可能已经扰乱了设备顺序了一点…所以没有驱动器[3],但只有[0],[1],[2]和[4]。

我试图find与Permute_array脚本的驱动器顺序: https ://raid.wiki.kernel.org/index.php/Permute_array.pl,但没有find正确的顺序。

问题

我现在有两个主要问题:

  1. 我搞砸了驱动器上的所有超级块,但只给了:

     mdadm --create --assume-clean 

    命令(所以我不应该在/dev/sd[bde]1上覆盖数据本身)我是对的, 理论上 RAID可以恢复[假设/dev/sde1是好的],如果我find正确的设备顺序?

  2. 在RAID中给/dev/sde1赋予设备号[4]很重要吗? 当我创build它

     mdadm --create /dev/md0 --assume-clean -l5 -n4 \ /dev/sdb1 missing /dev/sdd1 /dev/sde1 

    它被分配了数字[3]。 我想知道这是否与计算平价块有关。 如果事实certificate是重要的,我怎么能重新创build数组/dev/sdb1[0]缺less[1] /dev/sdd1[2] /dev/sde1[4] ? 如果我能得到这个工作,我可以在降级模式下启动它,并添加新的驱动器/dev/sdc1并让它再次同步。

如果你想指出,这可能不是最好的行动方式,但你会发现我意识到这一点。 如果有人有任何的build议,这将是很好的。

    要回答你的问题,

    1. 可以恢复吗?

      • 第一件事是第一件事 – 停下来,稍微思考一下。 是的,algorithm,块大小和磁盘顺序对于获取存在的任何文件系统至关重要,以便重新组装。 但是由于您已经覆盖了超级块,所以您现在只剩下反复试验了。
      • 其次,有什么办法可以检索以前的磁盘布局吗? 我总是做一个mdadm –detail>备份文件,以保持磁盘布局安全。 检查dmesg,/ var / log以获取有关在RAID中如何configuration磁盘的证据。
      • 最后,如果你匹配以前的块大小和磁盘顺序,你可能已经损坏了ext4超级块 – 有办法qulickly扫描其他超级块(和有一个漂亮的程序称为TestDisk扫描现有文件系统的超级块,并尝试浏览它们手动: http : //www.cgsecurity.org/wiki/Main_Page )
    2. 由于sdc是新的,我会继续尝试和通过缺失的子句手动组装,是的,sde必须按正确的顺序组装在降级模式。 一旦你find正确的布局 – 从数组中复制所有的数据,并重新开始,logging布局(所以你不要再次遇到这个问题)。

    祝你好运

    在你做任何其他事情之前,为你的数组中的每个驱动器捕获一个'mdadm –examine / dev / sdX1',并从中得到'mdadm –detail / dev / md0',你应该能够确定确切的布局。

    我只需要自己做一个单独的问题来恢复Synologyarrays:

    如何在驱动器处于“E”状态的情况下恢复Synology NAS上的mdadmarrays?

    编辑:对不起,只是看到你说你失去了所有的驱动器上的超级块。

    你以后的命令看起来是正确的。 最简单的select可能是运行创build与每个可能的顺序,然后看看你是否可以挂载和访问它们的文件系统只读。

    这个问题已经很老了,我相信现在没有人能够帮助你,但是对于其他人来说:

    你犯的最危险的错误不是你编号的那个,

     mdadm --create ... 

    在原始磁盘上,在准备好之前知道该怎么做。 这已经覆盖了元数据,所以您没有驱动器顺序,数据偏移量,块大小等的logging。

    要从中恢复,需要使用正确的值重新覆盖这些值。 知道这个最简单的方法是看元数据,但是你已经销毁了。 接下来的方法是猜测。 猜测这样的命令的不同组合,除了你所知的任何选项(4个设备,5级)以及不同的磁盘顺序之外,还有不同的值:

     mdadm --create /dev/md0 --assume-clean --metadata=1.2 --raid-devices=4 --level=5 --layout=... --chunk=512 --data-offset=128M /dev/sdb1 missing /dev/sdd1 /dev/sde1 

    但是,既然你不知道正确的结果,你不应该在旧的磁盘上进一步摧毁它们,造成同样的致命错误。 相反,使用覆盖; 比如这个程序应该能够保证原件的安全。

    一旦你find了一些产生工作数组的参数,你可以进行fsck或者mount和validation(例如,检查足够大的文件的校验和以跨越所有的raid成员,比如你应该用校验和/ pgp存储的iso签名或unzip -t或gunzip -ta大档案)