如何在linux上对单个硬盘进行错误检测和纠正(使用btrfs或其他方法)

如何在linux上对单个硬盘进行错误检测和纠正(使用btrfs或其他方法)

Linux 上的 btrfs 的一大优点是,如果它有冗余数据,它可以纠正位衰减,因为它具有按块校验和。我可以通过设置带有两个磁盘的 raid1 来获取冗余数据。但是,我是否还可以获得冗余数据以防止单个磁盘上的位衰减?

我看到 btrfs 有一个元数据 DUP 选项 ( -m dup),它在每个驱动器上存储元数据的两个副本。然而,文档说 dup 不是 data 的一个选项(即-d dup不是一个选项)。有没有好的办法解决这个问题?将单个磁盘分成两个相等的部分并将它们一起进行raid1?

或者,是否有另一种简单的方法可以在 Linux 上进行文件系统级错误检测和纠正(类似于文件系统的自动归档)?

(我对建议我使用两个驱动器的答案不感兴趣。)

编辑:我确实找到了,这是一个 FUSE 文件系统,可以像普通文件一样挂载纠错文件。也就是说,这是某人在 2009 年整理的一个小黑客/概念验证,此后就没有真正触及过。

答案1

如果启用混合块组,Btrfs 支持重复数据块:

mkfs.btrfs --mixed --metadata dup --data dup /dev/<device>

编辑:请注意,有一个修补这样我们就可以在不使用混合模式的情况下做到这一点。继 2015 年 11 月的线程之后,它似乎被添加到主线 btrfs 代码中。

答案2

例如,使用 LVM 将驱动器分区为 10 个分区并在块级别对它们进行 raid-5 化怎么样?这不会为纠错提供大约 10% 的冗余吗?

答案3

与 Btrfs 类似,ZFS 允许您使用以下命令dup --data存储多个数据块副本zfs set copies

zfs set copies=2 users/home

存储 ZFS 用户数据的多个副本

当访问一个块时,无论它是数据还是元数据,都会计算其校验和并将其与存储的“应该”的校验和值进行比较。如果校验和匹配,则数据将通过编程堆栈传递到请求它的进程;如果值不匹配,则如果存储池提供数据冗余,ZFS 可以修复数据(例如内部镜像),假设数据副本未损坏且校验和匹配。可以选择通过指定copies=2(或更多)来提供额外的池内冗余copies=3,这意味着数据将在磁盘上存储两次(或三次),从而有效地将copies=3存储减半(或者,减少到三分之一)磁盘的容量。此外,为了安全起见,ZFS 用于管理池的某些类型的数据默认会存储多次,即使使用默认copies=1设置也是如此。

https://en.wikipedia.org/wiki/ZFS#Data_integrity

相关内容