mdadm 使用空驱动器快速设置 RAID?

mdadm 使用空驱动器快速设置 RAID?

我正在使用 mdadm 将一些 RAID5 磁盘重新创建为 RAID6。我关心的驱动器上没有数据。

设置 RAID 需要一段时间来设置形状 - 我接受当有数据需要被条带化和奇偶校验计算时,但是对于这些驱动器,它们是空的 - 或者至少我希望它们被视为空的。

那么有没有办法跳过奇偶校验计算并告诉 mdadm 只需设置超级块并完成,或者,当没有数据可移动时,它究竟花费了这么多时间在做什么?

md3 : active raid6 sdf3[5] sde3[4] sdd3[3] sdc7[2] sdb3[1] sda3[0]
      1953114112 blocks super 1.2 level 6, 512k chunk, algorithm 2 [6/6] [UUUUUU]
      [>....................]  resync =  1.3% (6790144/488278528) finish=409.3min speed=19604K/sec

请注意,我并不是在谈论从--assume-clean包含您知道正确的 RAID 阵列的现有磁盘组重建阵列。我谈论的是应该被视为空的阵列,而不是被视为正确条带化的阵列。

因此,为了回答这个问题,我们假设设备已预先填充了零。

答案1

您可以使用--assume-clean,但除非您使用的是 raid5(而不是 raid6)并且磁盘实际上全是零,否则第一次运行奇偶校验时,会出现需要纠正的错误,因此您不应该这样做。您无需等待重新同步完成即可开始使用阵列;它会在后台运行,直到完成。

答案2

一般而言,在清零磁盘上启用设备冗余的新创建的阵列不需要任何事先同步,只要这些清零输入块的校验和(或 RAID1 的副本)也为零即可。没有功能差异如何将块归零:在创建 RAID 之前,或通过 RAID 同步过程。因此,实际上,--assume-clean可以安全地使用这种方法来跳过耗时的(并且在 SSD 磨损的情况下,因此是不希望的)随机(重新)写入块从零到零的过程。

据我了解,mdadm写入意图位图是设备本地(而非数组本地)指示器,用于指示各个设备之间的一致性。我不确定位图本身是否用作数组级别不一致的指示器,又名如果所有位图字节都为零,则可以假定阵列同步;如果不是,则必须为 RAID1 重写校验和/复制数据。

在上述假设的约束下,我认为创建无需事先同步即可实现完全冗余的阵列的最安全方法是使用 将其创建在保证归零的磁盘上--assume-clean --bitmap=none,并且(如果需要)在第二步中添加位图。这在任何情况下都可以提供一致性而无需同步,在降级模式下也是安全的,并且还可以通过 checkarray 运行提供干净的结果。同样,这是正确的仅有的对于 RAID 级别,计算出的零的校验和也为零,或者对于 RAID1,零的副本也产生零。

以下是一些猜测。我对 mdadm 的内部工作原理了解不够多,因此无法确定如果非零磁盘与 一起使用--assume-clean --bitmap=none。因此,请谨慎对待以下陈述。

假设读取的校验和计算仅在降级模式下完成(出于性能原因,很有可能),在将磁盘捆绑到阵列中之前不将其归零也是安全的:每次写入阵列后,块的校验和都会被“懒惰”地更正。未写入阵列的数据块(因此校验和不匹配)可以被视为不重要:从文件系统的角度来看,它们是“可用空间”。而且由于读取未分配的块不会触发校验和错误,因此无论出于何种原因,与从单个磁盘读取未分配的块在功能上应该没有区别。

RAID1 也是如此:已写入的数据在所有镜像成员上都是一致的。从未写入的数据导致读取不一致并不重要。

如果在降级模式下使用部分写入的阵列,已写入的数据具有正确的校验和/副本,因此可以正确重新创建。所有空闲块仍然无关紧要。如果 mdadm 从从未写入的块重新计算校验和返回垃圾,它只是不同的垃圾,但仍然无关紧要,因为文件系统未使用。

简而言之:文件系统会跟踪已分配的块。由于这些块在最终需要重新读取之前已写入阵列,因此数据是一致的。

至于 checkarray,它无法知道哪些块曾经被写入,因此它需要纠正所有尚未写入的块,无论是基于校验和的块,还是像 RAID1 一样只是副本。除非写入意图位图发挥的作用比我预期的更重要。

我还没有提到的是软件错误、断电导致的文件系统损坏以及磁盘扇区故障的问题。可能的情况和有效的缓解措施(例如data=orderedext4 的挂载选项)留给读者练习。

答案3

您无法使用软件或硬件 RAID 执行此操作。所有校验和都需要写入磁盘,这需要时间。您可以稍后再执行此操作,但磁盘中未写入的部分必须先执行此操作,然后您才能使用它们。

这主要是因为 RAID 系统和文件系统彼此不了解。ZFS 对此有一个解决方案,但 RAID 部分与文件系统深度集成。因此 RAID 子系统实际上知道磁盘的哪些部分用于存储数据以及哪些部分可以稍后使用,然后将校验和写入它们。

您可以为软件 RAID 添加吞吐速度,或者在写入所有校验和之前开始使用 RAID,然后让软件 RAID 稍后为您处理。这就是 @psusi 所写的。

相关内容