序章

コンピュータ上のファイルとディレクトリを圧縮したい理由はたくさんあります。 より直接的な利点のいくつかは、ディスクスペースを節約し、ネットワーク通信に使用する帯域幅を少なくすることです。

このガイドでは、データを圧縮するさまざまな方法のいくつかについて説明し、さまざまな方法のトレードオフのいくつかについて少し説明します。 また、圧縮ツールをより柔軟にするアーカイブなど、関連するいくつかの操作についても触れます。

これらのツールはUbuntu12.04VPSインスタンスでデモを行いますが、最新のLinuxディストリビューションでもほぼ同じように動作します。

圧縮とアーカイブの基本

使用する実際のツールにジャンプする前に、用語を定義し、圧縮およびアーカイブ手法のさまざまな特性について説明する必要があります。

Compression は、さまざまなアルゴリズムと数学的計算を使用して、ディスク上のファイルのサイズを縮小する方法です。 ファイルは、内容が異なっていても、一般的な構造をある程度予測できるように特定の方法でフォーマットされています。 さらに、コンテンツ自体が繰り返されることがよくあります。 これらの領域は両方とも、圧縮技術を採用する機会を表しています。

非可逆および可逆圧縮

コンピュータとファイルタイプに関して圧縮について説明する場合、同じ用語は、コンテキストに応じていくつかの異なることを意味する場合があります。 たとえば、MP3音楽ファイルを見てみましょう。 MP3は、大きなソース音楽ファイルから小さなファイルを作成するために使用される圧縮サウンドファイルです。

このタイプの圧縮は、このガイドで説明するものとは根本的に異なります。 これは、MP3は、オーディオファイルの波形を分析し、基本的に、オリジナルの精神または一般的なサウンドを維持しながら、永久に破棄できるデータを把握することによって作成されるためです。

これは、非可逆圧縮方式と呼ばれます。これは、MP3に変換されない元のファイルからの情報が実際に失われるためです。 後でMP3を同じソースファイルに戻すことはできません。

圧縮はユーザーには気付かない場合がありますが、元の関連情報のすべてが含まれているわけではありません。 圧縮率が高いほど、圧縮がオーディオの重要な部分に影響を及ぼし始めます。

この別の例は、JPEG画像です。 それらが圧縮されるほど、より重要なデータが失われ、より多くの圧縮が表示されます。 JPEG圧縮ユーティリティは、互いに十分に近い色のフィールドを見つけて、フィールド全体を単一の色に置き換えようとします。 使用される圧縮率が大きいほど、この方法でブランケットされる色の範囲が広くなります。

または、ロスレス圧縮方式では、元のファイルよりも小さいファイルが作成され、元のファイルの再構築に使用できます。 可逆圧縮は、このガイドで取り上げるタイプです。 このタイプの圧縮では、近似を使用してデータを圧縮せず、代わりに特定のアルゴリズムを使用してファイルの繰り返し部分を認識します。 これらを削除し、プレースホルダーに置き換えます。 それは続行され、パターンのその後の出現を同じプレースホルダーへの参照に置き換えます。

これにより、コンピュータはより少ないディスク容量に情報を保存できます。 このプロセスは、データのブロックを定義する変数のリストを作成し、後でそれらの変数を使用してプログラムに入力することと考えてください。 これらは実際には、すべての可逆圧縮技術が使用する2つの段階です。繰り返しの多い値を、簡単に参照できる小さい値にマップしてから、それらの各値の出現を参照で変更します。

さらに、最新のロスレス圧縮技術は適応型であると言われています。 これは、最初に入力ファイル全体を分析し、そこから参照置換の「辞書」を作成しないことを意味します。 代わりに、ファイルを分析し、実際に繰り返されるデータに基づいて辞書を書き直します。 プロセスが進むにつれて、辞書は徐々に効率的になります。

アーカイブの背景

データを「アーカイブ」するという考え方は、通常、データをバックアップし、多くの場合圧縮形式で安全な場所に保存することを意味します。 Linuxサーバーの「アーカイブ」は、一般的に少し異なる意味を持っています。 通常、それは tar ファイル。

これまで、サーバーからのデータは、シーケンシャルデータの保存に使用できる磁気テープデバイスであるテープアーカイブにバックアップされることがよくありました。 これは、一部の業界では依然として推奨されるバックアップ方法です。 これを効率的に行うために、 tar プログラムは、ファイルシステム内の多くのファイルを、完全なアクセス許可とメタデータを使用して1つのファイルとしてアドレス指定および操作できるように作成されました。 次に、アーカイブからファイルまたはファイルシステム全体を抽出できます。

