Lazy loaded image
新手教程
📇新手教程:什么是校验盘,校验盘有什么作用
字数 7082阅读时长 18 分钟
2023-9-4
2025-6-27
type
status
date
slug
summary
tags
category
icon
password
如需技术支持,请点击 👉 联系方式
Unraid 官方的校验盘说明文档:FAQ:Parity

1、什么是校验盘(Parity Disks)

Unraid 的校验盘用于保护阵列硬盘的数据,其采用奇偶校验机制来实现数据的冗余和重建。
Unraid 最多只可以添加两块校验盘,并且需要注意的是,校验盘只能保护阵列里的硬盘数据,缓存池的数据不受校验盘保护。
有一块校验盘的情况下可以允许阵列中的一块硬盘损毁而不丢失数据;如果有两块校验盘则允许两块硬盘损毁而不丢失数据。

2、校验盘的工作原理

2.1、奇偶校验的过程

原理和作用:校验盘对阵列里面所有的硬盘数据进行奇偶求和,然后将计算得到的校验值数据存储到校验盘中。当阵列里面有硬盘出现故障,例如掉盘,以至于无法读取该盘的数据时,校验盘此时就会模拟故障硬盘中的数据,起到容灾效果,为用户争取数据备份的时间,从而实现数据保护的目的。
举个例子,假设你阵列中的硬盘突然掉盘了,那么依赖于该硬盘里面数据的某些应用将会无法正常运行。但如果有校验盘的情况下,你会发现即使这个硬盘掉盘了,但是阵列中的数据依然是完整的,那是因为此时校验盘“模拟”了这个盘里面的数据,保证系统和应用不会因为掉盘的问题而出现系统崩溃,为用户争取了“救灾”的机会和时间。
除了上述的容灾作用,校验盘还可以纠正文件数据错误。
需要说明的是,校验数据不是一般的文件数据,因此校验盘是没有文件系统格式的(如下图)。
可以看到校验盘的“文件系统”一列并没有对应的文件系统
可以看到校验盘的“文件系统”一列并没有对应的文件系统
我们知道,计算机存储数据的最小单位是 bit(比特),因此你可以理解硬盘里面的数据是一串长长的“比特流”,而这一长串的比特流是由 01 组成的,如:
在上面的图片中,阵列里面有三个硬盘,每个盘里面所存储的数据量不同,因此他们里面“比特流”( 01 )的长短也不一样。
为了保护阵列里面的这些硬盘,此时我们引入校验盘(Parity):
notion image
由于校验盘需要对阵列里所有硬盘的数据进行计算,因此使用校验盘有一个硬性要求 —— 校验盘的容量一定要大于或等于阵列里面最大的那一个硬盘。
比如说阵列里容量最大的那一个硬盘是 16T,那么当你打算添加校验盘时,就必须使用大于或者等于 16T 的硬盘。
校验盘会对每个硬盘在同一列位置的数据进行奇偶求和,如果求和出来的是偶数,那么用 0 表示;如果是奇数,那么用 1 表示。
比如上图的第一列数据中,Disk1、Disk2 和 Disk3 的数据都是 0 ,那么求和之后也为 0 ),因此校验盘就会在同一位置写入数值 0
而第二列的数据中是 一个 1 与两个 0 ,求和出来的是奇数 1 ),因此校验盘就会在同一位置写入数值 1
如果是 ,那么得到的值是 —— 为奇数,用 1 表示。
通过上面的计算过程可以知道,不管你有多少个硬盘,最终都可以求和得出 0 或者 1 ,所以这也是为什么一个奇偶校验盘就可以实现数据保护。
在有一个校验盘的情况下,只有校验盘和一个数据盘同时损坏才会导致数据的直接丢失(不可恢复),但是这种情况很少见,一般不需要太担心。如果你实在担心,你可以再增加一个校验盘,这样即使一个校验盘和一个阵列数据盘同时损坏(或者两个阵列数据盘同时损坏),那么也不会导致数据的直接丢失。

2.2、数据的重建

