如何恢复崩溃的 Linux md RAID5 阵列?

如何恢复崩溃的 Linux md RAID5 阵列?

前段时间我家里有一个RAID5系统。 4 个磁盘中的一个出现故障,但将其取出并放回原处后似乎一切正常,因此我开始重新同步。当它完成时,我惊恐地意识到,四分之三的磁盘出现了故障。但我不相信这是可能的。磁盘上有多个分区,每个分区属于不同的 RAID 阵列。

  • md0 是由 sda1、sdb1、sdc1 和 sdd1 组成的 RAID1 阵列。
  • md1 是由 sda2、sdb2、sdc2 和 sdd2 组成的 RAID5 阵列。
  • md2 是由 sda3、sdb3、sdc3 和 sdd3 组成的 RAID0 阵列。

md0 和 md2 报告所有磁盘均正常运行,而 md1 报告 3 个磁盘出现故障(sdb2、sdc2、sdd2)。据我了解,当硬盘驱动器出现故障时,所有分区都应该丢失,而不仅仅是中间分区。

此时我关闭了计算机并拔下了驱动器。从那时起,我就使用那台带有较小新磁盘的计算机。

数据还有恢复的希望吗?我能否以某种方式让 mdadm 相信我的磁盘实际上正在工作?唯一可能真正有问题的磁盘是 sdc,但其他阵列也报告了该问题。

更新

我终于有机会连接旧磁盘并从 SystemRescueCd 启动这台机器。以上都是凭记忆写的。现在我有一些硬数据。这是输出mdadm --examine /dev/sd*2

/dev/sda2:
          Magic : a92b4efc
        Version : 0.90.00
           UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
  Creation Time : Sun May 30 21:48:55 2010
     Raid Level : raid5
  Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
     Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 1

    Update Time : Mon Aug 23 11:40:48 2010
          State : clean
 Active Devices : 3
Working Devices : 4
 Failed Devices : 1
  Spare Devices : 1
       Checksum : 68b48835 - correct
         Events : 53204

         Layout : left-symmetric
     Chunk Size : 64K

      Number   Major   Minor   RaidDevice State
this     0       8        2        0      active sync   /dev/sda2

   0     0       8        2        0      active sync   /dev/sda2
   1     1       8       18        1      active sync   /dev/sdb2
   2     2       8       34        2      active sync   /dev/sdc2
   3     3       0        0        3      faulty removed
   4     4       8       50        4      spare   /dev/sdd2
/dev/sdb2:
          Magic : a92b4efc
        Version : 0.90.00
           UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
  Creation Time : Sun May 30 21:48:55 2010
     Raid Level : raid5
  Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
     Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 1

    Update Time : Mon Aug 23 11:44:54 2010
          State : clean
 Active Devices : 2
Working Devices : 3
 Failed Devices : 1
  Spare Devices : 1
       Checksum : 68b4894a - correct
         Events : 53205

         Layout : left-symmetric
     Chunk Size : 64K

      Number   Major   Minor   RaidDevice State
this     1       8       18        1      active sync   /dev/sdb2

   0     0       0        0        0      removed
   1     1       8       18        1      active sync   /dev/sdb2
   2     2       8       34        2      active sync   /dev/sdc2
   3     3       0        0        3      faulty removed
   4     4       8       50        4      spare   /dev/sdd2
/dev/sdc2:
          Magic : a92b4efc
        Version : 0.90.00
           UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
  Creation Time : Sun May 30 21:48:55 2010
     Raid Level : raid5
  Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
     Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 1

    Update Time : Mon Aug 23 11:44:54 2010
          State : clean
 Active Devices : 1
Working Devices : 2
 Failed Devices : 2
  Spare Devices : 1
       Checksum : 68b48975 - correct
         Events : 53210

         Layout : left-symmetric
     Chunk Size : 64K

      Number   Major   Minor   RaidDevice State
this     2       8       34        2      active sync   /dev/sdc2

   0     0       0        0        0      removed
   1     1       0        0        1      faulty removed
   2     2       8       34        2      active sync   /dev/sdc2
   3     3       0        0        3      faulty removed
   4     4       8       50        4      spare   /dev/sdd2
/dev/sdd2:
          Magic : a92b4efc
        Version : 0.90.00
           UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
  Creation Time : Sun May 30 21:48:55 2010
     Raid Level : raid5
  Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
     Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 1

    Update Time : Mon Aug 23 11:44:54 2010
          State : clean
 Active Devices : 1
Working Devices : 2
 Failed Devices : 2
  Spare Devices : 1
       Checksum : 68b48983 - correct
         Events : 53210

         Layout : left-symmetric
     Chunk Size : 64K

      Number   Major   Minor   RaidDevice State
this     4       8       50        4      spare   /dev/sdd2

   0     0       0        0        0      removed
   1     1       0        0        1      faulty removed
   2     2       8       34        2      active sync   /dev/sdc2
   3     3       0        0        3      faulty removed
   4     4       8       50        4      spare   /dev/sdd2

自上次启动以来,情况似乎发生了变化。如果我没看错的话,sda2、sdb2 和 sdc2 正在工作并且包含同步数据,而 sdd2 是备用的。我清楚地记得看到 3 个磁盘出现故障,但这是个好消息。然而数组仍然无法工作:

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md125 : inactive sda2[0](S) sdb2[1](S) sdc2[2](S)
      1875194880 blocks

md126 : inactive sdd2[4](S)
      625064960 blocks

