我使用 Amazon S3 Glacier Deep Archive 将备份存储在我的 Ubuntu 机器上。我的工作流程基本上可以归结为:
tar cf - $FILES | gzip -3 --stdout | aws s3 cp - $TARGET
我觉得这个方法很好用,但是对于非常大的存档(1TB 以上),我担心如果我的 PC 出现问题,或者出现一点小问题,整个存档就会变得无法使用。理想情况下,我想为这个流程添加一些纠错功能。
我查看了 PAR2,它似乎可以满足我的要求,但有一个缺点:它不能以管道作为输入。它要求我在磁盘上构建整个档案,然后通过 PAR2 运行,然后上传所有内容。对于超过 1TB 的档案,从可用磁盘空间的角度来看,这并不总是可行的,更不用说这会大大减慢进程。
我找不到任何类似的工具来将前向纠错信息添加到数据流中,而无需先将其保存到文件中。我该怎么做?解决方案是否将信息添加到单独的文件或修改流以添加冗余并不重要。
答案1
工具:redupe
我找到了一个可以实现这个目的的工具:redupe
。阅读相关内容:Redupe:前向纠错。
这篇文章介绍了
redupe
[…] 为数据流提供前向纠错的工具。 […]redupe
,是仿照gzip
或等压缩工具建模的bzip2
,但它增加了冗余而不是消除冗余。redupe
直接对数据进行操作,通过在原始数据中添加冗余信息,将其转换为冗余状态。
补充命令是reundupe
,它实际上只是一个工具,而您调用它的名称决定了它的功能。
你可以得到redupe
来自 GitHub。
我设法redupe
在我的 Debian 12 中进行编译和测试。详情见下文。
汇编
注意:这里描述的一些问题可能是因为我缺乏编程和编译经验,或者可能是因为我事先没有正确配置所有内容(或者根本没有配置)。
我的操作系统是 Debian 12。这是我所做的:
我下载了
redupe-master.zip
来自 GitHub,解压并将自己放入新创建的 中redupe-master/
。通过反复试验,我发现我需要以下包:
automake
,,,,* 。make
gcc
libpopt-dev
libtool
sudo apt-get update sudo apt-get install automake make gcc libpopt-dev libtool
* 至少这些包是我尝试过的,而且它们看起来都很重要。
-
autoreconf -ivf
-
./configure && make && sudo make install
我能够启动
redupe
,但工具无法找到libredupe.so.0
。我发现相关的库在/usr/local/lib/
。strace redupe
我发现该工具检查了几个位置(例如/usr/lib/
),但没有/usr/local/lib/
。我将与相关的所有内容redupe
从移动/usr/local/lib/
到`/usr/lib/:sudo mv /usr/local/lib/libredupe.* /usr/lib/
我还发现新安装的
/usr/local/bin/redupe
和/usr/local/bin/reundupe
是相同的常规文件。一个常规文件就足够了,另一个名称可以是符号链接:(cd /usr/local/bin/ && sudo rm reundupe && sudo ln -s redupe reundupe)
我的测试
- 我将 1 GiB 传输
/dev/urandom
到一个常规文件中original
。 - 我
original
通过管道传输redupe
并将结果保存为original.rd
。 - 我
original.rd
通过管道tr ab xy
改变了一些字节,并将结果保存为modified.rd
。 - 我确保
original.rd
和modified.rd
不同(可以使用cmp
或md5sum
或类似的东西)。1 GiB 随机数据中没有a
和没有的可能性非常小b
,因此这一步其实并不需要。 - 我
modified.rd
通过管道传输reundupe
并将结果保存为result
。 - 我检查了(
cmp
)original
和是否result
相同。
上述过程使用多个常规文件。常规文件数量减少后,过程如下:
</dev/urandom head -c 1G >original \
&& <original redupe | tr ab xy | reundupe | cmp - original
成功cmp
(无错误,退出状态 0)表示redupe
有效。对我来说有效。
我还测试了不使用tr
( … | redupe | reundupe | …
) 的情况,以查看当没有任何损坏时是否一切正常。结果显示一切正常。
结论、注释
redupe
有效,但不是万能药。请继续阅读。调用
redupe --help
,注意-o
/--overhead
选项。如果数据损坏严重而无法
reundupe
纠正,则该工具将打印error reading input
;有点误导,请注意。我设法找到一个(相对较小)的随机数据文件,在应用
redupe -o 1
(弱冗余)、更改(相对较强)并应用后,reundupe
它给了我一个不同的文件,没有任何错误reundupe
。我并不怀疑有错误,我可能碰巧创建了一个对有效的文件reundupe
。另一方面,偶尔的位翻转得到了很好的纠正。虽然偶尔的位翻转(和字节翻转)可以得到很好的纠正,但流中缺失或过多的字节致命的。看来该工具不是为纠正此类错误而设计的。
您写道“我担心我的 PC 是否在某个地方出了问题”。如果您的 PC 之前出现问题,
redupe
那么redupe
它将处理混乱的流并尽职尽责地处理它。垃圾进,垃圾出;reundupe
将重新创建原始混乱的流。如果您的 PC(或任何东西)真的那么之后就搞砸了,redupe
很可能这个工具也帮不了你,因为它只处理位翻转。redupe
在管道内工作,这就是您想要的。但这也意味着它必须使用相对较小的窗口来处理数据。几个彼此靠近的损坏字节将比散布在一个大文件中的相同数量的损坏字节更糟糕。您希望将其放在和
redupe
之间,而不是 之前。这样,从备份中检索时,它将位于 之前。反过来做(即之前,之前)是有缺陷的,因为:gzip
aws
gzip
reundupe
gunzip
redupe
gzip
gunzip
reundupe
(实际原因)稍微翻转就会
gunzip
失败(它检查 CRC),数据甚至无法得到reundupe
纠正;但即使你可以gunzip
继续,还有另一个原因;那就是……(理论原因)压缩通过检测模式、相似性来工作,因此它可以减少冗余;你不想添加冗余然后立即删除它;你想减少实际数据的冗余,然后添加一些故意的冗余和收下。
目前,在我看来,
redupe
+reundupe
在没有损坏的情况下可以正常且稳定地工作;它可以修复轻微损坏(更改的字节)。显然“超出冗余度”的损坏可能会或可能不会被检测到reundupe
(不过,在您的情况下,未检测到的损坏可能会导致gunzip
失败)。换句话说,该工具不会损坏好数据,并且它为您提供了一些从损坏数据中恢复好数据的机会。在我看来,该工具的净值肯定是积极的。进行您自己的测试并决定是否
redupe
适合您;--overhead
您想要什么;以及性能是否可以接受。