Perc H740P:raid5 卷拆分为两个外部配置,无法导入

Perc H740P:raid5 卷拆分为两个外部配置,无法导入

更换电源后,我们遇到了布线问题,这导致一些磁盘丢失,在 BIOS 中调试并修复此问题后,在第一次启动时,预先存在的 raid5 卷被分成两个外部配置 - 一个包含 5 个磁盘,另一个包含 7 卷 raid5 的剩余 2 个磁盘(见下文)。

我们无法使用 perccli /c0/fall import 来导入外部配置:

Status = Failure
Description = Incomplete foreign configuration

因此,所有磁盘都在那里,但不知何故控制器认为这是两个不同的驱动器组。有没有办法从这种情况中恢复并将配置合并为一个,或者类似的东西?

----------------------------------------------------------------------------
DG Arr Row EID:Slot DID Type  State BT      Size PDC  PI SED DS3  FSpace TR 
----------------------------------------------------------------------------
 0 -   -   -        -   RAID5 Frgn  N  54.571 TB dsbl N  N   dflt N      N  
 0 0   -   -        -   RAID5 Frgn  N  54.571 TB dsbl N  N   dflt N      N  
 0 0   0   67:0     0   DRIVE Frgn  N   9.094 TB dsbl N  N   dflt -      N  
 0 0   1   67:0     1   DRIVE Frgn  N   9.094 TB dsbl N  N   dflt -      N  
 0 0   2   67:0     2   DRIVE Frgn  N   9.094 TB dsbl N  N   dflt -      N  
 0 0   3   67:0     3   DRIVE Frgn  N   9.094 TB dsbl N  N   dflt -      N  
 0 0   4   -        -   DRIVE Msng  -   9.094 TB -    -  -   -    -      N  
 0 0   5   -        -   DRIVE Msng  -   9.094 TB -    -  -   -    -      N  
 0 0   6   67:0     5   DRIVE Frgn  N   9.094 TB dsbl N  N   dflt -      N  
 1 -   -   -        -   RAID5 Frgn  N  54.571 TB dsbl N  N   dflt N      N  
 1 0   -   -        -   RAID5 Frgn  N  54.571 TB dsbl N  N   dflt N      N  
 1 0   0   -        -   DRIVE Msng  -   9.094 TB -    -  -   -    -      N  
 1 0   1   -        -   DRIVE Msng  -   9.094 TB -    -  -   -    -      N  
 1 0   2   -        -   DRIVE Msng  -   9.094 TB -    -  -   -    -      N  
 1 0   3   -        -   DRIVE Msng  -   9.094 TB -    -  -   -    -      N  
 1 0   4   67:0     6   DRIVE Frgn  N   9.094 TB dsbl N  N   dflt -      N  
 1 0   5   67:0     4   DRIVE Frgn  N   9.094 TB dsbl N  N   dflt -      N  
 1 0   6   -        -   DRIVE Msng  -   9.094 TB -    -  -   -    -      N  
----------------------------------------------------------------------------


Foreign VD List :
===============

---------------------------------
DG  VD      Size Type  Name      
---------------------------------
 0 255 54.571 TB RAID5 RV5 
 1 255 54.571 TB RAID5 RV5 
---------------------------------

更新:

我断开了整个扩展器并启动。这显示了外部配置中的所有磁盘(还有许多单个 raid1 卷):

-----------------------------------------
DG EID:Slot Type  State       Size NoVDs 
-----------------------------------------
 0 -        RAID0 Frgn    9.094 TB     1 
 1 -        RAID0 Frgn   10.913 TB     1 
 2 -        RAID0 Frgn   10.913 TB     1 
 3 -        RAID0 Frgn   10.913 TB     1 
 4 -        RAID0 Frgn    9.094 TB     1 
 5 -        RAID0 Frgn  278.875 GB     1 
 6 -        RAID0 Frgn   14.551 TB     1 
 7 -        RAID0 Frgn   16.370 TB     1 
 8 -        RAID0 Frgn    9.094 TB     1 
 9 -        RAID5 Frgn   54.571 TB     1 
