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 可以修复数据(例如内部镜像),假设数据副本未损坏且校验和匹配。可以选择通过指定
copies=2
(或更多)来提供额外的池内冗余copies=3
,这意味着数据将在磁盘上存储两次(或三次),从而有效地将copies=3
存储减半(或者,减少到三分之一)磁盘的容量。此外,为了安全起见,ZFS 用于管理池的某些类型的数据默认会存储多次,即使使用默认copies=1
设置也是如此。