外部硬盘格式化为 ZFS,另一个外部硬盘作为(离线)备份。如何保护我的数据免受静默损坏?

外部硬盘格式化为 ZFS,另一个外部硬盘作为(离线)备份。如何保护我的数据免受静默损坏?

我是一名业余摄影师,使用的是基本款 MacBook Air(128 GB SSD),并安装了 macOS/Ubuntu 16.04 双启动系统。由于 SSD 太小,无法存储我的照片库,所以我过去将其存储在 500 GB 2.5 英寸外置硬盘上,我以前将其用作备份驱动器。显然,我不再有照片备份了。因此,我购买了 2 TB 内置硬盘,并将其与 3.5 英寸底座一起使用。后者现在已成为我的“主要”外置硬盘,而 2.5 英寸再次成为备份驱动器。

我昨天将 2 TB 驱动器格式化为 ZFS,因为我想保护我的照片免受静默数据损坏(位腐烂)的影响。3.5 英寸硬盘之前已格式化为 HFS+,我使用 macOS 上的 Darktable 来管理/编辑/做其他事情 :) 我的照片。现在我将在 Ubuntu 16.04(包括其新的官方 ZFS 支持)上使用 Darktable 处理我的照片库。我读到 ZFS 会通过计算数据的校验和来自动检测并尝试修复损坏的数据。然后我突然意识到,自我修复位只有在镜像池中才有可能。但 ZFS 还可以通知我某张照片已损坏,然后我可以在备份被损坏的版本污染之前手动用 2.5 英寸备份驱动器中的副本替换它。

不幸的是,我读到 ZFS 在自动校验和计算/比较过程中检测到损坏的文件时似乎不会通知用户。所以我的想法是行不通的。当然,我可以用 2.5 英寸驱动器镜像池,但我不想一直插着它,因为:

  1. 我的 MacBook Air 只有 2 个端口,两个端口都会用到,这意味着我无法使用外接键盘(我的廉价 USB 集线器不久前坏了,我真的不想更换它 ;))

  2. 我不想不必要地磨损备份驱动器

那么,使用我已有的设备保护我的数据免受位衰减的最佳解决方案是什么?我的情况肯定不是独特的 ;)

答案1

我有一个类似的工作流程。您应该定期清理外部磁盘:

zpool scrub poolname

这将需要几个小时,具体取决于您的池大小。您可以检查状态:

zpool status poolname

如果池没有冗余,则清理过程将无法纠正任何位错误,但它将要告诉您哪些文件受到了影响,您可以手动将它们从良好的卷复制到受影响的卷。

或者以磁盘容量为代价copies,您可以通过使用该属性告诉 ZFS 创建多个副本,在 ZFS 文件系统级别为单磁盘池提供冗余:

zfs set copies=2 poolname/filesystem

设置此属性只会影响新数据写入,因此您应该在创建池和文件系统期间或之后立即设置它。

答案2

然后,我可以手动将其替换为 2.5 英寸备份驱动器中的副本,以免备份被损坏的版本污染。不幸的是,我读到 ZFS 在自动校验和计算/比较期间检测到损坏的文件时似乎不会通知用户。所以我的想法是不可能的。

实际上,ZFS 确实(在某种程度上)会通知用户在普通操作中遇到的任何错误。如果数据无法读取或无法与存储在其他地方的校验和进行验证,则抛出 I/O 错误。这如何传播到用户软件完全取决于该软件如何响应 I/O 错误;在最坏的情况下,它可能只是崩溃;在更好的情况下,它会以某种方式报告该文件不可读。

使用我已经拥有的设备来保护我的数据免遭比特腐烂的最佳解决方案是什么?

如果您希望至少使用单个驱动器部分地实际保护数据免受位衰减的影响,则应copies=2在池上进行设置。请注意,这实际上会将存储容量减半,并且应在将数据存储到池之前完成。(您也可以通过重写文件来使此类设置生效,例如将它们复制到单独的目录,然后在删除第二个副本之前将它们复制回来。)如果可能,最好在创建池时设置诸如checksum、等属性copiescompression

由于只有单个副本且没有冗余存储,ZFS 可以检测但无法修复大多数存储级别的错误。(元数据始终与附加副本一起存储,因此如果您有一个没有冗余且副本数为 1 的单 vdev 池,您将获得关键元数据的两个实际副本。)为此,请通过运行 来清理池sudo zpool scrub poolname。如果您需要取消正在运行的清理,请运行sudo zpool scrub poolname -s-s代表“停止”)。清理完成后,您可以通过运行获取受存储级别错误影响的所有文件的列表,zpool status poolname -v该命令有望打印no known data errors。然后,您可以决定是要丢弃这些文件还是从备份中恢复它们。请注意,可以使用 运行 ZFS checksum=off,这将禁用校验和。(然而,zfs(8) 手册页确实警告说禁用校验和是不是建议做法,重点原文。)

您应该定期运行清理。清理需要多长时间在很大程度上取决于您拥有的数据量和写入模式(在这方面,一次写入大文件并且永远不会再次写入比定期就地更新的小文件要好得多),因为 ZFS 的写时复制架构最终会导致碎片化。我建议每隔几周至少运行一次 Scrub。对于几百 GB 的数据(根据您所说的您过去将照片存储在 500 GB 驱动器上),清理时间不应超过几个小时。

我不想不必要地磨损备份驱动器

一般来说,导致磁性旋转硬盘损坏的原因是旋转和物理力。磁性旋转硬盘不会像 SSD 那样受到闪存磨损的影响(通常对于现代固态硬盘来说这不是问题无论如何)。HDD 和 SSD 的设计和制造是为了使用只要它们健康,就可以承受相当大的打击。(当硬盘驱动器处于临界状态时,您就应该开始担心,并尽快将数据从硬盘驱动器上复制下来。)

相关内容