BTRFS 数据完整性 (CRC32c) 和 HDD 数据完整性(扇区 ECC)

BTRFS 数据完整性 (CRC32c) 和 HDD 数据完整性(扇区 ECC)

我是 BTRFS 的新手,我试图理解为什么 BTRFS 使用 CRC32c,而 HDD 已经具有扇区级数据完整性 ECC。是因为 BTRFS 不依赖介质来提供数据完整性保护吗?谢谢。

答案1

磁盘可以并且确实会悄悄地损坏数据。看http://storagemojo.com/2007/09/19/cerns-data-corruption-research/这只是这方面研究的一个例子。

答案2

我只是不相信磁盘经常存在未报告的错误并将其归因于 FUD 的论点。是的,如果您向错误检测代码抛出足够的随机数据,它有时会报告数据正确,但实际上并不正确。但事情是这样的:驱动器并没有尝试读取随机数据。它正在读取大部分已正确写入和读回的数据。然后通过可以修复许多错误位的纠错码。要获得未报告的错误,您必须获得比平常多得多的原始错误数才能压倒 ECC,然后必须对它们进行排列正好以便 ECC 的输出自行安排正好它欺骗了 EDC 认为它是好的。赔率是很多更高,至少 EDC 会注意到该错误并将其报告为不可纠正的错误。多频繁发生?基本上永远不会,除非驱动器即将发生故障或在写入过程中突然断电。因此,如果无法纠正的错误几乎永远不会发生,并且未报告的错误的可能性要低一百万倍,这说明了什么?

另一方面,如果您无论如何都存储数据的重复副本,那么在极不可能发生的情况下,如果一个副本确实悄无声息地损坏,那么最好有某种方法来判断哪个副本是正确的。此外,crc 对于检测恰好包含相同数据的重复副本的块很有用,因此可以对它们进行重复数据删除,这是 btrfs 的另一个设计功能。

答案3

是的,它首先不信任设备报告错误或存储正确的数据。这是否真的有必要完全是另一个问题。通常,这不是任何人担心的事情,而且一切都会正常进行。

如果你的磁盘不报告错误,那么无论如何你都会遇到一个大问题;不仅文件系统依赖于此类错误报告,其他组件(例如 RAID 控制器等)也依赖于此类错误报告;不可靠的存储会使您的整个数据(而不仅仅是少数数据)面临风险。

无论您的文件系统是否进行校验和,您都应该始终在存储上运行自己的测试;例如 SMART 自测试,或者在 RAID 的情况下,检查奇偶校验数据是否不匹配(/sys/block/mdX/md/mismatch_cnt运行检查sync_action 后=0)。

答案4

btrfs是下一代文件系统 - 它包含许多与过去在它们之间处理的分层模型相同的目的。btrfs也是一个极其广泛的堆栈 - 常见问题解答建议将其写入未分区的磁盘*[s]*,并且所有分区、配额、压缩、映像、条带化、写时复制、重复数据删除以及可能的 10 个其他功能我忘记了单独将其作为文件系统的质量来处理。它可以做所有这些事情以及更多。

btrfs磁盘阵列是动态的——可以毫无问题地在实时系统上添加和删除它们。这是有效的,因为btrfs仅在需要时才对存储块组进行分块 - 并且它们可能位于当前阵列中的任何特定设备上。常见问题解答对此有一些话要说 - 特别是在谈到自由空间估计的不可靠性时:

例如,如果您有一个子卷为“单个”,另一个为 RAID-1,则第一个子卷将以每写入一个字节数据占用一个字节的速率消耗原始存储空间。第二个子卷将以每写入一个字节数据占用两个字节的原始数据。因此,如果我们有 30GiB 的原始空间可用,我们可以在第一个子卷上存储 30GiB 的数据,或者在第二个子卷上存储 15GiB 的数据,并且在用户写入该数据之前无法知道具体是哪个。

因此,一般来说,不可能准确估计任何 btrfs 文件系统上的可用空间量。是的,这很糟糕。如果您有一个非常好的主意,可以让用户轻松了解他们还剩多少空间,请告诉我们,但也请注意,btrfs 开发中最优秀的人才一直在考虑这个问题至少几年来,我们还没有找到简单的解决方案。

阅读相关部分将为您提供更具体的示例,但它非常清楚地表明btrfs设备的数量可以是可变的,持久性是短暂的,可以单独或一起进行阻止和条带化......好吧,它还在继续。常见问题解答中的另一句话:

设备管理是一个复杂的主题,关于最佳方法有很多不同的观点。在内部,Btrfs 代码分离出处理设备管理的组件并为它们维护自己的层。绝大多数文件系统元数据不知道涉及多个设备。

关于 RAID 是这样说的:

btrfs 支持 RAID-0、RAID-1 和 RAID-10。从 Linux 3.9 开始,btrfs 还支持 RAID-5 和 RAID-6,尽管该代码仍处于实验阶段。

btrfs 首先将所有设备组合到一个存储池中,然后在创建文件数据时复制这些块。 RAID-1 目前被定义为“所有数据在不同设备上的 2 个副本”。这与 MD-RAID 和 dmraid 不同,它们为 n 个设备制作 n 个副本。在三个 1 TB 设备上的 btrfs RAID-1 中,我们获得 1.5 TB 的可用数据。由于每个块仅复制到 2 个设备,因此写入给定块只需要恰好写入 2 个设备;阅读只能从一本开始。

数据恢复:

btrfs-raid 5/6 的优势在于,与 MD-RAID 不同,btrfs 知道数据/元数据实际使用了哪些块,并且可以在重建/恢复情况下使用该信息来仅同步/重建重新添加或替换设备上实际使用的块,跳过那些一开始完全未使用/空的块。

MD-RAID 无法做到这一点,因为它试图成为一个与文件系统无关的层,不知道也不关心其上方层上的哪些块实际已使用或为空。如果它尝试跟踪这将是分层违规,并且会使代码严重复杂化和/或仅限于它支持/理解/可以正确跟踪的那些文件系统或其他层的使用。

当然,btrfs是从头开始设计的超越层。为此,它必须维护一个包含所有当前合并设备的校验和、可重建且至少有一定程度冗余的树。btrfs从很多方面来说,它既是文件数据库也是文件系统。它不依赖于 ecc 的底层设备,因为在很大程度上,它不考虑存在底层设备。也许你可能会把它想象成磁盘葛藤。

无论如何,正是持续的校验和和元数据管理使其能够btrfs完成许多有趣的事情,并且完全不需要考虑其底层硬件。

相关内容