LZMAを使うもう一つの圧縮データフォーマット、lzipのはなし
最近、XZ Utilsにバックドア(CVE-2024-3094)が発見されたことで圧縮データフォーマットのxzも注目を集めていると思います。
この記事では、xzと同じくを使う圧縮データフォーマットの一つであるlzipを紹介します。
lzipとは
lzipは2008年に開発された圧縮データフォーマットです。
圧縮アルゴリズムとして7zなどでも使われているLZMAを採用しています。
lzipは以下のようなLZMAストリームにチェックサムやマジックナンバーなどを追加した単純なコンテナフォーマットをしています。
マジックナンバー | バージョン番号 | 辞書サイズ | LZMAストリーム | CRC-32 | データサイズ | メンバーサイズ |
---|---|---|---|---|---|---|
4バイト | 1バイト | 1バイト | 可変長 | 4バイト | 8バイト | 8バイト |
lzipはデータの整合性とデコーダーの可用性の両方を考慮して、データ共有と長期的なアーカイブ用途向けに設計されています。
使い方
lzipはgzip
やbzip2
に似たコマンドラインインターフェイス(lzip
)を提供しています。
# 圧縮
lzip README.md
# 展開
lzip -d README.md.lz
lzip
は並列処理に対応していませんが、並列処理に対応したplzip
が提供されています。
plzip
はlzip 1.4以降と完全に互換性があります。
plzip
はlzip
と比べて遥かに高速に圧縮と展開ができますが、圧縮率は僅かに低下します。
その他には、lzip形式のデータを修復するためのlziprecover
や、lzip形式のデータを読み書きするためのC言語のライブラリのlzlib
などが提供されています。
これらのコマンドは多くのOSの公式リポジトリでパッケージが提供されているので簡単に使い始めることができると思います。
xzとの違い
lzipとxzはどちらもLZMAを使用しますが、使用しているバージョンが異なります。
lzipはオリジナルのLZMAを使用しますが、xzはLZMA2を使用します。
LZMA2はその名前からオリジナルのLZMAを更新したバージョンのように見えますが、実際には複数のLZMAで圧縮されたデータと非圧縮データが混在しているコンテナフォーマットです。
lzipの作者は、xzが以下の設計上の理由から長期的なアーカイブ用途には不適切であり、データ共有や自由ソフトウェアの配布には推奨できないと主張しています。
- 実装間の安全な相互運用性が保証されていない。
- 拡張性には無理があり問題がある。
- 保護されていないフラグと長さフィールドに対して脆弱。
- LZMA2はオリジナルのLZMAより安全でなく効率が悪い。
- 破損の誤検知を増加させる無駄な機能を含んでいる。
- 末尾のデータに関して一貫性のない挙動を示す。
- エラー検出の精度がbzip2、gzip、lzipと比べて数倍低い。
比較
GNU Core Utilities 9.5のtarballを使用して比較しました。
圧縮
Command | Mean [s] | Min [s] | Max [s] | Relative |
---|---|---|---|---|
xz coreutils-9.5.tar |
10.587 ± 0.163 | 10.246 | 10.789 | 1.00 |
lzip coreutils-9.5.tar |
21.176 ± 0.130 | 20.969 | 21.384 | 2.00 ± 0.03 |
展開
Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
---|---|---|---|---|
xz -d coreutils-9.5.tar.xz |
196.2 ± 19.7 | 175.2 | 248.5 | 1.00 |
lzip -d coreutils-9.5.tar.lz |
624.7 ± 3.2 | 619.2 | 629.8 | 3.18 ± 0.32 |
ファイルサイズ
フォーマット | バイト数 | データ圧縮比 |
---|---|---|
オリジナル | 61,214,720 | 1.000 |
lzip | 6,443,423 | 9.500 |
xz | 6,482,572 | 9.443 |
バージョン
コマンド | バージョン |
---|---|
lzip |
1.24.1 |
xz |
5.6.1 |
ソフトウェアの対応
GNU tarとbsdtarはどちらもlzipに対応しています。
# 圧縮
tar -acf linux-6.8.2.tar.lz linux-6.8.2
# 展開
tar -xf linux-6.8.2.tar.lz
xz
は圧縮は対応していませんが、展開は対応しています[1]。
終わりに
LZMAを使うもう一つの圧縮データフォーマットのlzipを紹介しました。
xzと比較した際には利点と欠点の両方があるように思うので、適宜使い分けるのが良さそうです。
Discussion