对于 wiki 中的 RAID 6,额外的优先级校验位 Q 是通过移位来计算的。
https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_6
假设我们要将数据分布到 n {\displaystyle n} n 个块上。我们的目标是定义两个奇偶校验值 P {\displaystyle \mathbf {P} } \mathbf {P} 和 Q {\displaystyle \mathbf {Q} } \mathbf {Q} ,称为综合征,从而形成一个由 n + 2 {\displaystyle n+2} n+2 个物理驱动器组成的系统,该系统能够抵御其中任意两个驱动器的丢失。为了生成多个独立综合征,我们需要对大小为 k > 1. {\displaystyle k>1.} {\displaystyle k>1.} 的数据块执行奇偶校验计算。实践中的典型选择是块大小 k = 8 {\displaystyle k=8} {\displaystyle k=8},即按字节对数据进行条带化。我们将数据块 D {\displaystyle D} D 的以二进制表示形式表示为 d 0 d 1 。 . . dk − 1 {\displaystyle d_{0}d_{1}...d_{k-1}} {\displaystyle d_{0}d_{1}...d_{k-1}},其中每个 di {\displaystyle d_{i}} d_{i} 均为 0 或 1。
...
当驱动器数量增加到 n > k {\displaystyle n>k} {\displaystyle n>k} 时,该系统将不再起作用。这是因为如果我们将移位运算符 k {\displaystyle k} k 次重复应用于长度为 k {\displaystyle k} k 的块,我们最终会回到起点。
在 ZFS RAID-Z2 实现中(总结如下)开发者博客文章,该算法基于H. Peter Anvin 的论文, 也ZFA RAIDZ 源代码),如果将数据块 D 的大小设置为 256 位,则 k 应为 265,从而允许 255 种不同的移位。那么理论上支持的数据驱动器的最大数量应该是 256 个驱动器(无移位 + 255 次移位),不是吗?
最大值被提及H. Peter Anvin 的论文,但它说的是255,这似乎他忽略了无移位的情况。
伽罗瓦域 GF(2 8 ) 允许最多 257 个驱动器,其中 255(2 8 − 1)可以是数据驱动器;其原因如下所示。
此外我不懂为什么在 shift-2、shift-3 和 shift-4 中,它们需要与 x 7进行异或,而其余五个则不需要。
答案1
经过多次研究,我可以确认RAID-Z2 中支持的 vdev 理论最大值为 255+2 vdev。
进一步阅读以下部分维基百科,
普遍平价制度
通过更仔细地选择奇偶校验函数,可以支持更多数量的驱动器。
...
gi {\displaystyle g^{i}} g^{i} 的效果可以看作是一个精心选择的线性反馈移位寄存器对数据块的作用。[30] 与简化示例中的位移不同,该位移只能在编码开始重复之前应用 k {\displaystyle k} k 次,而多次应用运算符 g {\displaystyle g} g 可以保证产生 m = 2 k − 1 {\displaystyle m=2^{k}-1} {\displaystyle m=2^{k}-1} 个唯一可逆函数,这将允许长度为 k {\displaystyle k} k 的块支持最多 2 k − 1 {\displaystyle 2^{k}-1} 2^{k}-1 个数据块。
通过精心选择的 LFSR 算法,在 k 位之间,我们可以生成远多于 k 个的唯一序列。
返回H. Peter Anvin 的论文,论文中的 x 是(一个字节的)位,而移位和 XOR 0001 1100(x 7的)会产生下一个移位字节。从第 6 点到第 12 点应该证明这种移位和 XOR 0001 1100 算法会产生 255 个唯一偏差。(然而数学不是我的专长,我无法理解它们。)
在算法中使用的ZFS RAID 源代码基于 H. Peter Anvin 的论文,因此 RAID-Z2 共享相同的理论最大值 255 个唯一序列。
因此,在 C 语言中,乘以 2 是 ((a << 1) ^ ((a & 0x80) ? 0x1d : 0))。
我们提供一种机制,一次性对 64 位值执行字段乘法运算,而不是一次对一个字节执行。其工作原理是,从每个字节的最高位创建一个掩码,并使用该掩码有条件地应用 0x1d 的 XOR。
但是源代码中既没有使用VDEV_RAIDZ_MUL_2(x)
nor ,而是使用了更简单的。这需要进一步计算才能证明和理解这一部分。VDEV_RAIDZ_MUL_4(x)
VDEV_RAIDZ_64MUL_2