ReFS 完整性流

适用范围:Windows Server 2022、Windows Server 2019、Windows Server 2016、Windows Server 2012 R2、Windows Server 2012、Windows 10

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

工作原理

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

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

Compute checksum for file data

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

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

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

Corrective write restores data integrity

性能

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

  • 如果启用了完整性流,则所有写入操作都将成为写时分配操作。 尽管这避免了任何读取-修改-写入瓶颈,但由于 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

其他参考