3

我想以编程方式测试Windows ReFS 健康检查和恢复功能。

注意:ReFS 仅检测 bitrot(无自愈)。要同时检测和自动修复 ReFS,还必须使用存储空间。因此,我准备了一个S:\具有 2 路镜像设置的存储镜像空间池。

ReFS 完整性流已启用,

PS C:\> Set-FileIntegrity -FileName 'S:\' -Enable $True

按照此处找到的说明。

如何以编程方式模拟文件损坏以测试 ReFS 健康检查和恢复功能?

我找不到一种简单的方法来引入 bit-rot。我尝试的所有系统都只执行 ReFS 可接受的合法更改。

如果可能,最好使用 PowerShell 方法。Perl、Python 或任何其他好东西。

先感谢您。

4

4 回答 4

4

要创建损坏,请使用 Hard Disk Sentinel Pro 中的破坏性写入测试。将其设置为随机工作而不是按顺序工作。我将其设置为写入随机的位模式。只需运行一到三分钟,您就会在显示的地图上看到整个驱动器上的一大堆点被破坏。

这是我做一些测试的方法(我打字很快,所以我希望我不会遗漏一些东西)

  1. 几乎用文件填满 ReFS 镜像存储空间。

  2. 为所有文件启用文件完整性:

    Get-ChildItem -Path 'i:*' -Recurse | Set-FileIntegrity -Enable $True -Enforce $False

我们稍后使用 Enforce $True 进行另一项测试,但先执行错误的测试。稍后你会明白为什么。阅读启用和执行。

  1. 卸下其中一个驱动器并将其连接到第二台计算机上的 SATA 端口。
  2. 在第二台计算机上,使用 Hard Disk Sentinel 引入文件损坏
  3. 删除损坏的驱动器并将其放回具有存储空间的第一台计算机中。您现在将拥有一个镜像存储空间,其中一个驱动器正常,一个驱动器有一堆损坏的文件。

尝试将存储空间中的所有文件大量复制到其他驱动器。

我的测试表明几乎没有任何东西得到修复,并且几乎没有任何东西出现在事件日志中。也许一两个错误,就是这样。您可能会认为一开始可能没有多少损坏。现在设置 Enforce $True 并再次执行复制操作。启用 Enforce 后,副本将在几十个带有校验和错误的文件处停止——证明在这种情况下 ReFS 正在查看校验和。

问题是日志中几乎没有显示任何内容。此外,在启用 Enforce 的情况下,我在一个文件上遇到了一个校验和错误,该文件应该在第一次测试期间在 Enforce 关闭的情况下被修复!

检查这些线程:

为什么使用 ReFS?

使用损坏的数据进行 ReFS 测试。行得通吗

有人在 ReFS 卷上运行数据完整性扫描吗?

ReFS/Storage Spaces 确实会不时记录问题,人们会看到这一点,所以他们只是认为它工作得很好。此外,人们找不到创建测试损坏的好方法,因此他们不会打扰测试。我在 Windows 10 Pro for Workstations SKU 上进行了测试,结果很糟糕。

请自己进行一些测试以确认我的发现。

于 2018-09-08T07:52:14.810 回答
1

听起来您想绕过文件系统直接写入底层存储。这意味着直接写入磁盘/分区/卷。在 Windows 中,这可以通过处理较低级别的结构来完成,例如\\.\PhysicalDrive0- 您可以打开此类设备的“文件”句柄并直接写入扇区。您可能会发现一些低级工具可以做到这一点。

在 Linux 中,这稍微容易一些,因为您可以使用它dd来写入任何块设备。

如果您的 Windows 机器是 VM,那么从主机编辑 VHDX 文件(“硬盘”)可能是最简单的方法,可能使用 HEX 编辑器。

将特定文件映射到包含其数据运行的磁盘扇区可能有点困难。有几种方法可以检测数据的真实位置,但您可能会诉诸一种简单的暴力方法,即写入一段看似独特的特定数据,然后简单地扫描整个磁盘以找到它。

于 2018-08-29T19:12:39.003 回答
1

只是一个警告:如果您决定启用Integrity Streams,您需要非常、非常非常小心。

简洁版本

Integrity Streams 禁用所有弹性,并将导致 ReFS 删除有读取错误的文件。

长版

启用 Integrity Streams 后,如果出现读取错误,ReFS 将删除坏文件。

  • 如果您有 300 GB 的文件(例如 WindowsSever2012R2_prod.vhdx)
  • ReFS 甚至可以检测到单个不可纠正的位
  • 它将删除整个文件

没有确认。没有警告。没有上诉。

一个不可恢复的读取错误,所有数据都消失了。如果您不喜欢它:您不应该启用完整性流。

这种行为被非常安静地记录下来,使用了非常无害的术语:

弹性文件系统 (ReFS​​) 概述

主要优势

弹性

  • 挽救数据- 如果卷损坏并且损坏数据的备用副本不存在,ReFS removes the corrupt data from the namespace. ReFS 在处理大多数不可纠正的损坏时使卷保持联机,但在极少数情况下需要 ReFS 使卷脱机。

(强调我的)

存储空间将记录您的数据现已消失的 Windows 事件日志:

  • 来源:Microsoft-Windows-ReFS
  • 事件编号:513

(警告):文件系统检测到文件损坏。The file has been removed from the file system namespace. 该文件的名称是“M:\VirtualDisks\WindowsServer2012R2_Prod.vhdx”。

