我是否有机会成功重建损坏的 Raid5 阵列?

我是否有机会成功重建损坏的 Raid5 阵列?

好的,我会尽量简短地讲。这些驱动器上的数据不是任务关键型的,所以没有备份。丢失数据会有点烦人,所以如果我可以把它找回来就好了,但如果没有,那也没关系。现在似乎是探索mdadm魔法的好时机。

我有一个 raid 阵列,它工作时的样子如下:

Personalities : [raid6] [raid5] [raid4] 
md0 : active raid5 sdc1[4] sda1[2] sdd1[5] sdb1[3]
      2929731072 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
      bitmap: 0/8 pages [0KB], 65536KB chunk

但其中一个驱动器发生故障(sdc1[4])。然后在重建期间另一个驱动器发生故障(sdd1[5])。经典。但我对第二个驱动器故障有点怀疑。它可能只是电源故障或其他原因。我想如果我可以将阵列与故障的只读驱动器放在一起sdd1[5],我可能仍然可以从阵列中获取一些数据。

现在看起来像:

Personalities : [raid6] [raid5] [raid4] 
md0 : active raid5 sdc1[4](S) sda1[2] sdd1[5](F) sdb1[3]
      2929731072 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/2] [_UU_]
      bitmap: 8/8 pages [32KB], 65536KB chunk

unused devices: <none>

好的,所以,我想忽略故障并重新添加sdd1[5],但重新添加却将其添加为备用……这不好。

当我检查所有磁盘时,我发现它们都有相同数量的事件,但其中两个是Active device 1Active device 2,另一个是spare......

我试过,--assemble --force但那只是让我回到原来的状态。我想要某种方式来告诉驱动器它不是备用的,但我不确定是否存在这样的工具。所以我想我能尝试的最后一件事是重建一个新的阵列,--create看看--assume-clean我是否能从中挤出最后一点数据。但如果我做错了,这感觉很具破坏性,而且我可能只有一次机会,所以我在寻找比我更了解的人。

所以我的第一个问题是(A)这是否有可能奏效,或者我被误导了?

之后是(B)我是否可以尝试其他不那么激烈但更有可能奏效的方法?

最后 (C) 假设这是我最好的机会...我应该按什么顺序排列磁盘--create?在 状态下,它们按sdc1[4] sda1[2] sdd1[5] sdb1[3]顺序列出,但它们失败时的状态是_UU_,但它是sdc1[4]并且sdd1[5]失败了...并且在检查中ab列为 和Active device 1,与假设它是从零开始的东西2对齐_UU_,但我不知道为什么它们会按该顺序排列...所以如果我要运行创建,我怎么知道按什么顺序放置磁盘以及将磁盘放在哪里missing?我想我只能搞砸一次,所以如果可以的话,我想尽我最大的努力。

谢谢阅读!

答案1

评论中的每个人都告诉我要使用专业的恢复服务,但如果数据足够重要,值得花那么多钱进行恢复,我会在其生存期内进行备份。

所以这反而是一个学习的机会!以下是我学到的东西:

首先,我的假设是错误的。您可以mdadm --create非破坏性地多次调用。我首先调用:

sudo mdadm --create /dev/md1 --create --assume-clean -l5 -n4 -c512 /dev/sd[abc]1 missing

然后我尝试挂载它。但失败了,因为挂载无法确定文件系统类型,这告诉我我搞错了顺序。我的“状态”行从UUUU工作时的“ ”变为“ _UUU_UU_,因此我认为损坏的驱动器可能应该放在第一个,因此我运行了与上面相同的命令,但改为使用missing /dev/sd[abc]1。事实证明,如果我无论如何都要重写元数据,那么我已经重写了它就没关系了!但它也告诉我,自动检测磁盘顺序并没有什么神奇之处--assume-clean。此命令对顺序敏感,我只是不必第一次就正确完成。我以只读方式挂载了阵列,因此没有虚假写入破坏已经搞乱的顺序。

这种顺序允许我安装它,但有明显的损坏。一些目录似乎完好无损,但其他目录在列出它们时给我 IO 错误。这似乎不太好……我尝试抽查几个文件,它们似乎有完整的数据带和垃圾带。它似乎有规律地进出,这让我很怀疑。我知道 RAID5 的工作方式是将数据条带化并将几个块放到每个磁盘上,然后是奇偶校验块。所以如果我的顺序错了,但我把第一个磁盘弄对了,那么魔法块将允许读取(和安装)FS 类型,但后面的数据将被损坏。这也会导致损坏带,因为我有一个完整的磁盘上的好块,然后是一个顺序错误的移位块,然后当我们从奇偶校验重新计算丢失的块时,这将是完全无意义的,因为它是在计算错误的数据。

因此我尝试了几种排序方式,因为我也没有什么可失去的,结果发现:

sudo mdadm --create /dev/md1 --assume-clean -l5 -n4 -c512 missing /dev/sd{b,a,c}1 && sudo mount -o ro /dev/md1 /mnt/raid

对我来说很管用。它可以列出所有文件,并且抽查一些文件,据我所知,它们似乎是完整的。我猜想某些地方有损坏,但就我的目的而言,我宁愿保留一些数据,而不是让所有数据都完美无缺,所以这对我来说已经足够好了。(我切换到{}以便我可以控制顺序,此时我已经重新启动了,所以旧sdd1的是现在的sdc1)。之所以选择这个顺序,是因为,再次,“ _UU_”顺序暗示我丢失的磁盘是第一个,而失败的sdd1(现在的sdc1)是最后一个,所以我只需要在这些中间驱动器上尝试“ab”和“ba”之间的两个顺序。事实证明该顺序是最终的顺序,但我不知道该布局来自哪里......

所以,无论如何,在阵列第二次崩溃之前,我复制了 2.7TB 中的 1.3TB,并且从复制的数据中抽查了一些随机文件,它似乎已经大致起作用了!我使用了rsync它,它显然无法捕获磁盘上的损坏,但在传输过程中磁盘出现故障时,它确实很好地处理了损坏。

所以,无论如何,对于未来的读者来说,如果数据真的很重要,绝对要花钱找人。但如果你和我一样,没什么可失去的,想花点时间玩玩mdadm,这就是我学到的!

相关内容