btrfs 是如何工作的,它有什么作用?

Pet*_*etr 23 btrfs

btrfs 擦洗究竟有什么作用?根据完全不清楚的手册页,它会进行一些错误检查。什么样的错误检查?它有多可靠?它能够恢复一些错误吗?它是如何工作的?它适用于每个 btrfs 磁盘吗?

Mar*_*amp 28

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

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

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

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

也可以看看:

  • Btrfs ->维基百科上的校验和树和清理:有关 btrfs 数据清理的技术信息。
  • 生日问题 ->维基百科的概率表:将“散列空间”视为“数据块数”,将“散列元素数”视为“损坏的数据块数”,这给出了存在具有两个副本的数据块的概率在 RAID 1 设置中损坏。


str*_*gee 8

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

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

但是如果 btrfs 不决定从第二个磁盘读取呢?请记住,有两个副本,因此它可以从第一个第二个磁盘读取。如果它从第一个磁盘读取,它不会注意到任何错误。它唯一会注意到任何问题的时间是第一个磁盘也降级时。现在您真的很痛苦,因为恢复数据为时已晚 - 第二个磁盘的副本已经损坏了一段时间,而第一个副本(这是您用来恢复第二个磁盘的)现在也已损坏!

这就是btrfs scrub进来的地方。它读取所有数据,而不是所有文件。这包括元数据,还包括通常不在读取路径中的文件的辅助副本。当它读取这些辅助副本时,这为 btrfs 的带内纠错创造了机会,以启动并从冗余副本中恢复数据。

  • 您确定在 RAID1 中读取仅从 1 个磁盘完成吗?至少对于 mdadm RAID,情况不应该是这样。从两个磁盘读取应该并行发生,但数据不同,这意味着它应该是从一个磁盘读取的两倍。读取性能提升是 RAID 1 的主要功能之一。 (2认同)

归档时间:

查看次数:

21071 次

最近记录:

7 年,4 月 前