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


17

前段时间我在家中有一个RAID5系统。4个磁盘中的一个发生故障,但是将其删除并放回原位后似乎还可以,所以我开始了重新同步。完成后,令我感到恐惧的是,四分之三的磁盘出现了故障。但是我不相信那是可能的。磁盘上有多个分区,每个分区属于不同的RAID阵列。

  • md0是由sda1,sdb1,sdc1和sdd1组成的RAID1阵列。
  • md1是RAID5阵列,由sda2,sdb2,sdc2和sdd2组成。
  • 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

安全吗?

更新资料

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


我想mdadm --re-add这不是您要找的东西。您最近是否进行了内存测试?您是否有与阵列故障相关的日志消息?
吉尔(Gilles)“所以,别再邪恶了”,

@Gilles:我没有崩溃前的日志,因为它们存储在故障阵列中。而且我认为我无法使用标准mdadm接口进行修复。4个磁盘中的1个不可能进行涉及重新同步的任何类型的操作。我认为3个“失败”的磁盘包含足够的信息来还原所有内容。例如,我可以用dd读取它们。“好”的可能不同步。我将进行一次记忆测试,但该机器现在可以在新磁盘上正常工作。
stribika 2011年

2
您是否尝试过停止阵列并用mdadm -A /dev/md1 /dev/sd{b,c,d}2(也许--force)重新组装一个新阵列?(如果尚未备份,请先备份超级块。)
Gilles'SO-别再作恶了'

@吉尔斯:我用最新信息更新了我的问题。我到底需要什么备份?磁盘的前几个块还是有特定的工具用于此?
stribika 2011年

@stribika:超级块是在分区的64kB边界上对齐的最后一个完整的64kB块。/dev/sdd2尽管UUID与相同,但我不知道如何在单独的数组中sd{a,b,c}2
吉尔(Gilles)“所以,别再邪恶了”,

Answers:


12

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

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

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

smartctl -l selftest /dev/sda

如果由于读取错误而导致磁盘状态报告未完成,则该磁盘对于md1重组应视为不安全。自检完成后,您可以开始尝试重新组装阵列。(可选)如果您要格外谨慎,请先将磁盘移至另一台计算机,然后再继续操作(以防ram / controller / etc等问题)。

最近,我有一个与此案完全一样的案子。一个驱动器发生故障,我重新添加到阵列中,但是在重建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脚本)重新创建阵列

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

编辑:添加了一些说明。


mdadm --assemble /dev/md1 /dev/sd[abc]2 --force工作了。谢谢。您保存了我的数据!:)我不会尝试添加第四个磁盘,因为前三个磁盘不如我以前所知道的那样好。自检显示每个都有10-20个不可读的块。我没有先检查一下就很愚蠢。
stribika 2011年

感谢您的全面回答。奖励了我50次代表。
0xC0000022L13年

Permute_array.pl对我来说很棒。其他用户请注意:它希望看到的设备阵列包括所有驱动器,包括您可能已卸下的所有死驱动器。

“如果执行--create命令,丢失的部分很重要,请不要尝试在阵列中添加第四个驱动器,因为这样一来,构建将开始,您将丢失数据。” — BS。如果指定--assume-clean(您指定了),则不会。
poige

1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.