hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

xzコマンドの使い方



1 xzコマンドとは?

ファイルの圧縮、解凍をするツールです。XZ Utilsによると、圧縮アルゴリズムはLZMA2を使用していて、gzip より 30 %、bzip2 より 15 % 小さいファイルの作成が可能なようです。なお、CentOS7以降、カーネルモジュールはxzコマンドで圧縮されています。

[root@server ~]# ls /lib/modules/4.18.0-372.9.1.el8.x86_64/kernel/net/ipv4/
ah4.ko.xz           inet_diag.ko.xz  ipcomp.ko.xz    tcp_bbr.ko.xz    tunnel4.ko.xz
esp4.ko.xz          ip_gre.ko.xz     ipip.ko.xz      tcp_dctcp.ko.xz  udp_diag.ko.xz
esp4_offload.ko.xz  ip_tunnel.ko.xz  netfilter       tcp_diag.ko.xz   udp_tunnel.ko.xz
gre.ko.xz           ip_vti.ko.xz     raw_diag.ko.xz  tcp_nv.ko.xz     xfrm4_tunnel.ko.xz

2 検証環境

AlmaLinux版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
AlmaLinux release 8.6 (Sky Tiger)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
4.18.0-372.9.1.el8.x86_64

3 インストール方法

xzパッケージをインストールします。

[root@server ~]# dnf -y install xz

xzコマンドの版数を確認します。

[root@server ~]# xz -V
xz (XZ Utils) 5.2.4
liblzma 5.2.4

4 オプション一覧

オプション一覧は以下のとおりです。

