btrfs擦洗如何工作,它有什么作用?


19

btrfs擦洗到底能做什么?根据完全不清楚的手册页,它会进行一些错误检查。什么样的错误检查?它的可靠性如何?它能够恢复一些错误吗?它是如何工作的?是否可以在每个btrfs磁盘上使用?


3
上下文:BTRFS存储校验和,因此它始终能够确定文件(或元数据)是否正常或是否已损坏。几乎所有其他文件系统(例如ext4)都没有校验和,因此它们不会阻止您读取已被错误的驱动器损坏的文件(该驱动器即将死并且已经开始损坏数据)。这是BTRFS中的重要数据保护功能,这使得清理成为可能。
basic6

Answers:


23

我不知道它是否还有其他功能,但我知道至少btrfs scrub可以进行全磁盘数据清理。基本上,它读取磁盘上的所有数据*,重新计算其校验和,然后将重新计算的校验和与存储的校验和进行比较。当存储和重新计算的校验和不匹配时,系统知道存在损坏。

一旦检测到损坏,其行为取决于您的磁盘设置。例如,如果您具有RAID 1(镜像),则btrfs scrub可以通过从另一个磁盘复制未损坏的版本来修复损坏的数据。如果某些数据的所有副本都已损坏(例如,多磁盘损坏或首先没有冗余副本),那么btrfs scrub除了警告您外,您无能为力。

这一点很重要的原因是,硬盘驱动器在读取和写入位时仅约99.999999999999%的可靠性。因此,每隔数TB的数据I / O,可能会出现错误。尽管在正常磁盘访问期间可以并且可以检测到错误(并且已修复(假设有冗余副本仍然有效)),但是常规的全磁盘清理能够在足够多的积累相同数据的所有副本被破坏之前找到并修复错误。

*我也使用“数据”而不是“文件”来包含元数据。Btrfs将文件和相应的元数据(包括校验和)存储在数据块中,所有数据都由进行校验和检查btrfs scrub

也可以看看:

  • Btrfs-> Wikipedia上的Checksum树和清理:有关btrfs数据清理的技术信息。
  • 生日问题-> Wikipedia上的概率表:将“哈希空间”视为“数据块数”,将“哈希元素的数目”视为“损坏的数据块数”,这给出了同时存在两个副本的数据块的可能性RAID 1设置中损坏。

我还没有数,但我愿意猜测您的可靠性数字下降了几个数量级。消费者HDD通常被指定为10 ^ -14位的UBE速率。换句话说,每读取10 ^ 14位将产生一个不可恢复的读取错误。问题在于这是针对整个部门的。您要么获得整个部门,要么一无所获(或者就是这个主意;无声错误完全是另一杯茶)。因此,错误会因扇区大小而扩大,对于高级格式驱动器,扇区大小为32,768位。因此,实际错误率更像是10 ^ -10到10 ^ -11 readbit-errors。
CVn 2015年

@MichaelKjörling我认为这里的部门无关紧要...。我有计算机两个内部1TB硬盘驱动器的最后29个btrfs清理的记录。数据量在270和300 GiB之间变化(对于所有组合的读取,总共读取了1.35 * 10 ^ 14到1.49 * 10 ^ 14位)。在这些清理过程中发现了3个错误。假设非清理I / O既不会引起也不是固定位腐烂,那只是“ 99.999999999999%可靠”驱动器的预期错误率的2到2¼倍。即使只有4096位的扇区,我认为您的论点仍会期望我的驱动器到现在已经有成千上万个错误。
Mark Haferkamp

@MichaelKjörling据我了解制造商的规格表(希捷和WD),这是有点错误,而不是整个领域都会消亡。答案中的9个数字甚至是乐观的:100-1/10^14有16个9个数字,而帖子中只有9个(对应10 ^ 12)。
卢克,

