破損したアーカイブの修復手順
tar: Skipping to next header というエラーが表示された場合、アーカイブファイルの構造が破損している可能性が高いです。以下の手順で対処してください。
1. ファイルの整合性を確認する(最重要ステップ)
アーカイブを実際に展開せずに、ヘッダー情報のみを読み取ってみます。
tar -tvvf 圧縮ファイル.tar | head -n 20
- ✅ 一部のファイルリストが表示される → アーカイブは部分的に読み取り可能
- ❌ 何も表示されない → ファイルが深刻に破損している
2. ファイルの元の状態を確認する
- ネットワーク経由で受け取ったファイル → 元のファイルのハッシュ値と比較します。`md5sum` の代わりに、より堅牢な `sha256sum` を使用することをお勧めします。
sha256sum archive.tar
# 元のソースで提供されているハッシュ値と照合
sudo badblocks -v /dev/sda1 # 実際のデバイス名(例: sda1)に置き換える
3. データの救出を試みる
`ddrescue` ツールを使用して、破損したファイルからデータをクローンします(事前にインストールが必要)。
sudo apt install ddrescue
ddrescue -n -r 3 broken_archive.tar recovered_archive.tar rescue.log
-nはマップファイルの作成をスキップし、-r 3は不良セクターの読み取りを3回試みます。- クローニングが完了したら、生成された
recovered_archive.tarを展開してみてください。
4. データを部分的に抽出する(実験的な方法)
破損したブロックをスキップして、可能な限りデータを取り出します。複数回の試行が必要になる場合があります。
# 特定のファイルタイプのみを抽出(例: PNGファイル)
tar -xvf archive.tar --occurrence=1 --wildcards '*.png'
# 特定のディレクトリを除外して抽出
tar -xvf archive.tar --exclude="破損ディレクトリ/"
5. 高度な修復手法
- foremost を使って、ファイルシステム情報を無視して生のバイナリデータをスキャンします。
sudo foremost -i archive.tar -o recovered_dir
sudo photorec /dev/sda1 # 元のストレージデバイスを選択
エラーの原因
Skipping to next header → tarが現在のデータブロックのヘッダーチェックサムに失敗した
Exiting with failure → 連続して複数の破損ブロックが検出されたため、処理を中止
破損の一般的な原因
- ファイル転送中に強制終了した
- 大容量ファイルを
scpで転送する際に-pオプションを付け忘れた - バックアップ中にシステムが突然停電した
破損を防ぐための対策
- 圧縮時に検証機能を追加する
tar -cvzf backup.tar.gz --verify -p important_dir/
rsync を使うrsync -avh --progress --checksum source_dir destination_dir/