10 -        RAID5 Frgn   54.571 TB     1 
-----------------------------------------

我能够成功导入所有 /c0/fall。不幸的是,这最终还是像以前一样陷入了糟糕的境地,其他卷仍然存在,而 raid5 被拆分为两个外部配置(即导入所有外部配置并创建两个新的外部配置)。

更新 2:

将磁盘连接到 GNU/Linux 系统会显示这一点,对我来说,这基本上与 perc 控制器相同:有两个 raid 卷,分别有 5 个和 7 个磁盘。因此,这似乎是固件错误的结果,其中 raid 控制器实际上将卷组拆分为两个功能失调的卷组,因此,合并似乎是不可能的。

Personalities : [raid0] [linear] [multipath] [raid1] [raid6] [raid5] [raid4] [raid10] 
md125 : inactive sdi[0]
      9765912576 blocks super external:/md127/2
       
md126 : inactive sdg[1](S) sdf[0](S)
      1048576 blocks super external:ddf
       
md127 : inactive sdm[4](S) sdi[3](S) sdh[2](S) sdk[1](S) sdl[0](S)
      2621440 blocks super external:ddf
       

未使用的设备:

我正在尝试从这里恢复,但现在的问题是:我可以在 raid 控制器或 GNU/Linux 中重新创建阵列,以便 raid 控制器能够识别该阵列吗?从备份恢复需要相当长的时间。

**更新 3:**

由于有人要求,我不再有检查/详细信息,但这是我自己的工具打印的转储,它提供了更多的结构,并清楚地显示了信息的损坏程度。DDF 数据包含的磁盘不只是阵列中的磁盘,但我的工具只转储了与我想要恢复的阵列配置相关的信息。请注意,我在经过一个小的冒险之后通过重新创建阵列解决了我的问题,所以这只是信息性的。

/dev/sdf
    refno 66fee9c8
    guid 'ATA 999901019c64177c25b6'
    pd   1 6d67850c 'ATA 9999010198734b845e34'
    pd   2 2c442eef 'ATA 99990101a3ff6b169fb3'
    pd   3 859c2a72 'ATA 9999010140f57d7b1911'
    pd   4 2a25447d 'ATA 9999010181a40ea27a38'
    pd   5 6db9e402 'SmrtStor        P^A^W1^@tfM-8'
    pd   6 0176ebaa 'ATA 99990101bd73575777e4'
    pd   7 a63ba301 'ATA 999901017d605c6aadf6'
    pd   8 5254f474 'ATA 999901014ecf2257f8f4'
    pd   9 80e8a86d 'ATA 999901014c775ca92a87'
    pd  10 49416c50 'ATA 99990101d79cd13a1e1e'
    pd  11 fa44428b 'ATA 9999010198bd2187a552'
    pd  12 66fee9c8 'ATA 999901019c64177c25b6'
    pd  13 4a94daa9 'ATA 99990101679d1776307e'
    part 0
        guid 'Dell    ^P'
        size 117190950912
        blocks 19531825152
        disk 0 start 0 ref a63ba301
        disk 1 start 0 ref 5254f474
        disk 2 start 0 ref 80e8a86d
        disk 3 start 0 ref 49416c50
        disk 4 start 0 ref fa44428b
        disk 5 start 0 ref 66fee9c8
        disk 6 start 0 ref 4a94daa9