所以,“警告”,我们删除了一个虚拟服务器,以及上面的所有内容,因为我们发现了一个坏位。

通过启用 Integrity 流,您可以特别选择加入此 *un-*resilient 功能。

数据可能实际上并未被删除

文档说明:

ReFS 从命名空间中删除损坏的数据

这是真的;您在任何地方都找不到该文件-它已经消失了。如果您有一个 1.2 TB 的数据库文件,并且有一个不可恢复的位,那么您的 1.2 TB 数据就消失了——就像删除一个文件一样。

但是文件继续用完存储空间中的空间。换句话说,该文件似乎实际上仍然存在,但它是"inaccessible"

但是鉴于没有记录或已知的方法可以使文件再次“可访问” (即“取消删除”它),结果是相同的 - 您的数据被删除。

所以请注意

完整性流的一个基本设计目标是:

  • 我们宁愿删除您的数据
  • 而不是暴露一个读取错误

如果您启用完整性流:那么您同意您处于宁愿删除数据而不是冒险返回部分数据的情况。

我想不出任何情况,在任何地方,在任何行业,在世界的任何地方,有人会希望他们的“弹性”文件系统在出现一次读取错误的情况下故意删除所有内容。

但这就是你所要求的。

我想这有点道理:

  • “我有效的完整性
  • “过度弹性

如何模拟它

以管理员身份运行HxD ,打开\.\PhysicalDiskx进行写入:

在此处输入图像描述

翻转一点,然后保存。

在此处输入图像描述

我不会在这个演示中实际使用它,因为在我的三向镜像上我启用了完整性流;我不想丢失我的所有数据。

更新:也许您可以选择不丢失所有数据

我正在运行命令以确保我已完全禁用任何意外使用Integrity Streams的任何地方,并且输出Get-FileIntegrity有一些奇怪的东西:

PS M:\> Get-Item . | Get-FileIntegrity

FileName  Enabled  Enforced
--------  -------  --------
M:\       False    True

“强制”到底是什么意思?Integrity Streams怎么可能被“强制执行”,但没有被启用?像往常一样,文档不Get-FileIntegrity包含文档。

所以我尝试检查文档Set-FileIntegrity;它有东西!

-执行

指示如果完整性流指示数据损坏,是否启用对文件的阻止访问。

如果为此参数指定值 $True,则 cmdlet 还会启用文件的完整性。

就是这样!

  • 这是默认功能的损坏,
  • 这将导致您完全丢失数据
  • 如果发生最小的不可纠正的读取错误

妈妈叉着衬衫球。谁是想出那个的分叉板凳。

它默认开启!默认情况下绝对不应该启用该功能!该功能甚至不应该存在!

所以现在我正在运行一个命令来递归设置选项:

  • 完整性流:禁用
  • 静默删除所有数据:已禁用

命令

首先是查找启用了完整性的任何文件的命令:

PS M:\> Get-ChildItem -Recurse | Get-FileIntegrity | Where {$_.Enabled -EQ $true}

FileName                                    Enabled Enforced
--------                                    ------- --------
M:\Folder1\Folder 2\The Video File 102.mkv  True    True
M:\Folder1\Folder 2\The Video File 101.mkv  True    True
M:\Folder1\Folder 2\The Video File 103.mkv  True    True
M:\Folder1\Folder 2\The Video File 104.mkv  True    True
M:\Folder1\Folder 2\The Video File 108.mkv  True    True
M:\Folder1\Folder 2\The Video File 109.mkv  True    True
M:\Folder1\Folder 2\The Video File 105.mkv  True    True
M:\Folder1\Folder 2\The Video File 111.mkv  True    True
M:\Folder1\Folder 2\The Video File 106.mkv  True    True
M:\Folder1\Folder 2\The Video File 107.mkv  True    True
M:\Folder1\Folder 2\The Video File 112.mkv  True    True
M:\Folder1\Folder 2\The Video File 110.mkv  True    True

所以,是的,我有一些数据处于危险之中。现在我们要关闭它:

PS M:\> Get-ChildItem -Recurse | Get-FileIntegrity | Where {$_.Enabled -EQ $true} | Set-FileIntegrity -Enable $False

奖金阅读

于 2019-11-17T14:24:36.610 回答
1

我只想指出,我在最新的 Windows 11 上测试了这种行为,以下是我的观察结果:

1 - 如果您有镜像存储空间,并且单个磁盘上的文件中有数据损坏,REFS 将在启用完整性流的情况下自动为您修复 Ref Image -> 1

2 - 如果损坏在两个磁盘上,REFS 将阻止对该文件的访问,但不会将其删除。您可以通过手动将强制标志更改为 false 来重新获得对文件的访问权限(例如 Get-Item 'E:\claclaboth.txt' | Set-FileIntegrity -Enable $True -Enforce $False)Ref Image -> 2

3 - 从任务计划程序定期清理(在 Windows -> 数据完整性检查和扫描下)在 Windows 11 上似乎仍然没有执行任何操作,但数据完整性扫描任务似乎可以正确清理磁盘,您只需要添加一个触发器即可安排它,否则它将永远不会运行。

根据上述发现,我认为您可以保留强制标志默认值,因为 REFS 不会删除您的文件,只是阻止它。

抛开性能问题不谈,如果想要类似 ZFS 的弹性但需要留在 Windows 上,REFS 现在似乎成熟了很多。

于 2022-01-09T03:37:13.000 回答