我只有一个硬盘。我想使用一个可以减少存储空间的文件系统,但作为权衡,给我校验和或任何其他方法来帮助保持数据完整性。
据我了解,像 ext4 或 xfs 之类的东西不会这样做,因此您可能会遭受静默数据损坏,也就是 bitrot。
zfs 看起来是个不错的选择,但我读到的所有内容都表明您需要多个磁盘才能使用它。为什么是这样?我意识到只有一个磁盘不会容忍单个磁盘故障,但这就是多个备份方案的用途。备份无济于事的是 bitrot 之类的东西。
那么我可以在单个硬盘驱动器上使用 zfs 来防止比特腐烂吗?如果没有,你有什么推荐的?
您可以使用 ZFS 或 btrfs。
它们都是具有错误检测(以及纠正,如果有足够的冗余来修复原始数据 - 例如镜像驱动器或 RAID-Z)、透明压缩、快照等的写时复制文件系统。
ZFS 允许您
copies
在数据集上设置属性以保留一个文件的多个副本 - 例如,在 ZFS 上,您可以运行zfs set copies=2 pool/dataset
以告诉 ZFS 在该特定数据集上保留所有内容的两个副本 - 查看man zfsprops
并搜索copies=
。我认为 btrfs 也有类似的功能,但是我已经很久没有使用 btrfs 并且在文档中找不到它。这些额外的副本确实为纠错提供了冗余(在 bitrot 的情况下),但不会保护您免受磁盘故障的影响。为此,您至少需要一个镜像 vdev(即 RAID-1),或进行定期备份(但无论如何您都应该这样做——ZFS 或 btrfs 等 RAID 或类似 RAID 的技术不能替代备份)。
备份可以像使用
zfs snapshot
和zfs send
/zfs receive
将初始备份和增量备份发送到通过 USB 插入的单驱动器 zfs 池一样简单。或者通过网络到另一台机器上的池。即使使用zfs send
将备份存储在非 ZFS 文件系统上的文件中也总比没有好。如果您的机器具有支持第二个驱动器的物理空间和硬件,则应该添加一个。您可以在首次创建池时执行此操作,也可以随时使用
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 才能真正修复错误。您可以通过使用完整性设置和mdadm将完整性设备放置在 RAID 1 的每个分支下手动执行此操作,但这可能有点复杂,较新版本的 LVM 支持创建具有完整性的LVM RAID,只需使用
正如我所说,您可以将任何文件系统放在 RAID 逻辑卷的顶部,LVM 将负责检测错误并在读取时纠正它们。