/dev/sdg
    refno fa44428b
    guid 'ATA 9999010198bd2187a552'
    pd   1 6d67850c 'ATA 9999010198734b845e34'
    pd   2 2c442eef 'ATA 99990101a3ff6b169fb3'
    pd   3 859c2a72 'ATA 9999010140f57d7b1911'
    pd   4 2a25447d 'ATA 9999010181a40ea27a38'
    pd   5 6db9e402 'SmrtStor        P^A^W1^@tfM-8'
    pd   6 0176ebaa 'ATA 99990101bd73575777e4'
    pd   7 a63ba301 'ATA 999901017d605c6aadf6'
    pd   8 5254f474 'ATA 999901014ecf2257f8f4'
    pd   9 80e8a86d 'ATA 999901014c775ca92a87'
    pd  10 49416c50 'ATA 99990101d79cd13a1e1e'
    pd  11 fa44428b 'ATA 9999010198bd2187a552'
    pd  12 66fee9c8 'ATA 999901019c64177c25b6'
    pd  13 4a94daa9 'ATA 99990101679d1776307e'
    part 0
        guid 'Dell    ^P'
        size 117190950912
        blocks 19531825152
        disk 0 start 0 ref a63ba301
        disk 1 start 0 ref 5254f474
        disk 2 start 0 ref 80e8a86d
        disk 3 start 0 ref 49416c50
        disk 4 start 0 ref fa44428b
        disk 5 start 0 ref 66fee9c8
        disk 6 start 0 ref 4a94daa9

/dev/sdh
    refno 4a94daa9
    guid 'ATA 99990101974a122c9311'
    pd   1 6d67850c 'ATA 99990101be1d53ed8c7d'
    pd   2 2c442eef 'ATA 99990101ff58714b7f1b'
    pd   3 859c2a72 'ATA 99990101fa3ac0b94ef7'
    pd   4 2a25447d 'ATA 999901017e74d11eb6e6'
    pd   5 0176ebaa 'ATA 99990101f19b3355ec56'
    pd   6 a63ba301 'ATA 99990101f391d36e91f9'
    pd   7 5254f474 'ATA 99990101fa6d3d5b6c49'
    pd   8 80e8a86d 'ATA 99990101b7ad5947d5c0'
    pd   9 49416c50 'ATA 99990101d2e6918871bb'
    pd  10 4a94daa9 'ATA 99990101974a122c9311'
    pd  11 6db9e402 'SmrtStor        P^A^W1^@tfM-8'
    part 0
        guid 'Dell    ^P'
        size 117190950912
        blocks 19531825152
        disk 0 start 0 ref a63ba301
        disk 1 start 0 ref 5254f474
        disk 2 start 0 ref 80e8a86d
        disk 3 start 0 ref 49416c50
        disk 6 start 0 ref 4a94daa9

/dev/sdi
    refno 49416c50
    guid 'ATA 99990101d2e6918871bb'
    pd   1 2a25447d 'ATA 999901017e74d11eb6e6'
    pd   2 0176ebaa 'ATA 99990101f19b3355ec56'
    pd   3 49416c50 'ATA 99990101d2e6918871bb'
    pd   4 6db9e402 'SmrtStor        P^A^W1^@tfM-8'
    part 0
        guid 'Dell    ^P'
        size 117190950912
        blocks 19531825152
        disk 3 start 0 ref 49416c50

/dev/sdk
    refno 80e8a86d
    guid 'ATA 99990101b7ad5947d5c0'
    pd   1 2a25447d 'ATA 999901017e74d11eb6e6'
    pd   2 0176ebaa 'ATA 99990101f19b3355ec56'
    pd   3 a63ba301 'ATA 99990101f391d36e91f9'
    pd   4 5254f474 'ATA 99990101fa6d3d5b6c49'
    pd   5 80e8a86d 'ATA 99990101b7ad5947d5c0'
    pd   6 49416c50 'ATA 99990101d2e6918871bb'
    pd   7 6db9e402 'SmrtStor        P^A^W1^@tfM-8'
    part 0
        guid 'Dell    ^P'
        size 117190950912
        blocks 19531825152
        disk 0 start 0 ref a63ba301
        disk 1 start 0 ref 5254f474
        disk 2 start 0 ref 80e8a86d
        disk 3 start 0 ref 49416c50

