mdadm RAID 阵列在重塑并重新启动后消失

mdadm RAID 阵列在重塑并重新启动后消失

我的 mdadm RAID5 阵列刚刚经历了 5>8 磁盘增长和重塑。这持续了好几天并且不间断。当cat /proc/mdstat说它完成时,我重新启动了系统,现在阵列不再显示。

我发现的一个潜在问题是,我在添加新驱动器时使用了完整的磁盘(例如,/dev/sda不使用/dev/sda1)。然而,这些驱动器上有应该跨越整个驱动器的分区。

我努力了:

$ sudo mdadm --assemble --scan
mdadm: No arrays found in config file or automatically

新添加的三个驱动器似乎没有 md 超级块:

$ sudo mdadm --examine /dev/sd[kln]
/dev/sdk:
   MBR Magic : aa55
Partition[0] :   4294967295 sectors at            1 (type ee)
/dev/sdl:
   MBR Magic : aa55
Partition[0] :   4294967295 sectors at            1 (type ee)
/dev/sdn:
   MBR Magic : aa55
Partition[0] :   4294967295 sectors at            1 (type ee)

$ sudo mdadm --examine /dev/sd[kln]1
mdadm: No md superblock detected on /dev/sdk1.
mdadm: No md superblock detected on /dev/sdl1.
mdadm: No md superblock detected on /dev/sdn1.

其他五个人这样做并显示了数组的正确统计数据:

$ sudo mdadm --examine /dev/sd[ijmop]1
/dev/sdi1:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x1
     Array UUID : 7399b735:98d9a6fb:2e0f3ee8:7fb9397e
           Name : Freedom-2:127
  Creation Time : Mon Apr  2 18:09:19 2018
     Raid Level : raid5
   Raid Devices : 8

 Avail Dev Size : 15627795456 (7451.91 GiB 8001.43 GB)
     Array Size : 54697259008 (52163.37 GiB 56009.99 GB)
  Used Dev Size : 15627788288 (7451.91 GiB 8001.43 GB)
    Data Offset : 254976 sectors
   Super Offset : 8 sectors
   Unused Space : before=254888 sectors, after=7168 sectors
          State : clean
    Device UUID : ca3cd591:665d102b:7ab8921f:f1b55d62

Internal Bitmap : 8 sectors from superblock
    Update Time : Tue Jul 14 11:46:37 2020
  Bad Block Log : 512 entries available at offset 72 sectors
       Checksum : 6a1bca88 - correct
         Events : 401415

         Layout : left-symmetric
     Chunk Size : 512K

   Device Role : Active device 3
   Array State : AAAAAAAA ('A' == active, '.' == missing, 'R' == replacing)

...等

强制装配不起作用:

$ sudo mdadm /dev/md1 --assemble --force /dev/sd[ijmop]1 /dev/sd[kln]
mdadm: /dev/sdi1 is busy - skipping
mdadm: /dev/sdj1 is busy - skipping
mdadm: /dev/sdm1 is busy - skipping
mdadm: /dev/sdo1 is busy - skipping
mdadm: /dev/sdp1 is busy - skipping
mdadm: Cannot assemble mbr metadata on /dev/sdk
mdadm: /dev/sdk has no superblock - assembly aborted

我不知道如何继续。

非常感谢您提供的所有帮助。

答案1

我发现的一个潜在问题是,我在添加新驱动器时使用了完整的磁盘(例如,/dev/sda不使用/dev/sda1)。然而,这些驱动器上有应该跨越整个驱动器的分区。

将完整磁盘用于分区表以外的任何内容都是危险的。一旦其他任何东西写入分区表,您的全磁盘 RAID / LUKS / LVM / 文件系统元数据就会消失。除了用户错误之外,有很多工具和环境可以在不需要真正询问您的情况下编写分区表。

这似乎正是发生在你身上的事情。您或其他人用分区表覆盖了三个磁盘上的元数据。通常无法恢复丢失的元数据。例如,parted'smklabel gpt会将 mdadm 1.2 元数据(从开始起 4K)完全清零。

因此,你唯一的希望就是重新创建 RAID从头开始构建新的元数据。

并且必须以完全相同的方式重新创建它,因此,如果您确定使用完整磁盘而不是分区,则必须使用完整磁盘重新创建它,并且也按正确的顺序。恢复数据后,请考虑迁移到分区而不是完整磁盘设备。


请注意,您的驱动器顺序不是按字母顺序排列的,您仅显示了阵列中恰好是第四个驱动器(从 0 开始计数,设备角色 3)的mdadm --examine输出。/dev/sdi1为了成功重新创建,请仔细阅读检查输出以推断出正确的设置。此外,您的数据偏移量不寻常(因为--grow更改了它)。

写时复制覆盖在适当的位置,您正在寻找的命令应该类似于:

mdadm --create /dev/md100 --assume-clean \
      --level=5 --chunk=512 --data-offset=127488 --layout=left-symmetric \
      --raid-devices=8 /dev/mapper/sd{?,?,?,i,?,?}1 /dev/mapper/sd{k,l,n}

(我不知道你的驱动器顺序,所以我用?正确的驱动器字母代替,还要注意{c,b,a}语法在不保持顺序的情况下保持顺序不变[cba]。如果有疑问,请将其写出来,而不是使用 shell 扩展。)


为了确保现有的 GPT 分区表不会再次干扰,您应该将其删除wipefs(仅从完整磁盘成员中)。这会删除磁盘开头和结尾处的 GPT,因此任何寻找 GPT 并在磁盘结尾处找到它的软件都不会感到被迫在磁盘开头还原它,从而在此过程中擦除元数据。

# wipefs --no-act --all --types gpt,PMBR /dev/loop0
/dev/loop0: 8 bytes were erased at offset 0x00000200 (gpt): 45 46 49 20 50 41 52 54
/dev/loop0: 8 bytes were erased at offset 0x7ffffe00 (gpt): 45 46 49 20 50 41 52 54
/dev/loop0: 2 bytes were erased at offset 0x000001fe (PMBR): 55 aa

(移除--no-act以实际执行擦除。)

祝你好运...如果分区表是唯一的问题,那么你应该有很大的成功机会。如果其他数据也被更改(创建分区并格式化它们的某些内容),您将看到 RAID 本身的数据损坏。


附:

$ sudo mdadm /dev/md1 --assemble --force /dev/sd[ijmop]1 /dev/sd[kln]
mdadm: /dev/sdi1 is busy - skipping

此消息(忙跳过)通常意味着md设备已组装(由于增量组装方法,阵列不完整时会发生这种情况)。

在这种情况下,您必须mdadm --stop先访问非活动数组,然后mdadm --assemble再尝试访问它。 (如果之前确实缺少驱动器,则继续增量组装)。

相关内容