テクノロジー · 実用ガイド

tar の「Unexpected EOF」—再展開する前にアーカイブの完全性を証明する

元のバイトを保全し、圧縮層と tar 構造を別々に検査し、配布元のサイズとハッシュに照合してから交換または隔離回収します。

オリジナルイラスト:.tar、.tar.gz、.tgz の拡張子はヒントであり、実際のバイトやフィルターの証明ではありません。
オリジナルイラスト:gzip トレーラーの CRC32 と ISIZE は gzip メンバーを検査しますが、tar の各メンバーを外部マニフェストと照合しません。 Watch at Ease

「Unexpected EOF」は、現在の構造またはメンバーが終わる前に読み取りバイトが尽きたことを示します。再展開しても失われた末尾は作れません。

正確なファイルを保全し、圧縮層とアーカイブ層を識別し、信頼できる配布元のサイズとハッシュを比較します。部分的に展開できても完全性の証明にはなりません。

再試行前に正確なバイトを隔離

疑わしいアーカイブを証拠用パスへコピーまたは改名し、バイト数、ハッシュ、配布元、取得コマンド、時刻、完全なエラーを記録します。実際の宛先へ再展開しません。

パイプなら両方のコマンドと終了状態を残します。pipefail 相当がなければ、下流の成功が上流の切断を隠します。

ファイル名でなく証拠から層を特定

ファイル種別と先頭バイトを確認し、主張された圧縮ラッパーを別に検査します。実際に gzip の場合だけ gzip -t を使います。

ラッパー検査後、コピーまたは正しい展開器経由で tar -tf を実行し、gzip 破損と内側 tar の早期終了を分けます。

生成元に対して完全性を証明

信頼できる配布元または生成側から想定バイト数とハッシュを得て、両方を比較してから再取得を修復と見なします。

ストリーム転送では送受信の状態、両端のサイズとハッシュを記録します。終了 0 より一致したバイトが強い証拠です。

終了マーカーと欠損ペイロードを分離

tar は 512 バイト記録を使い通常ゼロブロックで終わります。慣例的な終端欠落と、ヘッダーやペイロードの途中 EOF は別です。

--ignore-zeros はゼロブロックを越えるだけで欠損内容を作りません。メンバー途中で止まれば後続は欠落、出力済みも暫定です。

証拠を上書きせず交換または再取得

新しい一時名へ再取得し、正しい層、想定サイズ、信頼できるハッシュを検証してから原子的に置換します。

生成元が稼働中のファイルシステムなら凍結またはスナップショットを使います。変化中の元は完全転送でも不整合になり得ます。

コピーだけで回収し終了条件を定義

元が失われた場合は隔離ディレクトリのコピーだけで作業します。回収可能メンバーを列挙し、新しい宛先へ展開して独立記録で検証します。

置換品が各層の検査と元に沿うサイズまたはハッシュを満たし、元ワークフローが成功した時だけ完了です。回収物は不完全と表示します。

オリジナルイラスト:中断した転送は有効な前半と部分ファイルを残すため、存在だけでは合格になりません。
オリジナルイラスト:完了には各層の検査、配布元と一致するサイズまたはハッシュ、元ワークフローの再実行が必要です。 Watch at Ease