md127 : active raid1 sda1[0] sdd1[3] sdc1[2] sdb1[1]
      64128 blocks [4/4] [UUUU]

unused devices: <none>

md0 似乎已重命名为 md127。 md125和md126很奇怪。它们应该是一个数组而不是两个。以前称为 md1。 md2 完全消失了,但那是我的交换,所以我不在乎。

我可以理解不同的名称,但这并不重要。但为什么具有 3 个“主动同步”磁盘的阵列无法读取? sdd2 位于单独的数组中怎么办?

更新

备份超级块后我尝试了以下操作:

root@sysresccd /root % mdadm --stop /dev/md125
mdadm: stopped /dev/md125
root@sysresccd /root % mdadm --stop /dev/md126
mdadm: stopped /dev/md126

到目前为止,一切都很好。由于 sdd2 是空闲的,我还不想添加它。

root@sysresccd /root % mdadm --assemble /dev/md1 /dev/sd{a,b,c}2 missing 
mdadm: cannot open device missing: No such file or directory
mdadm: missing has no superblock - assembly aborted

显然我不能这么做。

root@sysresccd /root % mdadm --assemble /dev/md1 /dev/sd{a,b,c}2        
mdadm: /dev/md1 assembled from 1 drive - not enough to start the array.
root@sysresccd /root % cat /proc/mdstat 
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md1 : inactive sdc2[2](S) sdb2[1](S) sda2[0](S)
      1875194880 blocks

md127 : active raid1 sda1[0] sdd1[3] sdc1[2] sdb1[1]
      64128 blocks [4/4] [UUUU]

unused devices: <none>

那也没用。让我们尝试使用所有磁盘。

mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@sysresccd /root % mdadm --assemble /dev/md1 /dev/sd{a,b,c,d}2
mdadm: /dev/md1 assembled from 1 drive and 1 spare - not enough to start the array.
root@sysresccd /root % cat /proc/mdstat                           
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md1 : inactive sdc2[2](S) sdd2[4](S) sdb2[1](S) sda2[0](S)
      2500259840 blocks

md127 : active raid1 sda1[0] sdd1[3] sdc1[2] sdb1[1]
      64128 blocks [4/4] [UUUU]

unused devices: <none>

没有运气。基于这个答案我打算尝试:

mdadm --create /dev/md1 --assume-clean --metadata=0.90 --bitmap=/root/bitmapfile --level=5 --raid-devices=4 /dev/sd{a,b,c}2 missing
mdadm --add /dev/md1 /dev/sdd2

安全吗?

更新

我发布了超级块解析器脚本我曾经在评论中制作过该表。也许有人会发现它很有用。感谢你的帮助。

答案1

首先检查磁盘,尝试运行智能自检

for i in a b c d; do
    smartctl -s on -t long /dev/sd$i
done

可能需要几个小时才能完成,但每隔几分钟检查一次每个驱动器的测试状态,即

smartctl -l selftest /dev/sda

如果磁盘的状态由于读取错误而报告未完成,则该磁盘应被视为对于 md1 重组不安全。自检完成后,您可以开始尝试重新组装阵列。或者,如果您想格外小心,请在继续之前将磁盘移至另一台计算机(以防内存/控制器等损坏)。

最近,我就遇到了一个和这个一模一样的案例。一个驱动器出现故障,我将其重新添加到阵列中,但在重建过程中,4 个驱动器中的 3 个完全出现故障。 /proc/mdadm 的内容和你的一样(可能顺序不同)

md1 : inactive sdc2[2](S) sdd2[4](S) sdb2[1](S) sda2[0](S)

但我很幸运并用这个重新组装了阵列

mdadm --assemble /dev/md1 --scan --force

通过查看您提供的 --examine 输出,我可以看出发生了以下情况:sdd2 失败,您将其删除并重新添加,因此它成为尝试重建的备用驱动器。但是重建 sda2 失败,然后 sdb2 失败。因此,sdc2 和 sdd2 中的事件计数器更大,它们是阵列中最后一个活动驱动器(尽管 sdd 没有机会重建,因此它是所有驱动器中最过时的)。由于事件计数器的差异,--force 将是必要的。所以你也可以尝试这个

mdadm --assemble /dev/md1 /dev/sd[abc]2 --force

总而言之,我认为如果上述命令失败,您应该尝试重新创建数组,如下所示:

mdadm --create /dev/md1 --assume-clean -l5 -n4 -c64 /dev/sd[abc]2 missing

如果您执行此操作--create,则该missing部分很重要,请勿尝试在阵列中添加第四个驱动器,因为这样就会开始构建,并且您将丢失数据。创建缺少驱动器的阵列不会更改其内容,并且您将有机会获得副本别处(raid5 的工作方式与 raid1 不同)。

如果无法启动数组,请在此处尝试此解决方案(perl 脚本)重新创建数组

如果您最终设法启动阵列,文件系统将不干净并且可能已损坏。如果一个磁盘在重建期间发生故障,预计阵列将停止并冻结,不会对其他磁盘进行任何写入。在这种情况下,两个磁盘出现故障,或许系统正在执行无法完成的写入请求,因此您有可能丢失一些数据,但也有可能您永远不会注意到它:-)

编辑:添加了一些说明。

答案2

我在使用过程中遇到了很多问题mdadm,但从未丢失过数据。您应该避免使用该--force选项,或者非常小心地使用它,因为您可能会丢失所有数据。请发布您的/etc/mdadm/mdadm.conf

相关内容