我想以编程方式测试Windows ReFS Health Check and Recovery功能。
注意:ReFS仅检测到位腐烂(无法自我修复)。要让ReFS 两者都检测并自动修复,还必须使用存储空间。因此,我准备了具有两向镜像设置的存储镜像空间池S:\
。
已启用ReFS完整性流,
PS C:\> Set-FileIntegrity -FileName 'S:\' -Enable $True
根据发现的说明here。
如何以编程方式模拟文件损坏以测试ReFS运行状况检查和恢复功能?
我找不到引入位腐的简单方法。我尝试的所有系统仅执行了ReFS可接受的合法更改。
如果可能的话,最好使用PowerShell方法。 Perl,Python或其他任何好的工具。
谢谢。
答案 0 :(得分:2)
要创建损坏,请使用Hard Disk Sentinel Pro中的破坏性写测试。将其设置为随机工作,而不是顺序工作。我将其设置为写入位的随机模式。只需运行一到三分钟,您就会在显示的地图上看到整个驱动器上的许多斑点都被破坏了。
这是我进行测试的方式(我输入的速度很快,所以希望不要遗漏任何东西)
为所有文件启用文件完整性:
Get-ChildItem-路径“ i:*”-递归| Set-FileIntegrity-启用$ True-执行$ False
我们稍后使用Enforce $ True做另一项测试,但首先进行错误的测试。稍后您会看到原因。阅读启用和强制。
尝试将所有文件从存储空间批量复制到其他驱动器。
我的测试表明,事件日志中几乎没有任何东西可以修复,并且几乎没有任何内容。可能只有一两个错误,仅此而已。您可能认为一开始可能没有太多损坏。现在,设置Enforce $ True并再次执行复制操作。启用Enforce后,副本将在数十个带有校验和错误的文件处停止-证明在这种情况下ReFS正在查看校验和。
问题是,日志中几乎没有任何内容。另外,在启用Enforce的情况下,我在一个文件上遇到了校验和错误,该文件应该在关闭Enforce的第一次测试中已修复!
检查这些线程:
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会删除错误的文件。
没有确认。没有警告。没有吸引力。
一个不可恢复的读取错误,所有数据都消失了。而且,如果您不喜欢它:您不应该启用 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 进行写入:
翻转一位,然后保存。
在本演示中,我实际上不会这样做,因为在我的三向镜像中,我启用了完整性流。而且我不想丢失所有数据。
我正在运行命令以确保完全禁用了 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