notion image
如上图所示,假设 Disk2 出现问题以至硬盘内的数据无法被读取,那么此时校验盘借助已经存储的校验数据,可以保证阵列里面数据的完整性,换句话说,用户依然可以正常读取所有的数据。
那么校验盘是如何实现的?
前面介绍了奇偶校验的工作原理,知道校验盘中存储的是奇偶求和之后的数据,那么当阵列中某个硬盘内的数据出现了丢失或者损毁,系统就可以使用校验数据反推得到这个硬盘上的数据,从而实现数据冗余或者数据重建。
打个比方,已知 ,求 的值,那么不难算出 就相当于阵列中其他盘的数据, 就相当于校验盘中的数据, 已知的情况下就可以倒推出 的值。
那么具体到我们的这个例子中,校验盘在第一列位置中的校验和是 0 ,意味着在这一位置下所有的硬盘数据校验和是偶数,那么就反过来说明 Disk2 在这个位置下的数值必然是 0 ,否则奇偶求和就得不到偶数值,其他位置的数据同理。
如下图所示,通过这样的方式,校验盘可以在硬盘损毁的情况下依然可以保持数据的完整性并可以实现数据的重建:
倒推出 Disk2 上的数据流
倒推出 Disk2 上的数据流

2.3 校验数据的更新机制

通过前面的介绍,我们知道 Unraid 的奇偶校验数据是如何生成的。那么接下来我们还需要理解,在已经完成了奇偶校验的情况下,如果阵列中数据盘里面的数据发生变化(例如文件的增、删、改),那么此时校验盘里面的奇偶校验值会产生什么样的变化?校验数据的更新机制是怎样的?

(1)删除文件会不会影响校验数据?

这是一个关于校验数据比较常见的疑惑,答案是
原因在于,当阵列中的硬盘出现“写入”操作时,校验盘上的奇偶校验信息会进行更新,以保持整个阵列的校验一致性。
这里需要明确什么是“写入”:对于硬盘来说,除了读取之外,删除文件或修改文件,都是一种对硬盘的”写入”操作,因此都会触发 Unraid 奇偶校验信息的更新机制。
💡 知识补充:文件删除的本质

如何理解文件“删除”?

想象一下,你的硬盘是一座巨大的图书馆,文件就是书架上的书,而文件系统(如 XFS 或 BTRFS)就是图书馆的“索引卡片目录”
  • 索引卡片: 记录了每本书(文件)的名字、位置(在哪个书架的哪个位置)。
  • 书本身: 存储在书架上的实际内容。
当你“删除”一个文件时,操作系统做的并不是立刻跑去书架把那本书烧掉。它只是走到索引目录那里,把对应的索引卡片抽出来撕掉
这时:
  • 从目录上看: 这本书已经不存在了。
  • 从书架上看: 这本书其实还静静地待在原位,只是现在没人知道它在哪了。这块空间被标记为“可用”,直到有新书(新文件)需要放进来时,才会覆盖它。

这对 Unraid 奇偶校验意味着什么?

Unraid 的奇偶校验是基于硬盘上每一个数据位的真实状态来计算的,它并不知道什么是“文件”,只知道“数据”。
结合上面的比喻:
  1. 会更新的部分(撕掉索引卡): 当你删除文件时,你改变了“索引卡片目录”这个东西本身的数据。因为这个目录本身也作为一个文件存储在硬盘上,所以它所在的那一小块数据区域发生了变化。Unraid 检测到这个变化,会立刻重新计算并更新奇偶校验盘上对应这“一小块”区域的奇偶值。这个操作非常小,几乎是瞬间完成。
  1. 不更新的部分(书还在架子上): 被删除文件的实际数据(书本身)还完好无损地躺在硬盘上,没有发生任何变化。因此,存储这些数据的广大区域,其奇偶值完全不需要重新计算
当你删除一个文件时,奇偶校验盘会立即更新,但这个过程非常快,因为它更新的不是整个文件的数据,而只是文件系统的“索引”信息。从硬盘的视角来看,文件系统会更新硬盘中的元数据区域和空间分配表,告诉系统这些数据块可以被再次使用,这些更新会直接写入到磁盘中,这实际上也是一种数据写入,因此就会触发校验盘的数据更新。
所以再进一步归纳:
  • 删除文件会触发奇偶校验更新吗? 会。
  • 更新的是什么? 只更新记录文件位置的元数据(Metadata)所对应的奇偶值,这是一个非常小的写操作。
  • 需要重新计算整个文件的奇偶值吗? 不需要。 因为文件的实际数据块没有被改动。

