据我所知,zfs 使用校验和来防止由 bitrot 引起的数据丢失。
但是,如果位腐烂影响了校验和的数据,会发生什么情况?那么,zfs 认为数据已损坏还是认为校验和已损坏?
谢谢任何回答,
財產屬性
答案1
ZFS 通过将每个块的校验和存储在其父块指针中(而不是块本身中)来提供数据和校验和之间的故障隔离。树中的每个块都包含其所有子块的校验和,因此整个池都是自我验证的。
编辑:因为你询问的是父母:
观察 1:ZFS 通过使用校验和检测所有 [磁盘上的] 损坏。在对所有元数据和数据进行的故障注入实验中,我们发现坏数据从未返回给用户,因为 ZFS 能够检测到由于在块指针中使用校验和而导致的所有损坏。在 ZFS 中,父校验和用于验证访问的所有磁盘块的完整性。唯一的例外是超级块,它没有父块指针。超级块的损坏是通过使用超级块本身内部的校验和来检测的。
您可以自己测试一下。在 ZFS 设备中间插入一个随机块,看看它是否保持完整性。
请注意,在该论文的下一部分中,他们表明内存损坏未被发现。
答案2
我找到了正确的解释:
ZFS 存储池实际上只是一棵块树。ZFS 通过将每个块的校验和存储在其父块指针中(而不是块本身中)来提供数据和校验和之间的故障隔离。树中的每个块都包含其所有子块的校验和,因此整个池都是自我验证的。[超级块(树的根)是一种特殊情况,因为它没有父块;我们将在另一篇文章中详细介绍如何处理这种情况。]
当数据和校验和不一致时,ZFS 知道校验和是可信的,因为校验和本身是树中高一级的其他块的一部分,并且该块已经过验证。
只有一个故障点:如果树中的根节点损坏,但应该有一个解决方案
读 @https://blogs.oracle.com/bonwick/entry/zfs_end_to_end_data