@Luc如果部门死亡较少见,那很好。即将死去的扇区意味着驱动器实际上(可能)发生故障,可能需要更换。误码只会导致静默数据损坏,可以使它变得嘈杂,足以从备份中恢复。数学注释:实际计算为1-10^n,然后将其转换为百分比,因为人类不喜欢前导小数。另外,我在之前的评论中也没有提到驱动器位于RAID 1中(因此每个驱动器上都具有相同的270-300 GiB数据),这解决了另一个明显的计算错误。
Mark Haferkamp '18

5

扩展Mark Haferkamp的出色答案,btrfs scrub读取所有数据而不是所有文件是关键属性,实际上是使其变得如此有用的原因。请记住,btrfs具有内置的RAID支持。假设您有一个btrfs文件系统,该文件系统跨越两个已配置为使用RAID1的驱动器。在这种情况下,当您写入文件时,该写入将复制到两个磁盘。(使用一个更复杂的示例会变得更加复杂,但是对于这种简单的情况,总是会发生这种情况。)但是,当您从该文件读取数据时,读取操作只会命中一个磁盘(因为浪费了两次读取文件的时间)除非第一份副本由于某种原因无法使用)。

现在说第二个btrfs驱动器正在退化并开始破坏文件系统中的数据。当您从该磁盘读取块时,btrfs会注意到校验和不匹配,并将从已知良好的副本(第一个驱动器上的副本)中恢复带内块。它将数据返回给应用程序调用read()(或执行任何操作),就像什么都没有发生一样。

但是,如果btrfs不决定从第二个磁盘读取该怎么办?请记住,有两个副本,因此它可以从第一张第二张磁盘读取。如果它是从第一个磁盘读取的,则不会发现任何错误。唯一会发现任何问题的时间就是第一个磁盘降级时。现在您真的很费劲,因为恢复数据为时已晚-第二个磁盘的副本已经损坏了一段时间,而第一个副本(这就是您用来恢复第二个磁盘的内容)现在也已损坏!

这就是btrfs scrub进来的地方。它读取所有数据,而不是所有文件。这包括元数据,但也包括通常不在读取路径中的文件的辅助副本。当它读取这些辅助副本时,这为btrfs的带内错误纠正提供了机会,可以插入并从冗余副本中恢复数据。


2
您确定在RAID1中仅从1个磁盘读取数据吗?至少对于mdadm RAID并非如此。应该从两个磁盘并行读取,但是要读取不同的数据,这意味着读取速度应该是从一个磁盘读取的两倍。提高读取性能是RAID 1的主要功能之一
Petr

@Petr是的,你是对的。仅从一个磁盘读取单个块。
奋斗

@Petr:详细说明,-在正常情况下,MDADM和BTRFS都不从两个磁盘读取相同数据的两个副本。他们只读一份。-MDADM能够负载平衡并在副本之间分配读取,从而获得两倍的读取速度。(因为所有副本A都放入磁盘1,所有副本B都放入磁盘2。因为mdadm将恰好使用2个磁盘)。-BTRFS有更多困难。(因为副本A和B将
放入

关于安全性:-MDADM和BTRFS都会在出现问题的情况下尝试其他副本。-对于MDADM,它可以检测到的唯一问题是“磁盘没有响应”(因为它对上面存储的文件没有实际想法)-对于BTRFS,它还可以检测静默数据损坏(因为对数据进行校验和,等等) BTRFS的RAID层知道一个副本是否可以信任或是否必须获取另一个副本)
DrYak

最后但并非最不重要的一点是关于RAID5 / 6:-在MDADM中它可以正常工作。(但不会检测到无提示的损坏)-在BTRFS中,目前不处理无提示的损坏(因为仅获取另一个副本(在RAID1中)比进行擦除编码计算来猜测该条带的哪个成员损坏和更容易),应该从剩余的数据/奇偶校验中重建)。换句话说:截至今天(2017年8月),请勿使用btrfs的RAID5 / 6。
DrYak
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.