gfd*_*ejo 2 filesystems zfs ext4 xfs
我有一个硬盘。我想使用一个可以减少存储空间的文件系统,但作为权衡,请为我提供校验和或任何其他方法来帮助保持数据完整性。
据我了解,像 ext4 或 xfs 这样的东西不会这样做,因此您可能会遭受静默数据损坏,又名 bitrot。
zfs 看起来是一个很好的选择,但我读到的所有内容都表明您需要多个磁盘才能使用它。为什么是这样?我意识到只有一个磁盘无法容忍单个磁盘故障,但这就是多个备份方案的用途。备份无济于事的是像 bitrot 这样的东西。
那么我可以在单个硬盘上使用 zfs 来实现防止 bitrot 的单一目的吗?如果没有,你有什么推荐?
您可以使用 ZFS 或 btrfs。
它们都是写时复制文件系统,具有错误检测(如果有足够的冗余来修复原始数据,例如镜像驱动器或 RAID-Z)、透明压缩、快照等,也可以进行纠正。
ZFS 允许您在数据集上设置copies
属性以保留文件的多个副本 - 例如,在 ZFS 上,您可以运行zfs set copies=2 pool/dataset
告诉 ZFS 保留该特定数据集上所有内容的两个副本 - 请参阅man zfsprops
并搜索copies=
。我认为btrfs也有类似的功能,但是我已经很久没有使用btrfs了,在文档中找不到它。
这些额外的副本确实为纠错提供了冗余(在位腐烂的情况下),但不能保护您免受磁盘故障的影响。为此,您至少需要一个镜像 vdev(即 RAID-1),或者定期进行备份(但无论如何您都应该这样做 - RAID 或类似 RAID 的技术(如 ZFS 或 btrfs)不能替代备份)。
备份可以像使用zfs snapshot
和zfs send
/zfs receive
将初始备份和增量备份发送到通过 USB 插入的单驱动器 zfs 池一样简单。或者通过网络连接到另一台计算机上的池。即使使用zfs send
将备份存储在非 ZFS 文件系统上的文件中也比没有好。
如果您的计算机具有支持第二个驱动器的物理空间和硬件,则应添加一个。您可以在首次创建池时执行此操作,也可以使用 随时将镜像驱动器添加到任何单驱动器或镜像 vdev zpool attach pool device new-device
。
注意:使用 很重要zpool attach
,而不是zpool add
为此。 attach
将镜像添加到 vdev 中的现有驱动器,同时add
将另一个 vdev 添加到现有池。将单驱动器 vdev 添加到现有池将有效地与池中的其他 vdev 形成 RAID-0,从而使所有数据面临风险。这是一个相当常见的错误,并且(如果池包含任何 RAID-Z vdev),唯一的修复方法是备份整个池,销毁它,从头开始重新创建它,然后恢复。如果池只有镜像或单驱动器 vdev(即没有 RAID-Z vdev),则可以用于zpool remove
删除意外添加的单个驱动器。
我想在 @cas 回答中添加一点,即校验和也可以使用dm-integrity在块级别上完成,然后您可以在此之上使用任何文件系统。与 btrfs 中的校验和类似,dm-integrity 仅提供错误检测,因此您需要 RAID 才能真正修复错误。您可以通过使用integritysetup和mdadm将完整性设备放置在RAID 1的每个分支下来手动执行此操作,但这可能有点复杂,较新版本的LVM支持创建具有完整性的LVM RAID,只需使用
lvcreate --type raidN --raidintegrity y
Run Code Online (Sandbox Code Playgroud)
正如我所说,您可以将任何文件系统放置在 RAID 逻辑卷之上,LVM 将负责检测错误并在读取时更正它们。