基本的に、 tar fileは、関連ファイルのグループを配布、保存、バックアップ、および操作するための便利な方法を作成するファイル形式です。 より効率的な方法でデータを保存するためにアーカイブはアーカイブプロセス中に圧縮されることが多いため、このガイドでもアーカイブについて説明します。

さまざまな圧縮ツールの比較

Linuxには、さまざまな圧縮ツールがあります。 彼らはそれぞれ特定の分野で犠牲を払い、それぞれに特定の強みがあります。 で動作する圧縮スキームにバイアスをかけます tar 他の方法よりもはるかに柔軟だからです。

gzip圧縮

The gzip ツールは通常、Linuxマシンでデータを圧縮する「古典的な」方法として分類されます。 それは1992年以来存在しており、まだ開発中であり、まだ多くのことが進んでいます。

The gzip このツールは、「DEFLATE」と呼ばれる圧縮アルゴリズムを使用します。このアルゴリズムは、PNG画像形式、HTTP Webプロトコル、SSHセキュアシェルプロトコルなどの他の一般的なテクノロジーでも使用されています。

その主な利点の1つは、速度です。 特に各ユーティリティの最もコンパクトな圧縮形式を比較する場合は、競合する一部のテクノロジよりもはるかに高速でデータを圧縮および解凍できます。 また、圧縮および解凍中のメモリ使用量の点で非常にリソース効率が高く、最適な圧縮のために最適化するときに、より多くのメモリを必要としないようです。

もう1つの考慮事項は、互換性です。 以来 gzip はそのような古いツールであり、ほとんどすべてのLinuxシステムは、年齢に関係なく、データを処理するために利用できるツールを備えています。

その最大の欠点は、他のいくつかのオプションよりも完全にデータを圧縮しないことです。 迅速な圧縮と解凍をたくさん行う場合、これは適切な形式かもしれませんが、一度圧縮してファイルを保存する場合は、他のオプションが有利な場合があります。

通常、 gzip ファイルはで保存されます .gz 拡大。 あなたはでファイルを圧縮することができます gzip 次のようなコマンドを入力します。

gzipソースファイル

これにより、ファイルが圧縮され、名前が次のように変更されます。 sourcefile.gz システム上で。

ディレクトリ全体を再帰的に圧縮したい場合は、 -r このようなフラグ:

gzip -r directory1

これにより、ディレクトリが下に移動し、各ファイルが個別に圧縮されます。 これは通常は好ましくありません。ディレクトリをアーカイブし、結果のファイル全体を圧縮することで、より良い結果を得ることができます。これについては、後ほど説明します。

圧縮ファイルの詳細については、 -l フラグ、これはあなたにいくつかの統計を与えるでしょう:

gzip -l test.gz

         compressed        uncompressed  ratio uncompressed_name
               5133               14073  63.7% test

結果を別のユーティリティにパイプする必要がある場合は、次のように伝えることができます gzip を使用して圧縮ファイルを標準出力に送信するには -c 国旗。 この例では、ファイルに直接パイプするだけです。

gzip -c test > test.gz

1から9までの番号付きフラグを渡すことにより、圧縮の最適化を調整できます。 The -1 フラグ(およびそのエイリアス --fast)は最速ですが、完全な圧縮ではありません。 The -9 フラグ(およびそのエイリアス --best)は、最も遅く、最も完全な圧縮を表します。 デフォルトのオプションは -6、これは良い中間点です。

gzip -9 compressme

ファイルを解凍するには、単に -d フラグを立てる gzip (のようなエイリアスもあります gunzip、しかし彼らは同じことをします):

gzip -d test.gz

bzip2圧縮

別の一般的な圧縮形式とツールは bzip2. やや現代的ですが gzip、1996年に最初に導入され、 bzip2 従来の代替手段として非常に多く実装されています gzip.

その間 gzip 「DEFLATE」アルゴリズムに依存し、 bzip2 「Burrows-Wheelerアルゴリズム」と呼ばれるアルゴリズムの実装です。 この方法論の違いにより、一連の長所と短所がまったく異なります。 gzip.

ほとんどのユーザーにとって最も重要なトレードオフは、圧縮時間が長くなる代わりに圧縮が大きくなることです。 The bzip2 ツールは、よりもはるかにコンパクトなファイルを作成できます gzip、ただし、アルゴリズムがより複雑なため、これらの結果を達成するのにはるかに長い時間がかかります。

幸いなことに、解凍時間は圧縮時間ほど影響を受けないため、 bzip2 圧縮中に時間のペナルティが発生するだけで、妥当な時間で解凍できる小さなファイルを配布できるため、フォーマットします。 解凍時間はまだはるかに長いです gzip、ただし、圧縮操作ほど大きな影響はありません。