/dev/sdl
    refno 5254f474
    guid 'ATA 99990101fa6d3d5b6c49'
    pd   1 2a25447d 'ATA 999901017e74d11eb6e6'
    pd   2 0176ebaa 'ATA 99990101f19b3355ec56'
    pd   3 a63ba301 'ATA 99990101f391d36e91f9'
    pd   4 5254f474 'ATA 99990101fa6d3d5b6c49'
    pd   5 80e8a86d 'ATA 99990101b7ad5947d5c0'
    pd   6 49416c50 'ATA 99990101d2e6918871bb'
    pd   7 6db9e402 'SmrtStor        P^A^W1^@tfM-8'
    part 0
        guid 'Dell    ^P'
        size 117190950912
        blocks 19531825152
        disk 0 start 0 ref a63ba301
        disk 1 start 0 ref 5254f474
        disk 2 start 0 ref 80e8a86d
        disk 3 start 0 ref 49416c50

/dev/sdm
    refno a63ba301
    guid 'ATA 99990101f391d36e91f9'
    pd   1 2a25447d 'ATA 999901017e74d11eb6e6'
    pd   2 0176ebaa 'ATA 99990101f19b3355ec56'
    pd   3 a63ba301 'ATA 99990101f391d36e91f9'
    pd   4 5254f474 'ATA 99990101fa6d3d5b6c49'
    pd   5 80e8a86d 'ATA 99990101b7ad5947d5c0'
    pd   6 49416c50 'ATA 99990101d2e6918871bb'
    pd   7 6db9e402 'SmrtStor        P^A^W1^@tfM-8'
    part 0
        guid 'Dell    ^P'
        size 117190950912
        blocks 19531825152
        disk 0 start 0 ref a63ba301
        disk 1 start 0 ref 5254f474
        disk 2 start 0 ref 80e8a86d
        disk 3 start 0 ref 49416c50

seq  0 refno a63ba301 dev /dev/sdm
seq  1 refno 5254f474 dev /dev/sdl
seq  2 refno 80e8a86d dev /dev/sdk
seq  3 refno 49416c50 dev /dev/sdi
seq  4 refno fa44428b dev /dev/sdg
seq  5 refno 66fee9c8 dev /dev/sdf
seq  6 refno 4a94daa9 dev /dev/sdh

答案1

好的,这就是我所做的。希望它能帮助下一个人。

事实调查

首先,我将所有磁盘连接到 HBA。GNU/Linux 尝试组装 raid,但确实发现(至少)两个 raid 卷(还有一些额外的卷)。然后我备份了每个磁盘的前 32MB 和后 32MB,并按其 WWID/WWN 进行索引。

