脱・肥大化!XZ Utilsを使って配布バイナリやログを限界までスリム化する方法
ソフトウェアエンジニアの視点から、このツールがいかに素晴らしい「おもてなし」を実現するか、コント仕立てで解説いたします。
支配人(エンジニア)
「おい!さっき届いたログファイル、ストレージの部屋に入りきらないぞ!どうなってるんだ!」
ベルボーイ(XZ) 「支配人、ご安心を。私、XZにお任せいただければ、その巨大な荷物を『LZMA2』という特殊なパッキング術で、跡形もなく(は言い過ぎですが)コンパクトにしてみせます。」
解説
XZ Utils は、高い圧縮率を誇るオープンソースのデータ圧縮ソフトウェアです。
LZMA2アルゴリズム
gzipやbzip2よりも圧倒的に小さく圧縮できます。
.xz 形式
現代のLinuxディストリビューションで標準的に使われるフォーマットです。
フロント
「お客様、当ホテル(サーバー)でXZをご利用になるには、簡単な記帳だけで結構でございます。」
Ubuntu/Debian
sudo apt install xz-utils
macOS (Homebrew)
brew install xz
CentOS/RHEL
sudo yum install xz
シェフ(開発者)
「最高の料理(アプリ)を作ったが、配送コストを下げたい。プログラムから直接パッキングしたいんだ。」
XZ Utils は単なるコマンドだけでなく、ライブラリとしても優秀です。
#include <lzma.h>
#include <stdio.h>
// データをXZでパッキングする職人技
void compress_data(const uint8_t *src, size_t src_len) {
lzma_stream strm = LZMA_STREAM_INIT;
// 圧縮レベル6(バランス型)で初期化
if (lzma_easy_encoder(&strm, 6, LZMA_CHECK_CRC64) != LZMA_OK) {
return; // 失敗...(満室です)
}
// ここで実際の圧縮処理を行う(詳細は省略しますが、ストリーム処理が得意です)
// ...
lzma_end(&strm); // リソースを解放(チェックアウト)
}
「手っ取り早く荷物をまとめたい」時はこれだけです。
# 荷物を限界まで小さくする(-9は最高圧縮レベル)
xz -9 huge_log_file.log
# 荷物の中身を確認する(展開せずに見る)
xzcat huge_log_file.log.xz | head -n 10
支配人
「XZ、お前を導入してからストレージの維持費が浮いたよ。おまけに解凍(展開)は意外と速いんだな。」
ベルボーイ
「左様でございます。圧縮には少し時間がかかりますが、一度固めてしまえば、配布(ダウンロード)の時間は大幅に短縮できます。これぞエンジニアの『先回りしたおもてなし』です。」
配布物の軽量化
ソフトウェアのパッケージ(.tar.xz)に最適。
ログのアーカイブ
滅多に見ない古いログを最小限のスペースで保管。
帯域の節約
ネットワーク転送量を減らし、ユーザーの待ち時間を削減。