覚えておくべきもう1つのことは、メモリ要件が gzip. これはほとんどのマシンには影響しませんが、小さな組み込みデバイスでは、選択に影響する可能性があります。 オプションで渡すことができます -s フラグ。これにより、メモリ要件が約半分に削減されますが、圧縮率も低下します。

このメカニズムで圧縮されたファイルには、通常、 .bz2 ファイル拡張子。

を作成するには bzip2 圧縮ファイルの場合、次のように簡単に入力できます。

bzip2 afile

これにより、ファイルが圧縮され、「afile.bz2」という名前が付けられます。

上記のように、あなたは合格することができます -s ユーティリティがメモリ削減モードで動作する必要があることを示すフラグ。 これも圧縮されませんが、それほど多くのリソースを必要としません。

bzip2 -s afile

その間 bzip2 番号付きフラグを実装します。これは、それらが使用するものとは多少異なることを意味します。 gzip. ここでは、ユーティリティが圧縮を実装するために管理するブロックサイズを表しているため、これは、時間と圧縮サイズではなく、メモリ使用量と圧縮サイズの測定値です。 デフォルトの動作は -9 フラグ。これは、(比較的)メモリ使用量が多いが圧縮率が高いことを意味します。

bzip2 -1 file

解凍するには bzip 圧縮ファイル、あなたは渡すことができます -d 国旗:

bzip2 -d file.bz2

これにより、「file」と呼ばれる非圧縮ファイルが返されます。

xz圧縮

スペースの比較的新しい人は xz 圧縮メカニズム。 この圧縮ツールは2009年に最初にリリースされ、それ以来着実に支持されています。

The xz 圧縮ユーティリティは、LZMA2と呼ばれる圧縮アルゴリズムを利用します。 このアルゴリズムは、前の2つの例よりも圧縮率が高いため、限られたディスク領域にデータを保存する必要がある場合に最適な形式になります。 小さいファイルを作成します。

これもまた、同じ分野のほとんどでコストがかかります bzip2 苦しむ。 圧縮ファイルが xz 生成物は他のユーティリティよりも小さいため、圧縮を行うのに大幅に長くかかります。 たとえば、かなり大きなファイルに重い圧縮フラグがある場合、 gzip 約30分かかる場合があります bzip2 1分くらいかもしれませんが xz 約4〜5分かかる場合があります。

The xz 圧縮ツールもメモリ要件に影響を及ぼし、他の方法よりも桁違いに大きくなることもあります。 メモリが豊富なシステムを使用している場合、これは問題にならない可能性がありますが、これは覚えておくべき考慮事項です。

圧縮時間は望ましい時間よりもはるかに長い場合がありますが、実際には解凍時間は比較的良好です。 近づくことはありませんが gzip 解凍速度に関しては、通常、解凍時の速度はよりも大幅に高速ですbzip2. 解凍のためのメモリ使用量も天文学的なものではありません(ただし、それでも比較的高いです)。

この一連の長所と短所により、これはソフトウェアなどのファイルを配布するための優れた形式になります。 圧縮時間のペナルティを前もって食べる必要がありますが、ファイルの利用者にはかなりのメリットがあります。 彼らはすぐに解凍するコンパクトなファイルを持っています。

このフォーマットのもう1つの隠れた欠点は、その古さのために一部の古いシステムではサポートされない可能性があることです。 最大限の互換性を求めている場合は、他の場所を探す必要があるかもしれません。

この形式で作成されたファイルは、通常、 .xz.

ファイルを圧縮するには、引数なしでユーティリティを呼び出すだけです。

xzファイル

これにより、ファイルが処理され、「file.xz」というファイルが生成されます。

ファイルの圧縮に関する統計を一覧表示するには、 -l 圧縮ファイルのフラグ:

xz -l test.xz

Strms  Blocks   Compressed Uncompressed  Ratio  Check   Filename
    1       1      5,016 B     13.7 KiB  0.356  CRC64   test.xz

圧縮された出力を標準出力に送信する必要がある場合は、ユーティリティにそのことを通知できます。 -c 国旗。 ここでも、ファイルに直接戻すことができます。

xz -c test > test.xz

番号付きフラグについては、 xz 小さい数値を使用して、圧縮が速いことを示します。 実際、それは -0 最速のプリセットのフラグ。 The -6 フラグはデフォルトであり、ほとんどのユースケースの適切な中間点です。 より大きなファイルに対して本当に圧縮をプッシュする必要がある場合は、より高いフラグを使用できます。これには非常に長い時間がかかる場合がありますが、ある程度の利点が見られる場合があります。

