パイプされた tar ストリームにエラー訂正情報を追加する

パイプされた tar ストリームにエラー訂正情報を追加する

私は Amazon S3 Glacier Deep Archive を使用して Ubuntu マシンにバックアップを保存しています。私のワークフローは基本的に次のようになります。

tar cf - $FILES | gzip -3 --stdout | aws s3 cp - $TARGET

これはかなりうまく機能すると思いますが、非常に大きなアーカイブ (1TB 以上) の場合、PC のどこかが故障したり、ビットが反転したりすると、アーカイブ全体が使用できなくなるのではないかと心配です。理想的には、このフローに何らかのエラー修正機能を追加したいと考えています。

PAR2 を調べてみましたが、これは私の希望どおりのようですが、1つ注意点があります。それは、パイプを入力として受け取ることができないことです。アーカイブ全体をディスク上に構築する必要があります。それからPAR2 を実行してからすべてをアップロードします。1 TB を超えるアーカイブの場合、使用可能なディスク容量の点からこれが常に実行可能であるとは限らず、プロセスが大幅に遅くなります。

最初にファイルに保存せずに、データ ストリームに前方誤り訂正情報を追加する同様のツールを見つけることができませんでした。どうすればよいでしょうか? ソリューションが情報を別のファイルに追加するか、ストリームを変更して冗長性を追加するかは、実際には問題ではありません。

答え1

道具:redupe

この目的のためのツールを見つけました: redupe。これについて読んでください:Redupe: 前方誤り訂正

この投稿では、redupeデータ ストリームに前方誤り訂正機能を提供する […] ツールを紹介します。 […] は、やredupeなどの圧縮ツールをモデルにしていますが、冗長性を排除するのではなく追加します。 はデータを直接操作し、元のデータに冗長情報をインラインで追加することで、データを冗長状態に変換します。gzipbzip2redupe

補完的なコマンドは ですがreundupe、これは実際には単なる 1 つのツールであり、呼び出す名前によってその機能が決まります。

得られるredupe GitHubから

redupeDebian 12 でコンパイルしてテストすることができました。詳細については以下を参照してください。


コンパイル

注: ここで説明されている問題の一部は、プログラミングとコンパイルの経験が不足しているため、または事前にすべてを正しく構成していなかったために発生した可能性があります (またはまったく構成していなかった可能性があります)。

私の OS は 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/lib/ に/usr/local/lib/移動しました。redupe/usr/local/lib/

    sudo mv /usr/local/lib/libredupe.* /usr/lib/
    
  6. /usr/local/bin/redupeまた、新しくインストールされたと が同一の通常ファイルであることもわかりました/usr/local/bin/reundupe。1 つの通常ファイルで十分で、もう 1 つの名前はシンボリック リンクにすることができます。

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

私のテスト

  1. 1 GiB を/dev/urandom通常のファイルにパイプしましたoriginal
  2. パイプしoriginalredupe結果を として保存しましたoriginal.rd
  3. パイプを使用original.rdしてtr ab xyいくつかのバイトを変更し、結果を として保存しましたmodified.rd
  4. original.rdmodified.rdが異なることを確認しました(cmpまたはなどを使用することができます)。 1 GiB のランダム データに と が存在しないmd5sum可能性は非常に低いため、この手順は実際には必要ありません。ab
  5. パイプしmodified.rdreundupe結果を として保存しましたresult
  6. と が同一であるかどうかを( cmp)で確認しました。originalresult

上記の手順では、複数の通常ファイルを使用します。通常ファイルの数を減らすと、手順は次のようになります。

</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が故障したら、故障したストリームを忠実に処理します。ゴミを入れればゴミが出てくる。元の故障したストリームを再現します。PC(または他のPC)が故障しredupeたらredupereundupe本当にその後に問題が発生した場合、redupeこのツールはビット反転のみを処理するため、おそらく役に立ちません。

  • redupeパイプ内で動作し、これが望みどおりです。ただし、これは比較的小さなウィンドウを使用してデータを処理する必要があることも意味します。破損したバイトが互いに近接している方が、同じ数の破損したバイトが大きなファイル全体に分散しているよりも悪影響があります。

  • を の前ではなくとredupeの間に配置する必要があります。そうすると、バックアップから取得する際にが の前になります。これを逆の順序 (つまり の前、の前) で行うと、次の理由で不完全になります。gzipawsgzipreundupegunzipredupegzipgunzipreundupe

    • (実際的な理由)少しのひっくり返しはgunzip失敗を引き起こします(CRCをチェックする) データは修正されませんreundupeが、続行できたとしてもgunzip、別の理由があります。それは…

    • (理論的な理由)圧縮はパターンや類似性を検出することで機能するため、冗長性を削減します。冗長性を追加してすぐに削除するのではなく、実際のデータの冗長性を削減してから、意図的に冗長性を追加し、保管する

  • 今のところ、破損がない場合、redupe+ は適切かつ確実に機能しているように見えます。軽微な破損 (変更されたバイト) を修復できます。明らかに「冗長性を超える」破損は、検出される場合とされない場合があります (ただし、検出されない破損はおそらく失敗します)。言い換えると、このツールは正常なデータを破損せず、破損したデータから正常なデータを回復する機会を提供します。私の意見では、このツールの正味の価値は確かにプラスです。reundupereundupegunzip

  • 独自のテストを実施して、redupeそれが自分に適しているかどうか、何を--overhead望んでいるか、パフォーマンスが許容できるかどうかを判断します。

関連情報