将错误修正信息添加到管道 tar 流中

将错误修正信息添加到管道 tar 流中

我使用 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。这是我所做的:

  1. 我下载了redupe-master.zip 来自 GitHub,解压并将自己放入新创建的 中redupe-master/

  2. 通过反复试验,我发现我需要以下包:automake,,,,* 。makegcclibpopt-devlibtool

    sudo apt-get update
    sudo apt-get install automake make gcc libpopt-dev libtool
    

    * 至少这些包是我尝试过的,而且它们看起来都很重要。

  3. autoreconf -ivf
    
  4. ./configure && make && sudo make install
    
  5. 我能够启动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/
    
  6. 我还发现新安装的/usr/local/bin/redupe/usr/local/bin/reundupe是相同的常规文件。一个常规文件就足够了,另一个名称可以是符号链接:

    (cd /usr/local/bin/ && sudo rm reundupe && sudo ln -s redupe reundupe)
    

我的测试

  1. 我将 1 GiB 传输/dev/urandom到一个常规文件中original
  2. original通过管道传输redupe并将结果保存为original.rd
  3. original.rd通过管道tr ab xy改变了一些字节,并将结果保存为modified.rd
  4. 我确保original.rdmodified.rd不同(可以使用cmpmd5sum或类似的东西)。1 GiB 随机数据中没有a和没有的可能性非常小b,因此这一步其实并不需要。
  5. modified.rd通过管道传输reundupe并将结果保存为result
  6. 我检查了(cmporiginal和是否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之间,而不是 之前。这样,从备份中检索时,它将位于 之前。反过来做(即之前,之前)是有缺陷的,因为:gzipawsgzipreundupegunzipredupegzipgunzipreundupe

    • (实际原因)稍微翻转就会gunzip失败(它检查 CRC),数据甚至无法得到reundupe纠正;但即使你可以gunzip继续,还有另一个原因;那就是……

    • (理论原因)压缩通过检测模式、相似性来工作,因此它可以减少冗余;你不想添加冗余然后立即删除它;你想减少实际数据的冗余,然后添加一些故意的冗余和收下

  • 目前,在我看来,redupe+reundupe在没有损坏的情况下可以正常且稳定地工作;它可以修复轻微损坏(更改的字节)。显然“超出冗余度”的损坏可能会或可能不会被检测到reundupe(不过,在您的情况下,未检测到的损坏可能会导致gunzip失败)。换句话说,该工具不会损坏好数据,并且它为您提供了一些从损坏数据中恢复好数据的机会。在我看来,该工具的净值肯定是积极的。

  • 进行您自己的测试并决定是否redupe适合您;--overhead您想要什么;以及性能是否可以接受。

相关内容