[root@server ~]# xz -h
Usage: xz [OPTION]... [FILE]...
Compress or decompress FILEs in the .xz format.

  -z, --compress      force compression
  -d, --decompress    force decompression
  -t, --test          test compressed file integrity
  -l, --list          list information about .xz files
  -k, --keep          keep (don't delete) input files
  -f, --force         force overwrite of output file and (de)compress links
  -c, --stdout        write to standard output and don't delete input files
  -0 ... -9           compression preset; default is 6; take compressor *and*
                      decompressor memory usage into account before using 7-9!
  -e, --extreme       try to improve compression ratio by using more CPU time;
                      does not affect decompressor memory requirements
  -T, --threads=NUM   use at most NUM threads; the default is 1; set to 0
                      to use as many threads as there are processor cores
  -q, --quiet         suppress warnings; specify twice to suppress errors too
  -v, --verbose       be verbose; specify twice for even more verbose
  -h, --help          display this short help and exit
  -H, --long-help     display the long help (lists also the advanced options)
  -V, --version       display the version number and exit

With no FILE, or when FILE is -, read standard input.

Report bugs to <lasse.collin@tukaani.org> (in English or Finnish).
XZ Utils home page: <https://tukaani.org/xz/>

5 ファイルの圧縮、解凍をする方法

5.1 圧縮、解凍する方法

テスト用のファイルを作成します。ファイルサイズは100Mとします。なお、fallocateコマンドの使い方は、ファイルの作り方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# fallocate -l 100M test1.dat

作成したファイルを確認します。ファイルサイズが100Mであることがわかります。

[root@server ~]# ls -lh test1.dat
-rw-r--r--. 1 root root 100M  3月 24 21:13 test1.dat

ファイルを圧縮します。

[root@server ~]# xz test1.dat

ファイルサイズを確認します。圧縮後のファイルサイズが16kになったことがわかります。なお、圧縮前のファイルは削除されます。圧縮前のファイルを残すためには、-kオプション(後述)を使用します。

[root@server ~]# ls -lh test1.dat.xz
-rw-r--r--. 1 root root 16K  3月 24 21:13 test1.dat.xz

圧縮したファイルを元に戻します。

[root@server ~]# xz -d test1.dat.xz

ファイルサイズを確認します。ファイルサイズが元に戻ったことがわかります。

[root@server ~]# ls -lh test1.dat
-rw-r--r--. 1 root root 100M  3月 24 21:13 test1.dat

5.2 複数のファイルを一度で圧縮する方法

テスト用のファイルを2つ作成します。

[root@server ~]# fallocate -l 100M test1.dat
[root@server ~]# fallocate -l 100M test2.dat

各々のファイルをそれぞれ圧縮します。

[root@server ~]# xz test1.dat test2.dat

ファイルを確認します。各圧縮ファイルがtest1.dat.xz、test2.dat.xzという名前で作成されたことがわかります。

[root@server ~]# ls -lh test*
-rw-r--r--. 1 root root 16K  3月 24 21:15 test1.dat.xz
-rw-r--r--. 1 root root 16K  3月 24 21:15 test2.dat.xz

5.3 複数ファイルを1つのファイルに圧縮する方法

圧縮するファイルを確認します。

[root@server ~]# ls test*
test1.dat  test2.dat

複数のファイルを1つのファイルに圧縮します。

[root@server ~]# xz -c test1.dat test2.dat > test.dat.xz

圧縮前後のファイルを確認します。

[root@server ~]# ls -l test*
-rw-r--r--. 1 root root     30776  3月 24 21:17 test.dat.xz
-rw-r--r--. 1 root root 104857600  3月 24 21:15 test1.dat
-rw-r--r--. 1 root root 104857600  3月 24 21:15 test2.dat

6 圧縮前/解凍前のファイルを残す方法(-k)

-kは圧縮前/解凍前のファイルを残すオプションです。

圧縮前のファイルを確認します。

[root@server ~]# ls -l test1.dat
-rw-r--r--. 1 root root 104857600  3月 24 19:44 test1.dat

ファイルを圧縮します。

[root@server ~]# xz -k test1.dat

ファイルを確認します。圧縮前のファイル(test1.dat)が残っていることがわかります。

[root@server ~]# ls -lh test1*
-rw-r--r--. 1 root root 100M  3月 24 19:44 test1.dat
-rw-r--r--. 1 root root  16K  3月 24 19:44 test1.dat.xz

7 同じ名前の圧縮ファイルを上書きする方法(-f)

-fは同じ名前の圧縮ファイルを上書きするオプションです。

圧縮後のファイル名と同じファイル名のファイルが存在するとファイルを圧縮することができません。

[root@server ~]# xz -k test.dat
xz: test.dat.xz: ファイルが存在します

-fオプションを指定すると、圧縮後のファイル名と同じファイル名のファイルが存在してもファイルを圧縮することができます。

[root@server ~]# xz -f -k test.dat
[root@server ~]#

8 圧縮/解凍の状況を表示する方法(-v)

-vは圧縮/解凍の状況を表示するオプションです。ここでは、圧縮時の状況を表示してみます。

圧縮前のファイルを確認します。

[root@server ~]# ls -l test1.dat
-rw-r--r--. 1 root root 104857600  3月 26 20:39 test1.dat

ファイルを圧縮すると、ファイル圧縮中の状況が表示されます。なお、以下の実行例は圧縮完了後のものです。ファイルサイズが小さかったので、圧縮中の状況を記載することができませんでした。

[root@server ~]# xz -v test1.dat
test1.dat (1/1)
  100 %        15.0 KiB / 100.0 MiB = 0.000    29 MiB/s       0:03

9 圧縮ファイルの情報を確認する方法(-l)

-lは圧縮ファイルの情報を表示するオプションです。

[root@server ~]# xz -l test1.dat.xz
Strms  Blocks   Compressed Uncompressed  Ratio  Check   Filename
    1       1     15.0 KiB    100.0 MiB  0.000  CRC64   test1.dat.xz

10 圧縮率を変更する方法(-0,..,-9)

-0,...,-9は、圧縮率のオプションです。デフォルトは-6です。-0は高速ですが圧縮率が最も低く、-9は低速ですが圧縮率が最も高くなります。

ファイルを作成します。

[root@server ~]# head -c 100m /dev/urandom > test.dat

作成したファイルを確認します。

[root@server ~]# ls -l test.dat
-rw-r--r--. 1 root root 104857600  3月 26 22:41 test.dat

11 複数スレッドで圧縮する方法(-T)

-Tはファイルを圧縮するスレッド数を指定するオプションです。ファイルサイズが大きいファイルを複数スレッドで分担して圧縮することで、圧縮にかかる時間を短縮することができます。

11.1 2つのスレッドで圧縮する方法(-T2)

2つのスレッドでファイルを圧縮してみます。

[root@server ~]# time xz -k -T2 test.dat

psコマンドでプロセスの状態を確認します。3つのスレッドが動作していることがわかります。なぜかスレッドが2つではなく3つ動作していました。なお、psコマンドの使い方は、psコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# ps -LC xz -o comm,pid,ppid,psr,wchan
COMMAND             PID    PPID PSR WCHAN
xz                10927    1921   1 -
xz                10927    1921   2 -
xz                10927    1921   0 -

圧縮にかかった時間を確認すると、約36秒であることがわかります。

[root@server ~]# time xz -k -T2 test.dat

real    0m36.512s
user    1m8.075s
sys     0m0.842s

11.2 できるだけ多くのスレッドで圧縮する方法(-T0)

できるだけ多くのスレッドでファイルを圧縮してみます。

[root@server ~]# time xz -k -T0 test.dat

psコマンドでプロセスの状態を確認します。5つのスレッドが動作していることがわかります。

[root@server ~]# ps -LC xz -o comm,pid,ppid,psr,wchan
COMMAND             PID    PPID PSR WCHAN
xz                11010    1921   3 -
xz                11010    1921   1 -
xz                11010    1921   2 -
xz                11010    1921   0 -
xz                11010    1921   3 -

圧縮にかかった時間を確認すると、約22秒であることがわかります。-T2を指定した時にくらべ、14秒ほど早く圧縮が完了していることがわかります。

[root@server ~]# time xz -k -T0 test.dat

real    0m22.431s
user    1m18.245s
sys     0m2.971s

12 圧縮ファイルの整合性をチェックする方法(-t)

-tは圧縮ファイルの整合性をチェックするオプションです。

ファイルの整合性をチェックします。以下の例では、エラー出力がないため、整合性に誤りが発生しなかったことを示しています。

[root@server ~]# xz -t test.dat.xz
[root@server ~]#