BZ2

BZ2ファイルとは

GZ よりよく縮み、そのぶんかなり時間がかかります。

BZ2 とは何か

BZ2 はストリーム形式です。先頭から末尾へ書かれ、同じ順に読まれます。 長期保存のために使われます。

拡張子は .bz2、正式名称は Bzip2 Archive です。ただしどちらも、そのファイルが中に何を持てるかほどには多くを語りません。このページの残りは、その中身についての話です。

BZ2 はどこから来たのか

1996 年までさかのぼります。

これだけ長く読まれ続けてきた形式なら、10 年後に取り出したいものを預けても大丈夫です。

仕様は公開されています

仕様書がそのまま公開されているので、中身を推し量るのではなく文書を読んで実装できます。この形式が数多くのプログラムに載っているのはそのためであり、20 年前に書かれたファイルが今も開けるのもそのためです。ただし「仕様が公開されている」ことと「使用料が要らない」ことは別の話です。中でコーデックを包んでいる形式では、特許のライセンスは仕様書が答えていない別の問題として残ります。

古い形式です

今もどこでも開けますし、古いプログラムは今もこれを書き出します。ただ、この形式のまわりで新しいものは何も作られていません。残しておきたいものは移してください。そして今日始める仕事には、これを選ばないでください。

捨てられるものはありません

BZ2 ファイルは中身をそのまま保存します。保存し直しても何も変わらないので、開いて、直して、また保存する——それを何度繰り返しても劣化は積み上がりません。これが、渡すための形式ではなく作業のための形式である理由です。

ちょうど 1 ファイルを持ちます

BZ2 ファイルが圧縮するのはひとつながりの流れだけで、ファイル名やフォルダーというものを知りません。これが TAR と並んで現れることがこれほど多い理由です。TAR が、その足りない構造を足してくれます。

この圧縮率がどこから来ているか

一度に扱う範囲は 900 KB です。繰り返しがこの幅の中に収まっていて初めて、それを圧縮で畳めます。

この数ひとつで、書庫形式どうしの違いのほとんどが説明できます。範囲が広ければ多くの繰り返しを見つけられ、そのぶん時間とメモリーを使います。取引はそれだけです。

自分を守るために何を備えているか

BZ2 ファイルは壊れたファイルが黙って誤読されるのではなく、壊れていると分かるようにするチェックサムを備えています。

チェックサムは何も直しません。ファイルが壊れていると教えてくれるだけです。ただしそれは、今それを知るか、送った相手から知らされるかの違いです。

BZ2 を開けるのは何か

bzip2、7-Zip、Kekaが読めますし、同じ種類のプログラムならたいてい読めます。

ファイルが開かないとき、形式が悪いことはめったにありません。たいていはプログラムのほうが形式より古いのです。もっと古い形式に変換してしまうのが確実な逃げ道で、このサイトの残りの部分はそのためにあります。

ブラウザーで開く

これを読めるブラウザーはありません。

これを変換するいちばんよくある理由がこれです。形式が悪いのではありません。ファイルを見せたい場所が、それを読めないというだけのことです。

渡すための形式です

BZ2 は渡すために作られたもので、中で作業するためのものではありません。編集は可能ですが、快適だったためしはありません。賢い道は、元のファイルへ戻ってもう一度書き出すほうを通ります。

この形式でよく起きること

繰り返し挙がる不満はこれです。ひとつの流れしか扱えず、フォルダーを記述できない。

どれも、この形式を避ける理由にはなりません。どれかに不意を突かれる前に知っておくべきことがら、というだけです。これは別の主張であり、そして役に立つほうの主張です。

両側から追い抜かれた形式

bzip2 は1996年に登場し、当時のgzipより明らかに高い圧縮率を実現しました。その後10年ほど、.tar.bz2 はソースコードの配布やアーカイブにとって無難な中間の選択肢でした。その時代はすでに終わっています。xz はより強く圧縮でき、zstd は同程度の圧縮率でより高速に、しかもどちらもbzip2より展開が速いのです。

今日 .bz2 に出会うなら、ほぼ確実に古いものです。アーカイブされたリリース、何年も前に公開されたデータセット、2008年頃の初期設定のまま残っているバックアップ。新しく作る理由はもうなく、必要なのは今あるものをどう開くかです。

