2017-09-17 38 views
3

私は、 をアーカイブするための並列圧縮/暗号化バックアップスクリプトを、GNU parallel、xz、およびGnuPGを使用して作成しようとしています。コア部分のスクリプトのは、次のとおりです。GnuPGとGNU並列を使用して大容量ファイルの並列暗号化を行う方法は?

GnuPGの暗号化なしで
tar --create --format=posix --preserve-permissions --same-owner --directory $BASE/$name --to-stdout . \ 
    | parallel --pipe --recend '' --keep-order --block-size 128M "xz -9 --check=sha256 | gpg --encrypt --recipient $RECIPIENT" \ 
    | pv > $TARGET/$FILENAME 

、それは素晴らしい(解凍してuntarした作品)、 を動作しますが、並列暗号化を追加した後、以下のエラーで復号化するために失敗しています:

[don't know]: invalid packet (ctb=0a) 
gpg: WARNING: encrypted message has been manipulated! 
gpg: decrypt_message failed: Unexpected error 
: Truncated tar archive 
tar: Error exit delayed from previous errors. 

圧縮されていないサイズはgnu parallelのブロックサイズ(約125M)と同じであるため、GnuPGが部分ブロック暗号をサポートしていると考えています。どうすればこの問題を解決できますか?


FYI

乱数生成についてのもう一つの並列のgpg encrption問題

https://unix.stackexchange.com/questions/105059/parallel-pausing-and-resuming

答えて

2

パック

tar --create --format=posix --preserve-permissions --same-owner --directory $BASE/$name --to-stdout . | 
    parallel --pipe --recend '' --keep-order --block-size 128M "xz -9 --check=sha256 | gpg --encrypt --recipient $RECIPIENT;echo bLoCk EnD" | 
    pv > $TARGET/$FILENAME 

開梱

cat $TARGET/$FILENAME | 
    parallel --pipe --recend 'bLoCk EnD\n' -N1 --keep-order --rrs 'gpg --decrypt | xz -d' | 
    tar tv 

一度に1つのレコードを確実に渡すためにはが必要です。 GnuPGは、複数のマージされたレコードの解読をサポートしていません。

+0

私はあなたのコマンドをテストして報告します。 –

+0

@Old Tange:私は '--rrs'について知らなかった。カスタム区切り文字を使用することをお勧めします。私があなたのコマンドで得ることができない1つのことは '-N1'オプションです。このコンテキストでこのオプションが何をするのですか? man page said * --pipe -Nと一緒に使うと、読むべきレコードの数です。これはクイックアンサーで--block。* –

+0

thxよりやや遅いです。単に好奇心の中で '-N1'オプションが見つからない場合、マルチレコードをパイプに並列に渡しますか? –

2

のGnuPGは、複数の暗号化ストリームを連結し、一度それを解読サポートしていません。複数のファイルを格納し、個別に解読する必要があります。私が間違っていないと、あなたのコマンドはGnuPGのすべての並列インスタンスの出力を混ぜ合わせるので、多かれ少なかれランダムなガベージになります。

とにかく:GnuPGも圧縮を処理し、--compression-algoオプションを見てください。 xzを使用する場合は、--compression-algo noneを適用してください.GnuPGは既に圧縮されたメッセージを再度圧縮しようとしません。暗号化にはCPUの命令が大量にサポートされていますが、xz -9は実際には暗号化より時間がかかることがあります(これはベンチマークしませんでしたが)。

+0

wow!素晴らしい答えと質問を編集してください。それは私が知りたいことです。私は圧縮のgpgのケアについて知らなかった。私は自分の仕事で '圧縮 - アルゴnone'を試みるだろう。 です。ギガバイトのカップルのxz -9はgpgの暗号化よりも巨大なプロセスですが、gpgのプロセスも無視できる時間ではありません。とにかく、両方のテストの実行時間を報告します。 –

+1

Facebookの新しいzstdアルゴリズムを見てみることもできます。ソフトウェアを新しくサポートすることができれば、いくつかのベンチマークでは競争力のある圧縮率で優れたCPU負荷が要求されます。おそらく 'xz -9'に達していないかもしれませんが、ずっと小さな計算上のオーバーヘッドで達成されます。 –

+0

はい私はすでに、そのパイププロセスでfacebookの新しいzstdアルゴリズムを適用するのに時間がかかるが、zstdのプロセス作成動作はxz、gzipとは異なって見える。だから私は成功したzstd arhive圧縮ファイルを作成するのに成功しましたが、圧縮率と時間は古い 'xz -9'設定よりも悪いです。より多くの研究が必要に見えます。 –

0

that's mainly a gpg issue. gpg does not support multithreading and probably never will. you can search the web about the why.


it even got worse with gpg v2: you cannot even run multiple gpg v2 instances in parallel because they all lock the gpg-agent which is now doing all the work........ maybe we should look for an alternative when doing mass encryption.

https://answers.launchpad.net/duplicity/+question/296122

+0

技術的には、OpenPGPはマルチスレッド暗号化をサポートしていないCFBモードの使用を指定しているので、複数の個別の暗号化ストリームを開始する必要があります。 2番目の引用符は、もちろん、複数のスレッドやインスタンスを実行することで解決できるものです(サポートされていない場合は、GnuPGの制限です)。コメントをいただきありがとうございます。 –

関連する問題