当我的一台 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:
要修改设备超级块中的插槽分配,我需要执行以下操作:
- 调整
dev_number
- 修改
dev_roles
数组,将旧位置标记为空,并将适当的角色放置在新位置 - 重新计算超级块校验和
(1)和(2)相对简单,可以通过脚本或小程序自动完成。(3)开始稍微推动一些事情 - 我必须从驱动程序中提取超级块校验和代码md
,对其进行修改以与用户空间程序一起工作并希望获得最好的结果。
我不想花时间调试 C 应用程序并冒着因错误而导致数组损坏的风险,而是决定尝试欺骗md
/mdadm
为我完成工作,正如我在回答中提到的那样。这似乎奏效了,尽管它可能仍有一定程度的风险...