(2)影响校验数据的操作

总结上述内容,当对一个文件进行如下操作时,会影响校验数据:
  • 写入新的文件或数据块
  • 修改已存在文件的内容
  • 删除数据
  • 格式化(具体解释见下文“💡 补充说明:硬盘格式化并不等于“清除”硬盘”)
这些操作导致数据盘的某些比特发生变化,由于需要保持奇偶校验数据一致,Unraid 系统需要据此重新计算校验值。
💡 补充说明:硬盘格式化并不等于“清除”硬盘
不管是在 Windows、Unraid(Linux)或是其他的系统中,格式化并不意味着对硬盘进行“物理”清除,而是指在硬盘上重新创建或初始化一个文件系统。
格式化会导致文件系统的元数据会被重写(这个过程符合前面所说的“写入”概念),原有的分区结构、文件目录和数据索引会被清空。虽然这些操作让硬盘看起来像是被清空了,但实际上,存储在硬盘上的数据(比特)仍然存在,直到新的数据写入相同区域之后,此时旧数据才会被新的数据覆盖。
格式化相当于告诉文件系统,原先被占用了的数据存储位置,可以重新被使用(被写入)。
格式化并不会彻底消除硬盘上的数据。如果硬盘没有经过进一步的数据擦除或覆盖,那么仍然有可能使用数据恢复软件恢复格式化之前的文件。这是因为格式化操作通常只是删除了指向数据块的指针,而没有覆盖数据块本身。所以如果说你不小心将你的硬盘进行了格式化,那么此时不要对硬盘进行写入,因为写入会覆盖原因的数据,导致无法再进行恢复。
相对的,如果你希望对一个硬盘进行真正的“清除”,那么从硬盘底层的角度来说,你需要做的“写零”——将硬盘上所有的比特位写入 0 。当所有的比特位为 0 的情况下,才真正意味着这个硬盘的“空”的,没有任何的数据。
在本文的 Q2:往阵列里添加新硬盘会不会导致校验数据重建? 章节中就介绍了如何在 Unraid 系统中对一个硬盘进行“写零”操作。
以 Windows 系统为例,当我们尝试格式化一个存储设备时,如果我们没有勾选“快速格式化”,那么就会采用“写零”的方式对硬盘进行清除,这个过程会很慢(读者可以拿闲置的U盘尝试一下);而如果勾选了“快速格式化”,那么仅仅只是重新创建或初始化一个文件系统,这个过程速度会很快,这也是为什么叫做“快速格式化”。
notion image

3、常见问题

Q1:如何解决加了校验盘之后阵列写入速度变慢的问题?

A:开启 “设置 - 硬盘设置 - 可调式 (md_write_method) - 重建写入”
“重建写入”的英文原文是 reconstruct write
notion image
不过需要注意的是,使用“重建写入”会导致阵列里面的硬盘无法休眠,具体的原理可以参考这里的详细解释:
有空我再单独解释,最近有点忙没空细说…

Q2:往阵列里添加新硬盘会不会导致校验数据重建?

