web-dev-qa-db-ja.com

タールを解かない

あるマシンから別のマシン(600GB以上)に大きなファイルを転送することを扱っており、を使用してそれらをタールアップしています

tar -cpvzf file.tar.gz -C PATH_TO_DIR DIR

タール処理が完了すると、次のことが行われます。

split -d -b 2G file.tar.gz file_part_

これにより、ファイル全体が2GBのチャンクに分割されるまで、file_part_00、file_part_01、...の束が作成されます。ファイルを転送する前に、tarが分割されたディレクトリ内の各部分をループし、次と同等の方法を使用してmd5ハッシュを収集します。

md5sum PART_NAME >> list_md5.start

各部分がハッシュされたら、次のようにします。

sort -u list_md5.start

(これは、安全のために、それらを並べ替えて重複を削除します)

次に、パーツはlist_md5.startにある順序で1つずつ転送されます。それらが他のコンピューターに到着すると、同じ方法を使用してmd5ハッシュが収集されますが、別のリストでlist_md5_2.startと呼びます。転送後、パーツを元に戻す前に、次の手順を実行します。

diff list_md5.start list_md5_2.start

違いが見つからない場合は、次のパートに進みます。それ以外の場合は、すべてのパーツをあきらめて削除します。それらを元に戻すことになると、私は次のことを行います。

cat file_part_* > file.tar.gz.incomplete

(遭遇した.tar.gzをuntarするのを待っているウォッチドッグがあるため、不完全なものがあります)。猫が完了すると、ファイルの名前は次のように変更されます。

mv file.tar.gz.incomplete file.tar.gz

この時点で、ウォッチドッグはそれを検出し、以下を使用して解凍します。

tar -C DEST -xzf file.tar.gz --totals --unlink-first --recursive-unlink

この時点で、デバッグできないエラーが発生します。

Tar Failed 2
gzip: stdin: unexpected end of file
tar: Unexpected EOF in archive
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now
 /PATH/TO/DEST

解凍後、失敗したかどうかに関係なく、タールは削除されます(解凍に失敗した大きなファイルを保持しても意味がありません)。

Md5sumが一致しない場合があり、その結果、プロセスが停止することもあります(これは、catアセンブルステップの前にチェックされます)。

名前が無効でないことを確認してみました。パーツサイズを小さいサイズに変更してみました。プロセスを手動で実行しようとしましたが、md5sumの不一致またはEOFエラー)の問題が発生しました。

これはすべて、両方が更新されたUbuntuマシンで実行されます(更新は保留されていません)。

この問題を解決する方法について誰かがアイデアを持っていますか?

3
Siewiei

この問題は、ストレージスペースを追加することで解決されました。具体的には、タールが分割されている間、タールを保持するために使用される2TBのhddを追加しました。元々、プロセス全体は6TBのhddで行われ、他の大きなファイルがその上にあり、最大で3TBのストレージスペースを使用できました。この問題は、バックグラウンドで何か大きなダウンロードがあり、質問から壊れたタールの問題を再現するスペースの大部分を占めていたときに気づきました。

このソリューションはおそらく最も洗練されたソリューションではありませんが、タールを塗った後に元のファイルを削除すると、かなりのオーバーヘッドが発生し、単にストレージスペースを追加するよりも時間がかかります。

誰かがこの質問に遭遇し、私と同じルートをたどる場合に備えて、新しいhddを追加するために私が従った手順は次のとおりです。 https://askubuntu.com/a/125277/

誰かがストレージスペースが十分であるかどうかを確認することを提案したことを指摘したいと思います。私は彼らにクレジットを与えたいと思います。ここに提案があります:

最初のtar-cpvzf ...がエラーなしで実行されていること、戻りコード(echo $?)が0であること、およびディスク容量が十分であることを確認してください。 – サイラス 8月16日19:37

ただし、この提案は当時として不完全であり、タールを塗るのに十分なストレージスペースがあったため、エラーが返されることはありませんでした。

0
Siewiei

Rsyncは、あるホストから別のホストにファイルとディレクトリをコピーする、UnixおよびLinuxのようなシステム用のフリーソフトウェアユーティリティです。

Rsyncを使用して、あるシステムから別のシステムにファイルを転送します。 screenを使用してrsyncを開始し、screenをデアタッチできます

ファイル転送はインクリメンタルであるため、Rsyncは軽量アプリケーションと見なされます。最初の完全転送の後、変更されたファイルのビットのみが転送されます。 Rsynchは、ファイアウォールの外側にあるリモートマシンにデータを同期することにより、オフサイトバックアップを提供するためによく使用されます。また、Webサイトのミラーリングにも使用されます。

0
user367435