検索するのではなく並べ替える

gzip や xz、7z、zip はいずれも過去に遡って繰り返しのパターンを探します。bzip2は違う方法を取ります。Burrows-Wheeler変換によってデータのブロックを並べ替え、似た文字が隣り合うようにしてから、その並びが生む連続をシンプルな符号化で活用します。

この並べ替えは可逆で、正確に元に戻せます。この仕組みが、テキストへの高い圧縮率と、展開時に並べ替えを元に戻す必要があるための遅さという、この形式の特徴を説明しています。

ブロック単位だから復旧しやすい

bzip2は独立したブロック、既定で900KBずつを単位に処理します。それぞれのブロックは他のブロックと無関係に圧縮・展開されます。

この性質のおかげで、アーカイブの一部が壊れても、無事なブロックは読み取れます。gzipやxzでは、ストリームの序盤の破損が以降すべてを巻き込むのが普通です。壊れかけたメディアに残った古いアーカイブでは、これが実際に決め手になることがあります。

そして並列処理もできる

ブロックが独立しているため、複数のプロセッサーコアで同時に圧縮・展開できます。pbzip2やlbzip2といったツールがこれを活用しており、生成されるファイルは通常のbzip2でも問題なく読めます。

8コアの環境では、この性質がbzip2の最大の弱点を許容できる範囲に変えます。科学技術計算やデータパイプラインで長くこの形式が使われ続けた理由のひとつです。

なぜ拡張子が2つ続くのか

bzip2は正確に1つのストリームだけを圧縮します。ディレクトリもファイル名の一覧も、複数ファイルという概念そのものもありません。gzipやxzと同じ形です。だからこそ .tar.bz2 が通常の形になります。tar がディレクトリツリーを1つのストリームにまとめ、bzip2がそれを圧縮します。

素の .bz2 を展開すると1つのファイルだけが戻ります。フォルダーを期待していたなら、目当てのアーカイブはその中にある.tarです。

実際の数値はどのあたりか

テキストやソースコードでは、bzip2はgzipよりおよそ4分の1ほど小さくなり、xzとの差は数パーセント程度に収まります。圧縮はgzipより数倍遅く、展開はさらに遅く、これがこの形式の廃れた理由です。

ファイルは1回圧縮されて何度も展開されるので、読み込みが遅い形式はそのコストを繰り返し払うことになります。xzは書き込みが遅く読み込みが速いという、逆の性質を持っています。

保守が止まっていた時期があった

本家のbzip2は長らくリリースが止まり、2019年には長期間存在していた展開時の境界外書き込みの脆弱性が見つかりました。その後保守は再開され、現行のソフトウェアでは修正されています。

これは今あるファイルへの警告というより背景情報です。.bz2はコードではなくデータであり、最新のソフトウェアで開く分には問題ありません。この経緯は、多くのディストリビューションがこの形式から離れた理由の一部です。

今も生成しているところ

古いLinuxのソースリリースやアーカイブされたディストリビューションのパッケージ。並列ツールが実用的だった科学・ゲノムのデータセットで、公開済みのアーカイブは今も再エンコードされません。10年前に設定されたバックアップシステムや、Wikipediaのデータベースダンプも歴史的にこの形式でした。

共通しているのは、一度書かれ多くの人にダウンロードされ、二度と見直されないという公開の形です。今日、誰かに.bz2を送るという場面はまずありません。

開いたあと、どうするか

LinuxとmacOSはコマンドラインでbzip2を標準的に扱え、Windowsでも7-Zipが問題なく読めます。.tar.bz2の展開は2段階の処理を、多くのツールが1つの操作として見せています。

中身を人に渡すなら、相手のパソコンが何も追加せずに開けるZIPに詰め替えてください。Unixシステムに戻すなら、tarが保持していた権限やシンボリックリンクを残せる.tar.gzか.tar.xzに詰め替えてください。.bz2として作り直す積極的な理由はありません。

基本情報

BZ2フォーマットの識別子と出自。
拡張子.bz2
メディアタイプapplication/x-bzip2
初版1996