然后我下载了 SNIA DDF 规范(https://www.snia.org/tech_activities/standards/curr_standards/ddf) 因为我知道 megaraid/dell (部分) 实现了它(ddf 锚块魔法并非de11de11偶然:),然后编写了一个非常丑陋的脚本来解码数据并理解它。

这表明阵列实际上分为三种不同的配置,一种包含一个磁盘,另一种包含该磁盘和另外 4 个磁盘,还有一种包含剩下的 2 个磁盘。

如果不明白您在做什么,脚本本身就没什么用,所以我没有把它包括在这里。

最终,这让我能够确定磁盘的正确原始顺序。提示:创建阵列后,perccli /c0/s0 show all | grep WWN至少记下 WWN 的顺序()和条带大小。

这个过程还给了我分区的起始偏移量(始终为 0)和大小(19531825152 个扇区)。

H740P(可能还有所有 megaraid 控制器)使用的 raid5 变体称为left-symmetric“带数据连续的 RAID-5 旋转奇​​偶校验 N(PRL=05、RLQ=03)”。

重新组装磁盘进行测试

然后我尝试使用 测试重组 raid mdadm --build。不幸的是,mdadm 拒绝组装 raid5 阵列 - 你 写入数组并销毁数据:(

作为一种解决方法,为了测试顺序是否正确,我以快照模式启动了一个 kvm,使用一些随机的 GNU/Linux 启动映像和/dev/sdavirtio 磁盘作为磁盘:

exec kvmb -snapshot -m 16384 \
         -drive file=linux.img,snapshot=off \
         -drive file=/dev/sdm,if=virtio,snapshot=on \
         -drive file=/dev/sdl,if=virtio,snapshot=on \
         -drive file=/dev/sdk,if=virtio,snapshot=on \
         -drive file=/dev/sdi,if=virtio,snapshot=on \
         -drive file=/dev/sdg,if=virtio,snapshot=on \
         -drive file=/dev/sdf,if=virtio,snapshot=on \
         -drive file=/dev/sdh,if=virtio,snapshot=on

这使得磁盘按指定的顺序显示为/dev/vda/dev/vdb等等,并允许我轻松测试各种选项。 VM 内部的第一次尝试成功:

mdadm --create /dev/md0 -f \
   --metadata 1.0 \
   --raid-devices 7 \
   -z $((19531825152/2))K -c 256K \
   -l raid5 -p ddf-N-continue \
   --assume-clean -k resync \
   /dev/vd?

对于 raid5,分区大小并不重要 - 如果它较大,则 GPT 分区表已损坏并且您有多余的数据,但磁盘的其余部分仍然可以读取。

我通过挂载分区(这不应该引发错误,但即使顺序错误也可能会成功)并使用来验证数据的正确性, btrfs scrub它会检查元数据和数据块的校验和,这是最终的测试,也是 btrfs 的一大优点。

然后我再次运行了 backzp。

然后,我按顺序记下了所有磁盘的 WWN,以便可以使用 重新创建它perccli。我还备份了卷本身的第一个和最后一个 1GB 数据,以防 raid 控制器覆盖这些数据。

将卷移回 RAID 控制器

由于大约 14TB 的数据未备份(因为需要花费一些精力才能从其他地方检索到这些数据,而我又迫不及待地等待副本),因此进行完全恢复并不是我所期待的选项,因此我尝试将阵列移回控制器。

我的第一次尝试是将阵列格式化为包含 raid5 卷的 DDF 容器,使用与控制器相同的参数,但不幸的是,megaraid 控制器 - 虽然本身使用 DDF - 不支持“外部”DDF 导入,并且仅显示磁盘为“未配置良好”。

然后我尝试通过再次添加它来重新创建数组,例如:

perccli /c0 添加 vd r5 名称=XXX 驱动器=3,6,9,1,2,3,0 pdcache=off wb ra strip=256

在已启动的系统上使用 perccli 执行此操作可确保 RAID 控制器执行后台初始化,这不会造成破坏,并且对于 RAID5,即使磁盘顺序或条带大小错误也不会破坏数据,只要您使用确切地以任意顺序排列原始阵列中的所有磁盘,不要遗漏一个或给出太多。

这是我失败的地方——不知何故,我完全搞乱了磁盘的顺序,还损坏了卷的前 1.5MB。我完全不知道出了什么问题,但我尝试了很多排列,却没有看到正确的数据,以至于我以为 raid 控制器会以某种方式重新排序我的磁盘(但它没有,它完全按照指定的顺序进行排序)。

长话短说,我再次将磁盘连接到 HBA,并尝试但未能理解。这时我的原始备份就派上用场了:尽管我忘记了磁盘的顺序,但我仔细查看了备份,并通过查看十六进制转储将潜在顺序降低到两种可能的排列。创建阵列并mdadm测试数据让我找到了正确的顺序。

然后我再次记下 WWN 的顺序,将磁盘连接到控制器,启动并执行perccli /c0 add...。然后我恢复了卷的前 1.5MB(其中包括 GPT 分区和 LVM 标签,以及一些旧的剩余垃圾数据,这些数据在猜测顺序时非常有用)。在这种情况下,一定程度的信心能够撤消错误是有帮助的。

结果:阵列恢复,btrfs 一致,并且控制器现在正在后台初始化,这会使整个系统变慢几天,但这只是小小的代价。

学到的东西

我学到了很多东西!

  1. perc 控制器(可能还有所有 megaraid 控制器)无法很好地应对频繁快速且间歇性的磁盘问题 - 我怀疑磁盘快速消失和返回触发了竞争条件,控制器试图将新配置写入磁盘,但只对某些磁盘成功执行了部分操作,最终将 raid 一分为二。这显然是一个固件错误。但谁会想到电源线会出现故障呢......

  2. mdadm 对于理解或显示 DDF 标头没有多大帮助 - 我根本无法理解所显示的数据,而且我自己解码标头时发现,这是因为输出中缺少大量信息--detail--examine它在实验中也没有多大帮助,因为它拒绝进行非破坏性的只读汇编。

  3. perc/megaraid 控制器内部使用 SNIA DDF 格式,这是一个可公开访问的规范,非常有用,尽管最后我在没有这些信息的情况下才弄清楚我需要什么。

  4. 能够仅从数据中猜测出 RAID 条带的正确顺序非常有用。剩余的垃圾和其他有助于此的数据也非常有用。从现在开始,我将考虑将“磁盘 1”、“磁盘 2”等写入 RAID 卷标头的“空白”区域(前 2MB 中有很长的 0 字节)。

  5. 很容易搞砸——设备名称、RAID 成员编号、WWN、插槽编号等都不同,这意味着需要管理大量数据,而且 WWN 很长,我的老眼光也不怎么好了。另外,我组织能力不强,过于自信 :/

  6. 使用带有数据的磁盘创建和删除阵列不会擦除数据,至少对于 RAID5 和使用后台初始化来说是这样。前台初始化几乎肯定会将磁盘清零。这意味着您可以根据需要多次创建和删除阵列,而不会冒数据丢失的风险,但有一个可能的例外:删除阵列有时需要强制选项,因为 RAID 控制器认为它由于有效的分区标签而处于“正在使用”状态。而这可能将 GPT 标签清零 - YMMV,并确保备份了前几兆字节以防万一。

  7. Perc/megaraid 无法理解非 dell/megaraid DDF 容器。至少我还没找到如何让我的控制器接受 mdadm 创建的 DDF 容器。如果能够在 GNU/Linux 中格式化磁盘并将它们移回控制器,那将大有帮助,并且可以避免我这边数小时的痛苦。

概括

我恢复了所有内容,而无需从备份中恢复,但代价是几天缓慢的后台初始化时间。我在上面写下了我的解决方案,以防其中一些可能对处于类似情况的其他人有用。

答案2

您可以尝试从已关闭的服务器上卸下所有驱动器,然后移除两个组,然后重新连接磁盘。这应该会将所有磁盘重置为“外部”状态。然后尝试通过一次操作将它们全部导入。

原则上,此控制器应使用 SNIA DDF 磁盘格式。HBA(不是 RAID 控制器)不会解释元数据,从而允许软件访问它。因此,如果您能够使用 HBA 将其连接到 Linux 机器,它可以使用其 MD RAID 检测和组装此阵列(Linux 除了可以理解自己的元数据外,还可以理解 DDF 和 IMSM 元数据),因此您至少可以访问其上的数据。例如,如果这些驱动器是 SATA,您只需将它们连接到主板即可。

为了以防万一,我会将所有使用 HBA 的磁盘转储到某个备份存储中。以防万一出现问题。

更新:看到你的进步,我可以提出进一步的建议。

您可以尝试使用十六进制编辑器调整元数据。可能需要手动将它们设置为相同的 UUID。

另一个想法是使用重新创建数组mdadm --assume-clean,它仅写入元数据并组装一个数组,但跳过将组件归零。

  • 首先,猜测正确的顺序和布局;这可以从当前元数据中推断出来。
  • 按照说明构建覆盖层在 wiki 中,这将给予你无限次尝试
  • 成功后,在驱动器上重复成功的组装,而不是覆盖设备

另外,在重新组装之前,我会拿另一组驱动器(不含有价值的数据),模拟(尝试重复)它们的问题,然后按照这些说明先尝试修复它们。

相关内容