我正在尝试寻找一种长期存储 RAW 照片的方法。我希望尽可能保持简单,同时尽量减少数据丢失(显然需要取得平衡)。
我目前将照片存档在两个硬盘上,这两个硬盘大约每周只运行一次。两个硬盘都备份并保存在不同的位置。对于日常用途,我使用 SDD。
我最担心的是硬盘的持续退化(“数字衰减”),而不是机械故障。
我的问题
我知道减轻数字衰减的一种方法是每隔一段时间(比如说每年一次)重写硬盘上的文件。这是一种可以长期保护我的照片安全的可行策略吗?您能提供答案的来源吗?
答案1
如果您特别担心数字衰减,那么运行 ZFS 的 NAS 可以定期检查并修复衰减。
还有其他方法,但它们可能更麻烦。(Linux 下的 par 之类的东西可以创建可以从位衰减中恢复的奇偶校验和冗余,但这听起来不是你想要的。
如果您拥有数据的多个副本并且它很少更改,您可以编写软件来存储文件的校验和并定期检查这些校验和,建议是否有任何更改并需要注意。
我承认我感到很困惑,你担心的是数字衰减而不是机械故障。机械故障的风险要大得多。
答案2
在我看来,数字衰减通常是一个人们不太了解的话题,只要情况如此,就很难整理出专门针对该问题的答案。
这不是一个科学的答案,而是基于我自己的研究,如果需要,我可以使用 ATA 规格和英特尔会议录像等来源来支持其中的一些内容,但由于时间不够,我没有这样做。
现在,物理层面的“衰变”,或者说最初允许我们存储数据的材料属性或状态的丧失,最终会导致“位翻转”。这基本上就是我们正在讨论的,我们的照片(或一般文件)“损坏”的根本原因。
位翻转
硬盘上的损坏照片足以让许多人诊断出“位腐烂”或“磁衰减”。确实,一次“位翻转”就足以损坏照片,具体取决于格式存储数据的方式。在下面的例子中,我将 &hFE 更改为 &hFF 并改回(11111110 到 11111111)以证明这一点。
检测位翻转
然而,我们需要考虑这种情况是否在理论上是可能的,而理论上的答案是否定的。为了解释这一点,我们需要了解硬盘如何存储数据以及有哪些机制可以保护这些数据。
我将略过硬盘上数据存储的实际物理原理,首先因为我不是这方面的专家,其次只要理解硬盘不存储 0 和 1,而是将物理属性或测量值解释为 0 或 1 就足够了。而在物理层面,物理因素可以改变这些。
为了防止这种情况发生,硬盘采用了错误修正技术,使我们能够检测错误并在一定程度上纠正错误。我们通常称之为 ECC。简而言之,如果我们将一个数据块写入驱动器,我们不仅会写入数据,还会将使用该数据计算的 ECC 块写入驱动器。如果我们读回,我们会再次计算读取数据的 ECC,并将其与写入数据时存储的 ECC 进行比较。
如果我们现在假设数据损坏到了无法通过 ECC 纠正的程度,那么无论这是由于“衰减”还是其他问题造成的任何我知道的协议将报告读取错误。换句话说,上一段中所示的照片理论上不可能因“衰减”而出现。因为如果我们假设衰减,我们应该得到读取错误,而不是损坏的文件。
然而,这些事情,如上所示的照片,确实会发生,人们通常认为这是由于腐烂或腐烂造成的,但我认为,它们不是结果。
请理解,我并不是说没有“腐烂”这种东西。我只是说,我们经常标记为腐烂的东西其实不是。为了防止某些事情发生,它可能有助于我们了解我们实际上正在处理什么。
那么我们该如何解释这些“有点烂”的照片呢?
如果上面显示的损坏不能用衰减来解释,那么必须在不同的点引入它。如果数据和 ECC 在数据上“一致”,那么
- 它们是按原样写入的,也就是说,损坏是在数据写入之前引入的
- 它们从驱动器读取后的某个时间点就被损坏了。
这种情况可能比我们想象的更常见,我想举几个例子来说明:
第一个非硬盘示例:我被要求修复从 CF 闪存卡复制的损坏的 CR2 照片。我假设“衰减”在 NAND 芯片中非常常见:简化为 NAND 单元注入电子,产生一定电荷,我们称之为 y。如果 y > x,其中 x 是一个阈值,它决定我们将单元解释为零还是一,我们读到 1,如果 y < x 我们读到零。
随着时间的推移,y 会下降,这是无法避免的,因此如果我们等待足够长的时间,它会降至 x 以下,并且会出现位翻转。但是,由于 CF 闪存卡实际上是 ATA 驱动器,每个扇区的位翻转将被 ECC 检测和/或纠正,因此我们要么获得正确的数据,要么根本没有数据,并且出现读取错误。换句话说,由于读取 RAW 照片时没有读取错误,因此我们不能假设位错误是由于衰减造成的。同样,错误的根源在于其他地方。
另一个表明我们没有处理衰减的提示是,位翻转是按照某种模式发生的。在每张照片中,翻转的都是相同的位,例如每次文件头中的“Canon”都会变成“Cankn”:
Canon - Cankn
01101111 - o changed into
01101011 - k
^ - flipped bit
事实证明,物理接口引入了“噪音”,导致损坏的数据被写入,并且 ECC 被计算机覆盖在已经损坏的数据上。
第二个例子人们认为‘衰变’导致了数码照片的损坏:
案件得以解决,完整的照片得以恢复,因为文件系统已损坏,导致选择了错误的簇来分配给文件。因此,再次没有“衰减”。
第三个例子,英特尔认为造成 SSD 无声损坏的较大因素之一是宇宙射线,但可能与您想象的不同。
当我第一次听说这些“宇宙射线”时,我以为离子和质子将电子从 NAND 单元中撞出,导致位翻转,但事实并非如此!
再次,如果是这种情况,ECC 应该可以检测到此类错误。无论是实际数据还是 ECC 代码本身受到影响,都会导致 ECC 和数据之间出现差异,从而产生读取错误。
您可能知道,现代 SSD 会进行各种后台处理,将数据从一个地方移动到另一个地方,在这些过程中,数据会短暂地放置在易失性 RAM 内存中。在这里,数据会被宇宙射线“改变”,从而导致损坏的数据被匹配的 ECC 重写。
重要的是,损坏不是在数据“存储”时引入的,而是在数据被传输并临时存储在 RAM 中时引入的,因此完全相同的事情可能发生在机械硬盘中。
长话短说
我们通常所认为的“衰减”的结果往往并非如此,而是导致文件损坏的不同因素。
驱动器本身应该能够检测出因衰减而导致的损坏(如果可能,则进行纠正)。这对于磁性硬盘和 SSD 都一样。
你可以尝试通过添加额外的一层来检测“静默损坏”、位衰减或任何你想叫它的名字校验和. 正如另一个答案中所建议的,一些文件系统将校验和作为核心功能实现。
由于校验和是计算的后数据写入后,我们假设数据首先是正确和完整的。
清爽或擦洗经常被建议。刷新数据,即读取数据并写回的简单事实确实有助于防止“位腐烂”。同时,我们看到英特尔发现在自动刷新数据期间可能会发生静默损坏,因为它在许多 SSD 上实现。这同样适用于读取和写回机械硬盘数据的用户应用程序。
我必须补充一点,通过重写来刷新数据的可能性非常小,而且这样做的好处(刷新数据)远比坏处多。这个例子主要是为了说明此类事件可能会导致无声损坏,但并不是说这种可能性很大。
最终唯一的答案就是备份。数据丢失可能有很多原因,尽管可能会发生衰减、无声损坏或位衰减,但只关注它可能是不太明智的。不过,意识到这一点是件好事,事实上检测它是主要的挑战。校验和是一个部分答案,因为它可以帮助检测文件自写入以来的变化。
关于寿命:
我的理解是,我们是在处理统计数据。没有法律规定你的数据在 3 到 5 年后将变得毫无用处,这只是一个简单的统计数据,表明你的硬盘在 z 条件下,每天平均使用 y 次或其他情况下可以使用 x 年。但由于这是统计数据,你的硬盘明天可能会出现故障。
硬盘可能可以存放 10 年而不会出现腐蚀问题。也许更大的问题是机械和移动部件在这么长的时间内处于非活动状态。
答案3
我的问题
我知道减轻数字衰减的一种方法是每隔一段时间(比如说每年一次)重写硬盘上的文件。这是一种可以长期保护我的照片安全的可行策略吗?您能提供答案的来源吗?
将您的硬盘想象成一张地毯,在其使用寿命结束时它会出现洞,并且这些洞无法修复。
正如@Joep van Steen 提到的那样,硬盘具有 ECC,它可以纠正错误,直到出现很多坏位为止。我不知道阈值是多少,但一旦超过阈值,该扇区就是坏的,其内容将被视为丢失。
硬盘确实提供了 SMART(自我监控和报告工具)。此工具将提供各种统计数据。这些值包括坏扇区和 ECC 值。
现在这些统计数据有一个缺陷,它们只报告它们接触到的扇区。因此,除非您定期执行 chkdsk /r(或类似操作),否则您将无法全面了解整个驱动器的状态。但是,像 smartctl 这样显示 SMART 数据的工具会为您提供有关驱动器健康状况的一些指示。
您可以重新复制数据并刷新数据,但如果其所在的扇区较弱,它可能会失去存储数据的能力并最终被标记为损坏。
因此,您需要扫描整个驱动器,并监控 ECC 校正扇区。当驱动器是新的时,该值应为 0,并且应保持一年或更长时间。最大的担忧是增长率,少量 ECC 校正并不是什么大问题。但是,驱动器最终将有 1000 个甚至更多。此时唯一安全的选择是更换驱动器。
回到回答你的问题。普遍接受的安全策略是 3-2-1 备份。一次在 2 个位置进行 3 次复制。例如:主驱动器、外部驱动器和云备份。
超过这个数字,成本就会急剧上升。RAID 6 在保护和成本之间提供了最佳折衷。RAID 60(6 加驱动器镜像)需要 2 倍的硬盘数量,因此成本更高。RAID 6 至少需要 4 个驱动器,您可以一次丢失最多 2 个驱动器,而不会丢失任何数据。
您将需要一个 RAID 控制器,虽然它们的价格在 200-300 美元之间,但好的控制器价格在 1200 美元左右。再加上驱动器的成本,并且根据您拥有的驱动器数量,您可能需要更大的机箱和电源。
在 RAID 之上,您可以实现 ZFS 或 btrfs 以获得额外的保护层,但您需要运行 linux,因为 windows 不直接支持这些文件系统。
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
5 Reallocated_Sector_Ct 0x0033 100 100 010 Pre-fail Always - 0
9 Power_On_Hours 0x0032 091 091 000 Old_age Always - 40490
12 Power_Cycle_Count 0x0032 099 099 000 Old_age Always - 555
177 Wear_Leveling_Count 0x0013 099 099 000 Pre-fail Always - 9
179 Used_Rsvd_Blk_Cnt_Tot 0x0013 100 100 010 Pre-fail Always - 0
181 Program_Fail_Cnt_Total 0x0032 100 100 010 Old_age Always - 0
182 Erase_Fail_Count_Total 0x0032 100 100 010 Old_age Always - 0
183 Runtime_Bad_Block 0x0013 100 100 010 Pre-fail Always - 0
187 Uncorrectable_Error_Cnt 0x0032 100 100 000 Old_age Always - 0
190 Airflow_Temperature_Cel 0x0032 059 045 000 Old_age Always - 41
195 ECC_Error_Rate 0x001a 200 200 000 Old_age Always - 0
199 CRC_Error_Count 0x003e 100 100 000 Old_age Always - 0
235 POR_Recovery_Count 0x0012 099 099 000 Old_age Always - 381
241 Total_LBAs_Written 0x0032 099 099 000 Old_age Always - 18507464781
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x000b 100 100 016 Pre-fail Always - 0
2 Throughput_Performance 0x0005 137 137 054 Pre-fail Offline - 79
3 Spin_Up_Time 0x0007 193 193 024 Pre-fail Always - 329 (Average 317)
4 Start_Stop_Count 0x0012 098 098 000 Old_age Always - 8107
5 Reallocated_Sector_Ct 0x0033 100 100 005 Pre-fail Always - 0
7 Seek_Error_Rate 0x000b 100 100 067 Pre-fail Always - 0
8 Seek_Time_Performance 0x0005 140 140 020 Pre-fail Offline - 26
9 Power_On_Hours 0x0012 095 095 000 Old_age Always - 38719
10 Spin_Retry_Count 0x0013 100 100 060 Pre-fail Always - 0
12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 511
192 Power-Off_Retract_Count 0x0032 094 094 000 Old_age Always - 8309
193 Load_Cycle_Count 0x0012 094 094 000 Old_age Always - 8309
194 Temperature_Celsius 0x0002 153 153 000 Old_age Always - 39 (Min/Max 10/56)
196 Reallocated_Event_Count 0x0032 100 100 000 Old_age Always - 0
197 Current_Pending_Sector 0x0022 100 100 000 Old_age Always - 0
198 Offline_Uncorrectable 0x0008 100 100 000 Old_age Offline - 0
199 UDMA_CRC_Error_Count 0x000a 200 200 000 Old_age Always - 0
答案4
我喜欢答案中提供的细节乔普·范斯汀。
我想在数据丢失风险列表中添加一些其他项目,特别是消费者用户必须处理的风险:
隐性计划报废
我在硬盘、廉价笔记本电脑和手机上都见过这种现象;它们都是由知名且备受认可的消费产品制造商生产的,但我还没有意识到它们的产品在商业产品线中存在这种现象。通常,“故障”是由代码触发的,而不是由物理磨损触发的。因此,对硬件的信任可能仅限于保修期。每多一天,你都要感觉自己多活了一天。
请注意,这不是“都市传说”。我仍然拥有其中大部分物品。不要将活动 SSD 视为有效备份媒体。
我注意到长时间未触及的文件(即图片)中存在数据漏洞(多个连续字节消失)。同一 SSD 上同一组文件的第二份副本也有类似的漏洞,但位置不同,因此将两者合并会产生一组有效文件。这当然是一个显而易见且微不足道的事实:勒索软件的风险和用户处理失败也是一个需要考虑的问题。
这样做的实际后果是:
尽管对硬件的可靠性及其针对 ECC 和类似策略或文件系统规范等故障的对策进行了深入的技术研究,但您始终必须应对风险,即您的媒体可能会在您意想不到的事件中丢失数据或出现故障。
为了将答案严格限制在您的问题和您当前的备份状态内:
我认为您至少应该从以下几点来增强您的备份策略:
- 维护校验和列表(即SHA256SUM)。
- 不同生产线和不同年龄的 HDD(面对因老化而增加的故障风险以及可能的系统生产问题。评估 SMART 信息将帮助您知道何时更换 HDD)。
- 您应该有可以自动处理必要例程的脚本或工具(可靠性、可重复的结果)。
为了验证备份数据的完整性,您需要定期检查校验和
为了防止数据损坏,您
- 逐个复制数据,
- 验证新副本的校验和,并
- 校验成功后,您将删除旧文件。
- 您验证 SMART 数据是否存在问题值。
第二块 HDD 拥有自己的防腐蚀循环,风格相同,但时间与第一块 HDD 相移。
通过这种“逐个文件”策略,您始终可以获得文件的两个备份版本,并且无需维护巨大的交换空间。
但您也可以 (1) 复制到第三个备份 HDD,然后 (2) 在下一步中进行整个校验和验证。 (3) 跟踪两个 HDD 的 SMART 数据。 (4) 然后(成功后)第一个 HDD 将成为新的“第三个 HDD”(下一个防腐副本的目标)。
任何有关消费品衰减风险和寿命的可靠信息都无法期待。您应该将保证的使用寿命视为最大值。
我个人对硬盘的看法是,一年的周期相当短(低风险),如果忽略“计划报废”的风险,两年的周期可能也合适。但我认为几乎没有理由不将风险保持在低水平并进行年度衰减周期。由于任务确实应该自动化,因此使用时间不会成为问题。
以年度为周期,完整性验证和防腐工作合并为一项任务。
另外有用的扩展是
- 第三个数据备份的单独地理位置。(导致一种“3-2-1 备份。一次在 2 个位置创建 3 份副本。”赛伯纳德已经建议)来防止诸如火灾、水灾、龙卷风等彻底摧毁您的家/办公室等基本问题……
- 一个单独的备份处理系统,将备份例程和数据与日常业务和风险隔离开来(“Raspberry PI”或类似的系统就足够了)。