Ubuntuで破損したbzip2を復旧!bzip2recover実践ガイド

はじめに:破損アーカイブの救出アプローチ

Linux運用管理において、重要なバックアップや配布用アーカイブが予期せぬ転送エラーやディスク障害で壊れてしまうトラブルは少なくありません。とりわけbzip2形式のファイル破損に直面した場合、アーカイブ全体が失われたと諦めてしまいがちです。しかし、bzip2にはブロック単位でデータを再構成できる専用ツール bzip2recover が用意されています。本稿では、CRCエラーを抱えた不正アーカイブから生存しているブロックを安全に抽出し、可能な限りデータを回収する実践的な修復手順を徹底解説します。

1. 検証環境のセットアップと複数ブロックを持つ圧縮ファイルの生成

復旧プロセスをシミュレーションするための作業環境を整え、検証用の bzip2 パッケージをシステムに導入します。パッケージインデックスを更新した上でインストールを実行しましょう。

bzip2パッケージのインストール

テストによって既存ファイルが散乱するのを防ぐため、ホームディレクトリ配下に専用の作業ディレクトリを設けてカレントディレクトリを切り替えます。

検証用ディレクトリの作成と移動

次に、破損テストの対象となるダミーデータとして、乱数ソースから生成した2MB相当のテキストファイルを sample_data.txt という名前で準備します。

テスト用サンプルデータの生成

bzip2 コマンドはバロウズ・ホイーラー変換(BWT)を基盤とする高圧縮ユーティリティで、入力データを独立した固定ブロックごとに圧縮処理する特性を備えています。今回は復旧挙動を明確に観察できるよう、ブロックサイズを最小値(100KB)に設定し、元ファイルを残したままアーカイブを作成します。
⚙️ [主要オプションの概要]

-k : 圧縮・伸張処理の完了後も、入力元の元ファイルを削除せずに保持します。
-1 〜 -9 : 各圧縮ブロックの容量を100KB単位(100KB〜900KB)で指定します。
-d : アーカイブを展開(解凍)する伸張モードで動作します。
-t : アーカイブ内のデータ整合性を検証し、CRCエラーなどの破損有無をチェックします。
-v : 圧縮率や進行状況などの詳細な実行ステータスを画面に出力します。
-f : 出力先と同名のファイルがすでに存在している場合でも、強制的に上書きします。

ブロックサイズ100KBでの圧縮実行

生成されたファイル群を確認し、未圧縮の生データと圧縮済みファイルのサイズ感を把握しておきます。

生成ファイルとファイルサイズの確認

2. アーカイブ破損のシミュレーションと整合性エラーの検証

作業環境が維持されていることを確認するため、検証用ディレクトリ ~/bzip2_demo へ移動します。

作業ディレクトリへの移動

手元にある正常な圧縮ファイルを退避しつつ安全に破壊テストを実施できるよう、sample_data.txt.bz2 を corrupted_data.bz2 という別名で複製します。

テスト用アーカイブの複製

ファイル破損シナリオを再現するにあたり、dd コマンドを使ってアーカイブの中間オフセット部分にランダムバイトを直接上書きし、人工的なデータ破壊を引き起こします。

バイナリの意図的な破壊

破壊された corrupted_data.bz2 に対して整合性テストを実施し、アーカイブのどの時点で巡回冗長検査(CRC)エラーが発生して伸張が停止するかを観察します。

整合性チェックによるCRCエラーの確認

3. bzip2recoverによる健全ブロックの切り出しと分離

修復フェーズへと移行するため、対象ファイルが格納されている ~/bzip2_demo へ移動します。

作業ディレクトリへ移動

ここで活躍するのが bzip2recover です。このツールはアーカイブ全体が読み込めなくなった場合でも、バイナリストリーム内を走査してブロックヘッダ(48ビットのマジックナンバー)を特定し、読み取り可能なブロックごとに rec* 接頭辞を持つ独立したファイル群として切り出してくれます。
破損箇所を含む corrupted_data.bz2 を対象にリカバリを実行してみましょう。

bzip2recoverによるブロック抽出

処理が完了すると、元の単一アーカイブから各ブロックが個別のbz2アーカイブとして分割出力されます。ファイルリストを一覧表示して生成結果を確認します。

抽出されたブロックファイルの確認

4. 生存ブロックの健全性チェックと救出データの連結再構築

分離された各ブロックの状態を評価し、最終的なテキストデータへと再結合するため、引き続き作業ディレクトリ ~/bzip2_demo で作業を進めます。

作業ディレクトリへの移動

抽出された各ブロックのうち、実際に破損の影響を受けているのは一部のみです。シェルループを使って bzip2 -t を順次実行し、破損していない健全なブロックファイルをふるい分けます。
破損ブロック以外の正常なブロックについて、問題なくパスすることを確認できます。

各ブロックファイルの整合性ループ検証

正常と判定されたブロック群を順次解凍し、標準出力を recovered_data.txt に追記リダイレクトすることで、欠損のないブロックのデータを1つのファイルへと再構成します。
エラーが発生した破損ブロックはスキップされ、復旧可能なテキストストリームのみが連結されます。

健全ブロックの展開と単一ファイルへの追記結合

最後に ls -lh を用いて、元の sample_data.txt と復元成果物である recovered_data.txt のファイル容量を比較します。破損した特定ブロック分を除き、大半のデータが無事にサルベージできていることが確認できます。

元ファイルと復元ファイルの容量比較

以上、Ubuntu環境で破損したbzip2アーカイブから bzip2recover を駆使してデータをサルベージする一連の流れを解説しました。
アーカイブの解凍エラーが発生しても即座に全損と決めつけず、ブロック単位での切り分けと抽出アプローチを試みることで、被害を最小限に抑え大切な資産を救出できます。日頃のトラブルシューティングの引き出しとしてぜひお役立てください。