ReFS 完整性流

完整性流是 ReFS 中的可选功能,它使用校验和来验证和维护数据完整性。 虽然 ReFS 始终对元数据使用校验和,但默认情况下,ReFS 不会为文件数据生成或验证校验和。 完整性流是一项可选功能,允许用户对文件数据使用校验和。 启用完整性流后,ReFS 可以清楚地确定数据是否有效或已损坏。 此外,ReFS 和存储空间可以共同自动地更正损坏的元数据和数据。

工作原理

可以为单个文件、目录或整个卷启用完整性流,并且可以随时切换完整性流设置。 此外,文件和目录的完整性流设置继承自其父目录。

启用完整性流后,ReFS 将为该文件的元数据中的指定文件创建和维护校验和。 此校验和允许 ReFS 在访问数据之前验证数据的完整性。 在返回已启用完整性流的任何数据之前,ReFS 将首先计算其校验和:

计算文件数据的校验和

然后,此校验和与文件元数据中包含的校验和进行比较。 如果校验和一致,则将数据标记为有效并返回给用户。 如果校验和不一致,则表示数据已损坏。 卷的复原能力决定了 ReFS 对损坏的应对方式:

  • 如果 ReFS 装载在不可复原的简单空间或裸驱动器上,ReFS 将向用户返回一个错误,而不返回损坏的数据。
  • 如果 ReFS 装载在可复原的镜像或奇偶校验空间上,则 ReFS 将尝试更正损坏。
    • 如果尝试成功,ReFS 将应用纠正性写入以还原数据的完整性,并会将有效数据返回至应用程序。 应用程序仍不知道任何损坏。
    • 如果尝试失败,ReFS 将返回错误。

ReFS 会将所有损坏都记录在系统事件日志中,该日志将反映损坏是否已修复。

纠正性写入可还原数据完整性

性能

尽管完整性流为系统提供更大的数据完整性,但它也会产生性能成本。 这有几种不同的原因:

  • 如果启用了完整性流,则所有写入操作都将成为写时分配操作。 尽管这避免了任何读取-修改-写入瓶颈,但由于 ReFS 不需要读取或修改任何现有数据,因此文件数据经常会变得碎片化,从而使读取延迟。
  • 根据系统的工作负载和基础存储,计算和验证校验和的计算成本可能会导致 IO 延迟增加。

由于完整性流会带来性能成本,因此建议在性能敏感系统上禁用完整性流。

完整性清理器

如上所述,ReFS 会在访问任何数据之前自动验证数据完整性。 ReFS 还使用后台清理器,以便 ReFS 能够验证不经常访问的数据。 该清理器将定期扫描卷,识别潜在损坏,然后主动触发任何损坏数据的修复。

注意

数据完整性清理器只能验证启用了完整性流的文件的文件数据。

默认情况下,清理器每四周运行一次,不过你可以在 Microsoft\Windows\Data Integrity Scan 下的“任务计划程序”中配置此间隔。

示例

ReFS 使用 Get-FileIntegrity 和 Set-FileIntegrity cmdlet 来监视和更改文件数据完整性设置

Get-FileIntegrity

若要查看是否为文件数据启用了完整性流,请使用 Get-FileIntegrity cmdlet

PS C:\> Get-FileIntegrity -FileName 'C:\Docs\TextDocument.txt'

也可以使用 Get-Item cmdlet 获取指定目录中所有文件的完整性流设置

PS C:\> Get-Item -Path 'C:\Docs\*' | Get-FileIntegrity

Set-FileIntegrity

若要对文件数据启用/禁用完整性流,请使用 Set-FileIntegrity cmdlet

PS C:\> Set-FileIntegrity -FileName 'H:\Docs\TextDocument.txt' -Enable $True

也可以使用 Get-Item cmdlet 设置指定文件夹中所有文件的完整性流设置

PS C:\> Get-Item -Path 'H\Docs\*' | Set-FileIntegrity -Enable $True

Set-FileIntegrity cmdlet 也可直接用于卷和目录

PS C:\> Set-FileIntegrity H:\ -Enable $True
PS C:\> Set-FileIntegrity H:\Docs -Enable $True

其他参考