さらに圧縮が必要で、時間やメモリ要件などを気にしない場合は、 -e フラグ。代替の「極端な」圧縮バリアントを使用します。 これにより、数値フラグを使用してパフォーマンスを変更することもできます。

xz -e -9 large_file

これには長い時間がかかり、最終的にはそれほど大きなメリットが見られない場合がありますが、その機能が必要な場合は、オプションを利用できます。

ファイルを解凍するには、 -d 再度フラグを立てます:

xz -d large_file.xz

これにより、データが「large_file」というファイルに解凍されます。

圧縮でのtarアーカイブの使用

個々の圧縮方法はそれ自体で便利ですが、ほとんどの場合、それらがペアになっているのがわかります。 tar ファイルのアーカイブを圧縮します。 これにより、ディレクトリ構造や権限などを保持できます。 まとめるファイルの

The tar コマンドは実際にはこの関係について非常に前向きです。 これには、アーカイブプロセスの完了後に、関連する圧縮ツールをすべて1つのステップで自動的に呼び出すために使用できるコマンドラインフラグが含まれています。

gzipでtarを使用する

を作成するには tar 次に圧縮されるアーカイブ gzip ユーティリティ、あなたは渡すことができます -z 使用することを示すフラグ gzip アーカイブの上での圧縮。 実際、 tar フラグは実際には先頭の「-」ほとんどのツールのように。 圧縮されたアーカイブを実現するための一般的なイディオムは次のとおりです。

tarczvf圧縮された.tar.gzディレクトリ1

これにより、アーカイブが作成されます(-c)「directory1」というディレクトリから。 それは詳細な出力を作成し、結果のアーカイブを次のように圧縮します gzip、「compressed.tar.gz」(gzipで圧縮されたtarファイル)というファイルに出力します。

ファイルが作成されたら、を使用して内部を覗くことができます -t 作成フラグの代わりにフラグ:

tar tzvf compressed.tar.gz

drwxr-xr-x demouser/demouser 0 2014-03-19 18:31 directory1/
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:31 directory1/httpd.conf.orig
-rw-r--r-- demouser/demouser 2295 2014-03-19 18:31 directory1/nginx.conf.orig
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:21 directory1/httpd.conf

後でファイルを解凍してアーカイブを展開するには、 -x 国旗:

tar xzvf compressed.tar.gz

これにより、現在のディレクトリにディレクトリ構造が再作成されます。

bzip2でtarを使用する

でアーカイブを使用するには bzip2、あなたは交換することができます -z フラグ、 gzip-特定の、 -j 国旗。

これは、zip形式のアーカイブ作成コマンドが次のように変更されることを意味します。

tar cjvf bzipcompressed .tar.bz2 directory2

繰り返しになりますが、アーカイブに含まれているファイルを確認するには、 -t 国旗:

tar tjvf bzipcompressed.tar.bz2

drwxr-xr-x demouser/demouser 0 2014-03-19 18:31 directory2/
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:31 directory2/httpd.conf.orig
-rw-r--r-- demouser/demouser 2295 2014-03-19 18:31 directory2/nginx.conf.orig
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:21 directory2/httpd.conf

次のように入力すると、ファイルとディレクトリ構造を現在のディレクトリに抽出できます。

tar xjvf bzipcompressed.tar.bz2

xzでtarを使用する

リモートで最近のバージョン tar に同様の機能を追加しました xz 圧縮。 これらは、を使用してまったく同じ形式に従います -J 国旗。

tar cJvf xzcompressed .tar.xz directory3

情報を表示するには、同じメカニズムを使用します。

tar tJvf xzcompressed.tar.xz

drwxr-xr-x demouser/demouser 0 2014-03-19 18:31 directory3/
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:31 directory3/httpd.conf.orig
-rw-r--r-- demouser/demouser 2295 2014-03-19 18:31 directory3/nginx.conf.orig
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:21 directory3/httpd.conf

同じパターンに従って抽出します。

tar xJvf xzcompressed.tar.xz

これにより、完全なディレクトリ構造がそのまま元に戻ります。

結論

うまくいけば、さまざまな状況でどの圧縮方法を優先するかについて、十分な情報に基づいて決定を下すのに十分な情報が得られます。 この投稿で説明したすべての圧縮スキームには、状況の特定の要件に応じて非常に魅力的な長所があります。

各ソリューションに固有のパフォーマンスの欠点と互換性の問題に注意することが重要です。 これらの懸念にどの程度の重みを与えるかは、操作しているマシンとサポートする必要のあるクライアントの種類に完全に依存します。 最近のほとんどのマシンは、これらの詳細にあまり注意を払う必要はありませんが、古いマシンと対話するときに圧縮タイプを盲目的に実装すると、問題が発生する可能性があります。

ジャスティン・エリングウッド