如何确保移动硬盘的大量数据不会损坏?

2022-07-26 05:42:32 +08:00
 kerrspace

小弟有一个问题,假设我不信任网盘(倒闭或者加密压缩文件都被乱杀和谐,百度云盘经常干这事)和类似群晖(故障毁盘,扩展能力有限)这样的软件,我就使用最原始的手工的办法,每一个移动硬盘都准备一个备份盘,譬如说 ABCDE 五个硬盘,我就有完全对称的 abcde 五个备份盘。

现在问题来了,这样备份肯定隔一段时间就要确定数据有没有损坏,譬如对比 A 和 a ,如果 A 有坏道导致数据损坏,就 copy a 的内容到 A 。如果长时间不 check 肯定最后 a 和 A 都要损坏,备份就失去意义了。所以要经常比对

大家有什么好的对比检测文件是否有损坏的方案吗?

譬如说我全部打包成压缩包,只要压缩包能正常解压能不能说明文件一定没有损坏? step 1. 统计 A 中能正常解压的压缩包 step 2. 统计 a 中能正常解压的压缩包 step 3. 把属于 A 但不属于 a 的压缩包从 A 复制到 a step 4. 把属于 a 但不属于 A 的压缩包从 a 复制到 A

5430 次点击
所在节点    程序员
59 条回复
singerll
2022-07-26 06:03:07 +08:00
如果我没有看错,你是在自己重新造一遍 raid1 。。。
datocp
2022-07-26 06:04:56 +08:00
我想破脑袋用一些 crc 校验软件,将同一份文件复制占满同一分区,通过校验这些文件的 crc 值来确认是否坏了。
方法是有了,还没在工作中使用过。
wizardyhnr
2022-07-26 06:05:04 +08:00
纯校验 md5
par2 可以产生冗余校验文件,可以起到校验和修复的作用(错误率低于冗余度都可以修复)。
winrar 也有冗余度的选项,不愿意研究 par2 的用 winrar 也可以。
文件系统如 btrfs scrub 可有校验数据的功能。
另外存档打包不推荐用固实压缩。
kerrspace
2022-07-26 06:14:05 +08:00
@singerll 你去买个群晖那种磁盘阵列机器 他能插的接口是有限的啊 4 ,5 块顶天了吧 而我这边手动做可以无限多块硬盘。。而且知乎上群晖出错故障直接毁盘的案例也有不少了。
runningowl
2022-07-26 06:16:16 +08:00
所以才有 3-2-1 rule 啊,3 个备份,2 种存储,1 份离线

再次一些,备份盘就老实放着,日用盘 5 年一换总是保险的,7*24 的就 3 年一换

比如,
3 年了,
买新备份盘
原备份盘变日用盘
原日用盘被迫之
singerll
2022-07-26 06:20:01 +08:00
@kerrspace 个人版的存储已经有八盘位的了,商用存储的话,你想要多少,就给你加多少。
kerrspace
2022-07-26 06:21:46 +08:00
@runningowl 你这种有个 bug 就是硬盘损坏模式未必就跟使用时间长度有关系 你的备份盘可能买来就是有坏道的 这部分 damage 的数据又会在备用盘变日用盘的时候遗传给下一代备用盘 演化的终点就是数据面目全非
wxf666
2022-07-26 06:26:05 +08:00
@kerrspace 假如一个压缩包内容是 ABC ,A 盘内容变成 BBC ,a 盘内容变成 ABB ,咋办?
msg7086
2022-07-26 06:27:58 +08:00
@kerrspace #7 这边建议你了解一下什么是坏道。
坏道不是数据内容变了。
ryd994
2022-07-26 06:31:25 +08:00
恭喜你重新发明了 ZFS

#4 “他能插的接口是有限的啊 4 ,5 块顶天了吧”

你大概没见过 SAS HBA 卡配合 expander 连接上百块硬盘……
wxf666
2022-07-26 06:42:34 +08:00
@kerrspace 根据 @wizardyhnr #3 所说,利用 par2 (类似 winrar 冗余校错)写个小脚本,来实现:

(对于 A 盘任意文件 D:/path/src_file ,应对应于 a 盘中的 E:/path/src_file.par2 冗余校检文件)

1. src_file.par2 不存在,则自动生成( 50% 冗余度?允许 < 50% 错误?)

2. src_file.par2 上次访问 /修改时间已超过 30 天,则校检一次(并自动修复错误),并更新访问 /修改时间

3. src_file 不存在,则删除 src_file.par2

效果会好吗?
wizardyhnr
2022-07-26 07:00:45 +08:00
@wxf666 par2 是适合冷数据备份的,usenet 上大量使用,光盘刻录有 dvdisaster 也是同样的原理。冷数据备份极致就是 3-2-1 rule 加 par2 。
SuperMild
2022-07-26 07:59:54 +08:00
我的做法是,把文件的 hash (比如 MD5 之类的)记录在 sqlite 数据库中,然后定期检查(分批检查,比如每天只检查 5GB ,循环检查),发现错误就从备份中获取正确的文件进行自动修复。
SuperMild
2022-07-26 08:03:02 +08:00
另外我总结了 “网盘备份的缺点” 和 “本地备份的优点” https://v2ex.com/t/774938
wxf666
2022-07-26 08:03:13 +08:00
@wizardyhnr 能用 100% 冗余度 代替原文件吗?否则出现所有备份各损坏一部分,咋办
neteroster
2022-07-26 08:15:10 +08:00
zfs or btrfs
beijiaoff
2022-07-26 08:22:45 +08:00
你这需求太夸张了。硬盘不坏,数据出错的概率非常小的。
knives
2022-07-26 08:25:07 +08:00
基本可以参考冗余校验的机制(也叫纠删码什么的),比如 ZFS 的 raidz 或者 snapraid ,这俩都提供了 scrub 命令用来验证磁盘上数据是否损坏。

当然这个也不是万能的,如果损坏的数据操过了冗余数据的比例,该丢的还得丢。
yaoyao1128
2022-07-26 08:34:11 +08:00

请问您说的是不是 winrar 恢复卷 和 校验压缩文件?
datocp
2022-07-26 08:38:06 +08:00
去年尝试用将同一个文件复制填充整个硬盘分区来校验它们的 sfv 值来确定文件的损坏是否就是硬盘损坏。当然没真正应用过。。。
当时找的还有一些辐助软件
digup
fsum
wxchecksums
wxmsw242
disk-filltest
dummy12


multicopy1.cmd
@echo off
echo.
if NOT "%2"=="" goto next1

echo %0 will make the specified number of copies of a file to (by default) the current folder
echo The copies will have '(Copy n) ' added at the beginning of the filename, where 'n' is the count
echo .
echo Useage: %0 copies source_file [destination folder]
echo example: %0 10 test.txt C:\temp
goto end

:next1
if EXIST ".\%2" goto next2
echo file %2 not found
goto end

:next2
set count=%1
set destination=%3
if "%3"=="" set destination=.

:repeat
@echo on
::copy %2 "%destination%\(Copy %count%) %2"
copy %2 "%destination%\%2_%count%"
@echo off
::pause

set /a count=%count%-1
if %count% LEQ 0 echo Requested number of copies (%1) have been made.
if %count% LEQ 0 goto end

goto repeat

:end

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/868676

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX