XZ

XZファイルとは

Unix で普通に使える圧縮のなかでいちばん強力。ソースコードやパッケージの配布の標準です。

XZ とは何か

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

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

XZ はどこから来たのか

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

古さが役に立つのは、ごく実務的な理由からです。形式が古いほど、それを覚える時間が多くのプログラムに与えられてきたということだからです。

仕様は公開されています

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

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

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

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

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

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

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

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

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

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

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

XZ を開けるのは何か

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

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

ブラウザーで開く

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

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

渡すための形式です

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

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

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

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

一つのストリーム、ファイル名なし、アーカイブでもありません

これが 7z との違いのすべてで、ほかのすべてを説明します。xz ファイルはちょうど一つの圧縮されたストリームを持ちます。ディレクトリも名前の一覧も、複数ファイルという概念もありません。`report.txt` を圧縮すれば `report.txt.xz` が得られ、そこにはそれ以外何もありません。

これが `.tar.xz` が普通の形である理由です。tar がディレクトリツリーを一本のストリームにまとめ、xz がそのストリームを圧縮する。`.tar.gz` と同じ役割分担です。`.7z` に tar が要らないのは、7z 自体がアーカイブ形式だからです。`.xz` に tar が要るのは、そうでないからです。

7z と同じ圧縮を、違う包み方で

どちらも LZMA2 を使うので、同じデータに対してよく似たサイズになります。xz はテキストやソースコード、ログでたいてい gzip をおよそ三割以上上回ります。100 MB のダウンロードが 65 MB になるくらいの余裕です。

それを買っているのは時間とメモリです。高い設定での圧縮は gzip の何倍もかかることがあり、数百メガバイトの作業用メモリを要求することもあります。展開はどちらにしても速く安価で、これは一度圧縮されて何度もダウンロードされるものにふさわしい形です。

Linux ディストリビューションがこれを標準にした理由

Linux カーネルは `.tar.xz` として配布されています。たいていのディストリビューションのパッケージアーカイブと、多くのソースリリースも同様です。計算は単純です。何百万回もダウンロードされるファイルなら、どれだけの圧縮の手間をかけても正当化できます。コストは一度だけ払い、節約はダウンロードのたびに掛け算されるからです。

これがまた、xz に出会うのが誰かからファイルを送られたときより、ソフトウェアを取ってくるときのほうが多い理由です。共有のための形式というより配布のための形式で、その違いは周りのツール群にも表れています。

2024年のバックドア、正確に知っておく価値があります

2024年3月、xz-utils のソフトウェア ── バージョン 5.6.0 と 5.6.1、CVE-2024-3094 として追跡されています ── にバックドアが見つかりました。それは、およそ二年かけてプロジェクト内で信頼を築いてきたある貢献者によって意図的に組み込まれたもので、xz をリンクしたライブラリが読み込まれるシステムの SSH デーモンを狙っていました。

これを見つけたのは開発者の Andres Freund で、SSH のログインがおよそ 0.5 秒遅くなっていることに気づき、それを見過ごさずに追跡しました。影響を受けたバージョンはテスト版のブランチにあり、安定版のディストリビューションにはほとんど届いていなかったため、実際の被害範囲は小さいものでした。

それがあなたのファイルにとって意味すること、意味しないこと

ファイル形式そのものは何も損なわれていません。バックドアはあるプログラムのある特定のリリースの中にあり、xz ファイルの構造を変えるものではなく、以前、そのさなか、あとに作られた `.xz` はどれも普通に圧縮されたストリームです。素の xz ファイルがその手口を運ぶ方法はありません。

長く残る意味は圧縮についてではなく、オープンソースソフトウェアの保守のあり方についてです。この形式に起きたもっとも重大な出来事であり続けていますが、それは正確に知っておく価値があり、xz が安全でないという噂として扱うべきではありません。

整合性チェック、これはこの形式では珍しい機能です

xz はチェックサム ── CRC32、CRC64、あるいは SHA-256 ── を保存し、展開時に検証します。転送中や壊れかけたディスクで一バイトでも変わっていれば、静かに間違った出力を出すのではなく、明確なエラーで展開が失敗します。

これは素の gzip に対する本物の優位で、そのチェックはより弱いものです。この点も、ディストリビューションがソフトウェア配布にこれを信頼する理由の一部です。破損は検出しますが、修復はできません。それは RAR のリカバリーレコードだけができる、ここにあるほかの何も提供しない機能です。

zstd がどこに収まるか、一部のプロジェクトが移った理由

Facebook が 2016 年に公開した Zstandard は、xz とほぼ同じくらいの圧縮率を、gzip 並みの速さで達成します。圧縮にかかる時間が問題になる場面 ── パッケージのビルド、毎晩実行されるバックアップ、絶えず書き込まれるデータ ── では、その組み合わせに逆らうのは難しく、いくつかのディストリビューションはこの理由でパッケージ形式を zstd に移しました。

xz は最高設定での純粋な圧縮率でいまも勝っていて、それが一度だけ作られるソースリリースやカーネルのアーカイブでの居場所を保っています。二つは実際には同じ仕事を争っているわけではありません。

開くと、実際に何が手に入るか

Linux のシステムはどれもコマンドラインから xz を扱えます。素の macOS には `xz` バイナリが同梱されていません(Homebrew か MacPorts が用意します)が、libarchive を土台にした `tar` は補助なしで `.tar.xz` を展開でき、たいていの用途はこれでまかなえます。Windows には 7-Zip のようなユーティリティが必要でしたが、それなら問題なく読めます。`.tar.xz` を展開するのはたいていのツールが一つにまとめて見せる二段階の作業です。圧縮を解いてから、tar を展開します。

素の `.xz` を展開してフォルダーが出てくることを期待しないでください。戻ってくるのは圧縮されていた一つのファイルだけです。それがこの形式が持っていたものすべてだからです。ディレクトリツリーを期待していたなら、欲しかったアーカイブはその中に入っている `.tar` のほうです。

いつ使うか

何かが一度圧縮されて何度も取得される場面 ── リリース、ダウンロード、バイトに費用がかかる長期保存への保管 ── で使ってください。圧縮にかかる余分な数分は、取得のたびに償却されます。

人にファイルを送るために使わないでください。相手のコンピュータが助けなしで開けるのは ZIP で、一回きりの転送でのサイズの差は、`.xz` が何で、どう開くのかを説明する手間に見合わないことがほとんどです。

基本情報

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