A:如果你添加的是新硬盘且没有数据在里面,那么不会重建数据;但如果你添加的硬盘里面已经有数据了,且里面的数据你希望保留,那么需要重新进行奇偶校验。
前面介绍原理的时候说过,所有硬盘的数据经过奇偶求和计算之后才会得到最终的校验数据,但假设说你需要加入一块已有数据的硬盘直接使用(比如你从其他 unRAID 服务器上拿过来的硬盘),那么理论上就得重新进行奇偶求和计算,否则校验盘无法保护你的数据。
但如果说你加入进来的这个硬盘是全新的,或者说你不需要里面已有的数据,希望作为一个新的硬盘给到 unRAID 去使用,那么这种情况下可以实现不触发系统校验和的重新计算。方法很简单,那就是对硬盘进行“写零(write zero)”操作即可。一个数据全为 0 的硬盘不会影响校验盘中已有的校验值,因为 0 与其他任何值求和都不会改变最终的求和结果。
前面说过计算机存储数据的最小单位是比特 bit ,比特的值只有 01 ,所有的比特值都为 0 就意味着数据为空,因此写零也就表示对硬盘的数据进行清空。
unRAID 上有一个叫做 Unassigned Devices Preclear 的插件,你可以通过此插件提前对硬盘进行写零来清空数据,然后再加入到阵列中,这样就不会触发校验和的重新计算。
notion image
Unassigned Devices Preclear 插件使用方法
首先,需要进行清零的硬盘不能加入到阵列中,并且你还需要安装另外两个插件:Unassigned Devices 和 Unassigned Devices Plus 。
notion image
这两个插件的作用是可以对阵列之外的硬盘组进行分区删除或者格式化等常见的硬盘操作,还可以挂载远程共享等。
安装之后,你需要借助这两个插件去将需要清零的硬盘的所有分区删除,为此你需要开启插件的“破坏性模式”之后才可以对一个硬盘的分组进行删除:
notion image
notion image
点击硬盘 ID 右侧的 ❌ 来删除分区:
notion image
输入“是”确认分区删除
输入“是”确认分区删除
当所有分区都删除之后就会在硬盘 ID 的右侧显示一个 Unassigned Devices Preclear 插件的小图标(可点击),表示此时硬盘可以进行清零操作,如下图所示:
notion image
当点击之后弹出清零操作的具体参数设置,一般情况下按照下图的设置即可:
Cycles 选择 1 即可,选多了没必要,因为会对硬盘有损耗。
notion image
点击 START 之后就会开始执行清零操作,如下图所示:
notion image
notion image
点击 👁️ 图标会弹出当前的进度信息:
notion image
点击眼睛左边的小图标则会显示日志信息,如:
notion image
硬盘清零的操作会比较费时间,博主清零一个 4T 的盘最长的就花费了 19 个小时 30 分钟,所以读者朋友们请根据实际需要来选择要不要清零,因为有可能做校验的时间都没有这么长。
硬盘的读写速度会直接影响清零所需要的时间。
博主 4 T 硬盘做清零的日志信息参考:
清零成功
清零成功
notion image
notion image
notion image

Q3:更换校验盘需要怎么做?

A:直接更换即可。
校验盘存储的校验数据并不是一般的文件数据,所以校验数据独立于阵列里的硬盘数据,去掉校验盘并不会影响阵列里面的文件,因此你可以生成一个新的配置之后直接更换校验盘。
生成新配置的方法:工具( TOOLS ) → 新配置( New Config )。
不过需要小心的是,更换了新的校验盘之后,在新的校验盘没完成奇偶校验之前,你的阵列数据不被保护,所以建议在这一段时间内停止对硬盘进行写入,等待奇偶校验完成之后再进行。

Q4:当我删除了硬盘的数据,已有的校验数据是不是也会被删除?

A:不会。
删除阵列硬盘里的数据不会影响已经存在的校验数据,因为校验盘就是为了保护你的数据不丢失而存在的。如果删除数据也会删除已有的校验数据,那么当你遇到硬盘损坏时,从某种程度上就好比“物理”删除了数据,那又该如何重建数据呢?
你可以参考我在 Unraid 社区里面的一个回帖:
更正:上述表述是不正确的,博主想当然了,跟大家道歉!以下是重新整理的观点。
答案是,当用户删除了硬盘里面的某些数据(文件),那么校验盘里面的校验数据也会同步进行更新,但不存在校验数据被删除的说法。删除文件后,校验盘会在很短的时间内更新校验数据,用户几乎感受不到,因为需要更新的数据只是很小的一部分,被删除文件的实际数据(书本身)还完好无损地躺在硬盘上,没有发生任何变化。因此,存储这些数据的广大区域,其奇偶值完全不需要重新计算。
更详细说的说明,请阅读 2.3 校验数据的更新机制 章节。

Q5:一次完整的奇偶校验需要花多长的时间?

