Linuxの圧縮方法はWindowsやMacとやり方が違ってくる。正確に言うと、同じようにGUIでも可能だが、コマンドで圧縮することの方が多いだろう。
このページではLinuxの圧縮方法についてまとめてお伝えしよう。
目次
Linuxの圧縮
tarファイル:アーカイブ
Linuxに触れていると自然と「tar.gz」といった拡張子を目にすることがあるはずだ。これはLinuxのファイル圧縮形式の一つで、「アーカイブ」とも呼ばれる。
アーカイブは複数のファイルを一つにまとめるという作業だ。他にも形式として「tar.bz2」や「tar.xz」などが存在している。
現在最も圧縮率が高いのは「tar.xz」となっている。インターネット上で活動しているプロジェクト「The Linux Kernel Archives」でも使用されている。どの形式でもLinux上では「tar xvf」とするとアーカイブを解凍出来る。実際に目にするのは「linux-4.11.tar.xz」といった感じのファイル名となる。
なぜ拡張子が2つあるか?
ここでなぜ拡張子が2つ重なっているのか、疑問に思うかもしれない。
その理由は、ファイルなどをまとめるコマンドと、圧縮を実行するコマンドがそれぞれ用意されており、「tarコマンド」と「圧縮形式のコマンド」をセットで使用しているからだ。
「なぜ2つに分けているのか?」と疑問に思うかもしれない。
Unix哲学
そのあたりはUnix哲学と効率性の二つの理由があげられる。Unix哲学では「ひとつの事をうまく実行するプログラムを書くこと」という名言がある。
純粋に圧縮しないアーカイブのコマンドを用意して、圧縮するコマンドと別にしたほうが汎用的であり、各々やることがシンプルになるからだ。
しかしそうなると「一度tarを作成してからコマンドを再度たたいてgzやbz2、xzとして圧縮しなければならない」ので、大変面倒くさい。
コンピュータを使用しているエンジニアは基本的に面倒くさがりなので、tarコマンドから圧縮形式を指定して一度にアーカイブと圧縮を実行可能にしているので安心していただきたい。
実際にtarで圧縮アーカイブを作成および解凍してみよう。
Linuxの圧縮アーカイブを作成してみる
アーカイブを作成する場合は、オプションでどの圧縮形式を利用するかを指定する必要があるので注意しよう。
「zがgzip」「jがbzip2」「Jがxz」となっている。
gzip形式のtarアーカイブを作成する。
書式
tar zcvf <アーカイブの名前>.tar.gz <アーカイブしたいディレクトリやファイル名>
$ tar zcvf testarc.tar.gz testdir-gzip
bzip2形式のtarアーカイブを作成する。
書式
tar jcvf <アーカイブの名前>.tar.bz2 <アーカイブしたいディレクトリやファイル名>
$ tar jcvf testarc.tar.bz2 testdir-bzip2
xz形式のtarアーカイブを作成する。
書式
tar Jcvf <アーカイブの名前>.tar.xz <アーカイブしたいディレクトリやファイル名>
$ tar Jcvf testarc.tar.xz testdir-xz
アーカイブを解凍してみる
それぞれの形式のアーカイブを解凍展開するには以下のコマンドオプションを使用すればよい。Linuxの場合というより厳密にはGNUのユーティリティを使用している場合は、どの圧縮形式でも「xvf」オプションを指定すれば解凍出来る。なので日常範囲で使うのであれば「tar xvf <アーカイブ名>」とすれば大概は問題ない。
書式
tar xvf <アーカイブ名>
$ tar xvf testarc.tar.xz
アーカイブの内容を確認したいとき
解凍時と同じく圧縮形式は自動判別してくれるのでとくに考えずにオプションを「tf」とすればどの圧縮形式でも中身を確認できる
書式
tar tf <アーカイブ名>
$ tar tf testarc.tar.xz
zcat、bzcat、xzcatなどを使用
よくある事例カーネルのパッチ適応
実は、tarを使用しなくてもアーカイブは可能となっている。
Linuxのパッチなどはtarを使用していない。その場合zcat、bzcat、xzcatなどを使用すると中身の確認やパイプを経由したパッチ作業が可能となっている。
それぞれzcat、bzcat、xzcatなどを使用すると、パイプに結果を引き渡しpatchコマンドでパッチを適応するなどといった動作も可能となっている。
一例をあげるとソースコードからカーネルのバージョンアップするときのパッチ作業で以下のようなコマンドを叩くことになる。
$ cd /usr/src/linux
$ xzcat ../patch-4.10.13.xz | patch -Np1
ひとつ上のディレクトリにある「patch-4.10.13.xz」を「xzcat」を使用して参照しパイプでその結果をpatchコマンドへ引渡し、適応している。この例では対象のアーカイブが「xz」なので「xzcat」を使用している。それぞれ「gzip」はzcat」 「bzip2はbzcat」「xzはxzcat」に対応しており、上の例と同じことができるようになっている。
詳しいオプションはこちらを参照
tarのオプションを詳しくまとめている下記も参考に。
まとめ
このページではLinuxの圧縮方法についてまとめてお伝えしてきた。はじめは混乱するかもしれないが慣れればさほど難しくない。
実際にコマンドを叩いて、理解を深めていただければと思う。