在 Linux 软件 RAID 阵列中重复使用插槽号

在 Linux 软件 RAID 阵列中重复使用插槽号

当我的一台 Linux 机器中的一个硬盘驱动器出现故障时,我借此机会从 RAID5 迁移到 6 磁盘软件 RAID6 阵列。

在迁移时,我并没有全部 6 个驱动器 - 更具体地说,第四和第五个(插槽 3 和 4)驱动器已经在原始阵列中使用,因此我使用几个missing设备创建了 RAID6 阵列。我现在需要将这些驱动器添加到那些空插槽中。使用mdadm --add 导致正确的 RAID6 配置,但有一个小问题 - 新驱动器被放置在新的插槽,结果如下/proc/mdstat

...
md0 : active raid6 sde1[7] sdd1[6] sda1[0] sdf1[5] sdc1[2] sdb1[1]
      25185536 blocks super 1.0 level 6, 64k chunk, algorithm 2 [6/6] [UUUUUU]
...

mdadm -E验证设备超级块中的实际插槽号是否正确,但显示的数字/proc/mdstat仍然诡异的

我想修复这个故障,既是为了满足我内心的完美主义,也是为了避免将来在危机中造成任何潜在的混乱。有没有办法指定新设备应占据 RAID 阵列中的哪个插槽?

更新:

我已经验证了插槽号在组件设备超级块中仍然存在。对于我使用的 1.0 版超级块,这将是Linux 内核源代码dev_number中定义的字段include/linux/raid/md_p.h。我现在正在考虑直接修改该字段以更改插槽号 - 我认为没有某种标准方法来操作 RAID 超级块?

更新2:

要修改设备超级块中的插槽分配,我需要执行以下操作:

  1. 调整dev_number
  2. 修改dev_roles数组,将旧位置标记为空,并将适当的角色放置在新位置
  3. 重新计算超级块校验和

(1)和(2)相对简单,可以通过脚本或小程序自动完成。(3)开始稍微推动一些事情 - 我必须从驱动程序中提取超级块校验和代码md,对其进行修改以与用户空间程序一起工作并希望获得最好的结果。

我不想花时间调试 C 应用程序并冒着因错误而导致数组损坏的风险,而是决定尝试欺骗md/mdadm为我完成工作,正如我在回答中提到的那样。这似乎奏效了,尽管它可能仍有一定程度的风险...

相关内容