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

时间:2018-08-27 11:28:16

标签: windows powershell filesystems corruption refs

我想以编程方式测试Windows ReFS Health Check and Recovery功能。

注意:ReFS仅检测到位腐烂(无法自我修复)。要让ReFS 两者都检测并自动修复,还必须使用存储空间。因此,我准备了具有两向镜像设置的存储镜像空间池S:\

已启用ReFS完整性流,

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

根据发现的说明here

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

我找不到引入位腐的简单方法。我尝试的所有系统仅执行了ReFS可接受的合法更改。

如果可能的话,最好使用PowerShell方法。 Perl,Python或其他任何好的工具。

谢谢。

3 个答案:

答案 0 :(得分:2)

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

这是我进行测试的方式(我输入的速度很快,所以希望不要遗漏任何东西)

  1. 几乎用文件填充ReFS镜像存储空间。
  2. 为所有文件启用文件完整性:

    Get-ChildItem-路径“ i:*”-递归| Set-FileIntegrity-启用$ True-执行$ False

我们稍后使用Enforce $ True做另一项测试,但首先进行错误的测试。稍后您会看到原因。阅读启用和强制。

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

尝试将所有文​​件从存储空间批量复制到其他驱动器。

我的测试表明,事件日志中几乎没有任何东西可以修复,并且几乎没有任何内容。可能只有一两个错误,仅此而已。您可能认为一开始可能没有太多损坏。现在,设置Enforce $ True并再次执行复制操作。启用Enforce后,副本将在数十个带有校验和错误的文件处停止-证明在这种情况下ReFS正在查看校验和。

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

检查这些线程:

Why Use ReFS?

ReFS test with corrupt data. Does it work

Has anyone run the Data Integrity Scan on an ReFS volume?

ReFS / Storage Spaces确实会不时记录问题,并且人们看到了,因此他们只是认为它运行良好。而且,人们找不到找到测试破坏的好方法,因此他们不会打扰测试。我在Windows 10 Pro for Workstations SKU上进行了测试,结果很糟糕。

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

答案 1 :(得分:1)

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

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

如果您的Windows计算机是VM,那么也许可以使用HEX编辑器从主机上编辑VHDX文件(“硬盘”)最简单。

将特定文件映射到包含其数据运行的磁盘扇区可能有些困难。有几种检测数据实际位置的方法,但是您可以采用一种简单的蛮力方法,即写入特定的看似唯一的数据片段,然后简单地扫描整个磁盘以找到它们。

答案 2 :(得分:1)

仅需警告一下:非常非常,请务必谨慎,如果您决定启用 Integrity Streams

短版

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

长版

在启用Integrity Streams且出现读取错误的情况下,ReFS会删除错误的文件。

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

没有确认。没有警告。没有吸引力。

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

使用非常无害的术语,这种行为非常安静documented

  

Resilient File System (ReFS) overview

     

主要好处

     

弹性

     
      
  • 保存数据-如果卷损坏,并且不存在损坏数据的备用副本,请ReFS removes the corrupt data from the namespace。 ReFS在处理大多数不可纠正的损坏时将卷保持在线状态,但是在极少数情况下,要求ReFS将卷脱机。
  •   

(重点是我的)

存储空间将记录到Windows事件日志中,表明您的数据现在已消失:

  
      
  • 来源:Microsoft-Windows-ReFS
  •   
  • 事件ID :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的数据就不见了-就像删除文件一样。

但是文件继续消耗存储空间中的空间。换句话说,它似乎实际上仍然保留在文件中,但是它是“不可访问的”

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

所以要注意

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

  • 我们宁愿删除您的数据
  • 比暴露读取错误

如果启用完整性流:那么您同意,您宁愿删除数据而不愿返回部分数据。

我想不起来世界上任何地方,任何行业,任何地方的任何情况,有人希望他们的“弹性” 文件系统有意删除 (如果发生一个读取错误)。

但这就是您要的。

我想有些有意义:

  • “我的有效完整性
  • “在弹性上

如何模拟

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

enter image description here

翻转一位,然后保存。

enter image description here

在本演示中,我实际上不会这样做,因为在我的三向镜像中,我启用了完整性流。而且我不想丢失所有数据。

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

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

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

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

“强制执行” 到底意味着什么?如何“强制启用” 完整性流,但不启用它们?与往常一样,documentation of Get-FileIntegrity不包含任何文档。

所以我尝试检查documentation of 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

奖金阅读