序章

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

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

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

圧縮とアーカイブの基本

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

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

非可逆および可逆圧縮

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

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

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

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

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

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

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

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

アーカイブの背景

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

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

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

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

Linuxには、さまざまな圧縮ツールがあります。 彼らはそれぞれ特定の分野で犠牲を払い、それぞれに特定の強みがあります。 他の方法よりもはるかに柔軟性があるため、tarで機能する圧縮スキームに偏ります。

gzip圧縮

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

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

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

gzip -c test > test.gz

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

gzip -9 compressme

ファイルを解凍するには、-dフラグをgzipに渡すだけです(gunzipのようなエイリアスもありますが、同じことを行います)。

gzip -d test.gz

bzip2圧縮

もう1つの一般的な圧縮形式とツールは、bzip2です。 gzipよりもいくらか現代的ですが、1996年に最初に導入されましたが、bzip2は、gzipの従来の代替手段として非常に多く実装されています。

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

ほとんどのユーザーにとって最も重要なトレードオフは、圧縮時間が長くなる代わりに圧縮が大きくなることです。 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年に最初にリリースされ、それ以来着実に支持されています。

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

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

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フラグがあります。 -6フラグはデフォルトであり、ほとんどのユースケースの適切な中間点です。 より大きなファイルの圧縮を本当にプッシュする必要がある場合は、より高いフラグを使用できます。これには非常に長い時間がかかる場合がありますが、ある程度の利点が見られる場合があります。

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

xz -e -9 large_file

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

ファイルを解凍するには、-dフラグを再度渡します。

xz -d large_file.xz

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

圧縮を伴うTarアーカイブの使用

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

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

gzipでtarを使用する

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

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

これにより、「directory1」というディレクトリからアーカイブ(-c)が作成されます。 詳細な出力を作成し、結果のアーカイブを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でアーカイブを使用するには、gzip固有の-zフラグを-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

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

結論

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

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

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