据我所知,zfs使用校验和来防止bitrot造成的数据丢失。
但是如果一个bitrot影响校验和的数据会发生什么。 那么,zfs是否认为数据已经损坏,或者认为校验和已经损坏?
Thx 4任何答案,
tbol
我find了正确的解释:
ZFS存储池实际上只是一个块的树。 ZFS通过将每个块的校验和存储在其父块指针中来提供数据和校验和之间的故障隔离 – 而不是块本身。 树中的每个块都包含所有子项的校验和,因此整个池都是自我validation的。 [uberblock(树的根)是一个特例,因为它没有父节点; 更多的是关于我们如何处理另一篇文章。]
当数据和校验和不一致时,ZFS知道校验和是可信的,因为校验和本身是树中高一级的其他块的一部分,并且该块已经被validation。
只有一个单点故障:如果树中的根节点被破坏,但是应该有一个解决scheme
阅读@ https://blogs.oracle.com/bonwick/entry/zfs_end_to_end_data
ZFS通过将每个块的校验和存储在其父块指针中来提供数据和校验和之间的故障隔离 – 而不是块本身。 树中的每个块都包含所有子项的校验和,因此整个池都是自我validation的。
ZFS端到端数据完整性
编辑:因为你问父母:
观察1:由于使用校验和,ZFS检测到[磁盘]上的所有损坏。 在我们对所有元数据和数据的错误注入实验中,我们发现坏的数据从未返回给用户,因为ZFS能够检测到由于在块指针中使用校验和而导致的所有损坏。 在ZFS中使用父母校验和来validation所有访问的磁盘块的完整性。 唯一的例外是uberblocks,没有父块指针。 通过在uberblock内使用校验和来检测uberblock的损坏。
文件系统的端到端数据完整性:ZFS案例研究
你可以自己testing一下。 在ZFS设备的中间插入一个随机块,看它是否保持完整。
请注意,在这篇文章的下一节中,他们表明在内存中的损坏没有被发现。