Answers:
我不知道它是否还有其他功能,但我知道至少btrfs scrub
可以进行全磁盘数据清理。基本上,它读取磁盘上的所有数据*,重新计算其校验和,然后将重新计算的校验和与存储的校验和进行比较。当存储和重新计算的校验和不匹配时,系统知道存在损坏。
一旦检测到损坏,其行为取决于您的磁盘设置。例如,如果您具有RAID 1(镜像),则btrfs scrub
可以通过从另一个磁盘复制未损坏的版本来修复损坏的数据。如果某些数据的所有副本都已损坏(例如,多磁盘损坏或首先没有冗余副本),那么btrfs scrub
除了警告您外,您无能为力。
这一点很重要的原因是,硬盘驱动器在读取和写入位时仅约99.999999999999%的可靠性。因此,每隔数TB的数据I / O,可能会出现错误。尽管在正常磁盘访问期间可以并且可以检测到错误(并且已修复(假设有冗余副本仍然有效)),但是常规的全磁盘清理能够在足够多的积累相同数据的所有副本被破坏之前找到并修复错误。
*我也使用“数据”而不是“文件”来包含元数据。Btrfs将文件和相应的元数据(包括校验和)存储在数据块中,所有数据都由进行校验和检查btrfs scrub
。
也可以看看:
100-1/10^14
有16个9个数字,而帖子中只有9个(对应10 ^ 12)。
1-10^n
,然后将其转换为百分比,因为人类不喜欢前导小数。另外,我在之前的评论中也没有提到驱动器位于RAID 1中(因此每个驱动器上都具有相同的270-300 GiB数据),这解决了另一个明显的计算错误。
扩展Mark Haferkamp的出色答案,btrfs scrub
读取所有数据而不是所有文件是关键属性,实际上是使其变得如此有用的原因。请记住,btrfs具有内置的RAID支持。假设您有一个btrfs文件系统,该文件系统跨越两个已配置为使用RAID1的驱动器。在这种情况下,当您写入文件时,该写入将复制到两个磁盘。(使用一个更复杂的示例会变得更加复杂,但是对于这种简单的情况,总是会发生这种情况。)但是,当您从该文件读取数据时,读取操作只会命中一个磁盘(因为浪费了两次读取文件的时间)除非第一份副本由于某种原因无法使用)。
现在说第二个btrfs驱动器正在退化并开始破坏文件系统中的数据。当您从该磁盘读取块时,btrfs会注意到校验和不匹配,并将从已知良好的副本(第一个驱动器上的副本)中恢复带内块。它将数据返回给应用程序调用read()
(或执行任何操作),就像什么都没有发生一样。
但是,如果btrfs不决定从第二个磁盘读取该怎么办?请记住,有两个副本,因此它可以从第一张或第二张磁盘读取。如果它是从第一个磁盘读取的,则不会发现任何错误。唯一会发现任何问题的时间就是第一个磁盘降级时。现在您真的很费劲,因为恢复数据为时已晚-第二个磁盘的副本已经损坏了一段时间,而第一个副本(这就是您用来恢复第二个磁盘的内容)现在也已损坏!
这就是btrfs scrub
进来的地方。它读取所有数据,而不是所有文件。这包括元数据,但也包括通常不在读取路径中的文件的辅助副本。当它读取这些辅助副本时,这为btrfs的带内错误纠正提供了机会,可以插入并从冗余副本中恢复数据。