A:不同的硬盘和其他因素会影响所需的时间,没有一个标准的值可以借鉴。
奇偶求和是一个“读取硬盘数据 → CPU 奇偶求和运算 → 写入求和值到校验盘”的过程,时间的长短主要受硬盘读写速度影响(CPU 性能的影响可以忽略不计),除此之外还可能有其他的因素,因此没有一个标准的时间可以让读者参考。
不过博主可以提供我自己的数据给到大家去参考:我的阵列只有一块 16T 的硬盘和一个 16T 的校验盘,完成一次完整的奇偶校验花费了 22 小时 42 分 32 秒,平均读取速度为 195.7 MB/s。
我这个校验的速度算是快的了,因为我的阵列里面只有一个 16T 的数据盘,如果数据盘多一点可能就没这么快了。
notion image
如果按照我的数据去衡量奇偶校验的时间,那么每 1T 数据所花费的时间大约为 1.45 个小时,因此:
  • 如果你最大的那个盘是 6T,那么大概需要 8.7 小时完成一次完整的奇偶校验;
  • 如果你最大的那个盘是 8T,那么大概需要 11.6 小时完成一次完整的奇偶校验;
  • 如果你最大的那个盘是 10T,那么大概需要 14.5 小时完成一次完整的奇偶校验;
  • 如果你最大的那个盘是 12T,那么大概需要 17.4 小时完成一次完整的奇偶校验;
  • 如果你最大的那个盘是 14T,那么大概需要 20.3 小时完成一次完整的奇偶校验;
  • 如果你最大的那个盘是 18T,那么大概需要 26.1 小时完成一次完整的奇偶校验;

Q6:我是不是可以利用校验盘来实现数据的转移?

A:可以,但请不要这么做。
比如说你希望将阵列里某个硬盘内所有的数据转移到新的硬盘上,你可以将这个旧的硬盘直接拿出来,然后用新的硬盘在阵列中替换旧的硬盘,这样就可以利用校验盘在新的硬盘上去重建数据,从而实现数据的转移/恢复。但是非常不建议这么去做,因为校验盘的数据重建功能不应该作为一种常规的数据备份/转移的手段。
大家需要明白的是,不管是校验盘还是 Raid 阵列,数据的冗余功能都不应该作为日常数据备份或者数据转移的手段。因为数据冗余的目的是为了让你在遇到数据丢失的情况下,依然可以保证数据的完整性,从而不让你的系统崩溃或者业务下线,你要做的应该是尽快将重要的数据进行备份(拷贝到别的地方),然后用正常的硬盘替换掉损坏的硬盘来重建数据。
数据的重建并不是百分百成功的,所以也有不少人建议普通个人用户尽量不要去使用诸如 Raid5 阵列这样的 Raid 机制,因为发生过不少重建数据时其他硬盘也损坏的情况(尤其是同批次生产出来的硬盘)。比如 Raid5 重建过程中如果某个硬盘也坏掉了,那么整个阵列将直接损毁,数据也就直接丢失无法恢复;并且 Raid 阵列数据恢复是一个门槛比较高的技术活,没有经验和知识储备的普通用户遇到此类问题往往无从下手。因此我建议一般的用户尽量做好重要数据的备份才是最保险的手段。
参考:

Q7:校验速度很慢是什么原因?

原因可能有很多,但是有以下两种可能:

(1) SATA 控制器模式使用的是 IDE

这时候你需要去主板的 BIOS 设置中将其改为 AHCI/SATA ,例如:
notion image

(2)硬盘数据线/电源连接问题

可能是由于硬盘的 SATA 数据线或者电源线有问题导致,此种情况会导致硬盘出现 SAMRT 上的错误:
notion image
此时你需要去检查一下硬盘的数据线以及电源线的接线情况,重新插拔一下,如果问题依旧建议可以考虑更换一下数据线。
参考案例:

Q8:能不能指定校验盘只校验/保护某几个硬盘?

A:目前不能。
校验盘会校验阵列里面的所有数据,所以只要你把硬盘加入到阵列里面,那么所有的硬盘都会被校验。
但因为将来 Unraid 会推出多个阵列的功能(什么时候还不知道,可能会在 6.13 版本出这个功能),那么这时候可能就可以实现校验盘只校验某几个硬盘的需求了,因为你可以将需要校验的硬盘放到单独的一个阵列中,而其他不需要保护的硬盘单独放另一个阵列。

Q9:如何使用校验盘重建数据?

我把这一问题的详细说明放到了另一篇文章,大家可以参考这篇文章里面的步骤去操作: 新手教程:如何替换阵列里面的硬盘

Q10:如何实现移除阵列硬盘的情况下,不重建校验数据

 
上一篇
unRAID内存的重要性以及内存测试方法
下一篇
6.12.4 关于失联问题的解决办法以及相关更新说明

评论
Loading...