Linuxアーカイブのデータ検証と修復

破損したアーカイブの修復手順

tar: Skipping to next header というエラーが表示された場合、アーカイブファイルの構造が破損している可能性が高いです。以下の手順で対処してください。

1. ファイルの整合性を確認する(最重要ステップ)

アーカイブを実際に展開せずに、ヘッダー情報のみを読み取ってみます。

tar -tvvf 圧縮ファイル.tar | head -n 20
  • ✅ 一部のファイルリストが表示される → アーカイブは部分的に読み取り可能
  • ❌ 何も表示されない → ファイルが深刻に破損している

2. ファイルの元の状態を確認する

  • ネットワーク経由で受け取ったファイル → 元のファイルのハッシュ値と比較します。`md5sum` の代わりに、より堅牢な `sha256sum` を使用することをお勧めします。
  • sha256sum archive.tar
    # 元のソースで提供されているハッシュ値と照合
  • ローカルのバックアップファイル → ストレージデバイス自体に問題がないか、`badblocks` を使ってチェックします。
  • 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
  • photorec を使って、特定のファイルタイプを回復します。
  • 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/

タグ: linux tar データ修復 checksum ddrescue

7月16日 18:31 投稿