| tar(ソフトウェア) | |
|---|---|
| 原作者 | ベル研究所 |
| 開発者 | さまざまなオープンソースおよび商用開発者 |
| リリース | 1979年1月 (1979-01) |
| 安定版リリース | |
| 執筆 | pdtar、star、Plan 9、GNU : C |
| オペレーティング·システム | Unix、Unixライク、Plan 9、Microsoft Windows、IBM i |
| プラットフォーム | クロスプラットフォーム |
| タイプ | 指示 |
| ライセンス | BSD tar: BSD-2-Clause GNU tar: GPL-3.0-or-later pdtar:パブリックドメインPlan 9: MIT star: CDDL-1.0 |
| Webサイト | libarchive.org (BSD tar) gnu.org/software/tar (GNU tar) |
| リポジトリ | github.com/libarchive/libarchive ( BSD savannah.gnu.org/projects/tar ( |
| tar(ファイル形式) | |
|---|---|
| ファイル名拡張子 | .tar |
| インターネットメディアの 種類 | application/x-tar |
| 統一型識別子 (UTI) | public.tar-archive |
| 魔法の数字 | u s t a r \0 0 0 バイトオフセット257(POSIXバージョンの場合)
|
| 最新リリース | さまざまなさまざまな |
| フォーマットの種類 | アーカイブファイル |
| 圧縮 | なし |
| 標準 | POSIX.1以降、現在ではpaxの定義[ 7 ]に含まれています。 |
| オープンフォーマット? | はい |
tar はファイル形式であり、ファイルアーカイブプログラムでもあります。このプログラムは、複数のファイルをtar ファイル形式の単一のアーカイブファイルに結合します。元々は磁気テープコンピュータストレージ用に開発されたもので、ファイルシステムを持たないシーケンシャルI/Oデバイスのデータを読み書きするために使われていました。名前はフォーマットの説明「tape archive 」の略です。tar が読み書きするファイルは、ファイルシステムに保存されるとtarballと呼ばれることがよくあります。
tarballには、ファイル名、所有者、タイムスタンプ、パーミッション、ディレクトリ構成など、格納されているファイルのメタデータが含まれています。他のファイルと関連するメタデータを含むファイルとして、tarballはソフトウェアの配布やバックアップに役立ちます。
tar コマンドは1979 年 1 月にUnixに導入され、tp プログラム (さらにその前には "tap" が使われていた) に取って代わりました。[ 8 ]ファイル 構造はPOSIX.1-1988 [ 9 ]および後に POSIX.1-2001 [ 10 ]で標準化され、ほとんどの最新のファイル アーカイブ ユーティリティでサポートされている形式になりました。tar コマンドは POSIX.1-2001 で廃止され、ustar ファイル形式をサポートするpaxが採用されました。tar は少なくとも 1994 年以降、pax に取って代わられる予定でした。それにもかかわらず、今日の多くのオペレーティングシステムには、tar ファイル用のツールや、xz、gzip、bzip2などの圧縮および解凍ツールが含まれています。
tarコマンドはIBM iオペレーティングシステムに移植された。 [ 11 ]
BSD-tarは2018年からWindowsに搭載されており、[ 12 ] [ 13 ]他にもWindows用のサードパーティ製ツールがいくつか存在する。
多くの従来のテープドライブは可変長のデータブロックを読み書きするため、テープ上にブロック間の無駄なスペースがかなり残ります(テープが物理的に移動を開始および停止するため)。一部のテープドライブ(および生ディスク)は固定長のデータブロックのみをサポートしています。また、ファイルシステムやネットワークなどのメディアに書き込む場合、小さなブロックを多数書き込むよりも大きなブロックを1つ書き込む方が時間がかかります。そのため、tarコマンドはデータを多数の512Bブロックのレコードに書き込みます。ユーザーは、レコードあたりのブロック数であるブロッキング係数を指定できます。デフォルトは20で、10KiBのレコードが生成されます。[ 14 ]
tarファイル形式には、歴史的なものから現在のものまで、複数の種類があります。POSIX規格で規定されているtar形式はustarとpaxの2つです。規定されてはいませんが、現在でも使用されているのがGNU tar形式です。
tar アーカイブは一連のファイル オブジェクトで構成されており、そのため、tarballという一般的な用語が使われています。これは、 tarball が 表面に付着するあらゆる種類のオブジェクトを収集する様子を表しています。各ファイル オブジェクトにはファイル データが含まれており、512 バイトのヘッダーレコードが前に付きます。ファイル データは、長さが 512 バイトの倍数に切り上げられる以外は変更されずに書き込まれます。オリジナルの tar 実装ではパディング バイトの内容は気にせず、バッファ データを変更しませんでしたが、最近のほとんどの tar 実装では余分なスペースをゼロで埋めます。[ 15 ]アーカイブの末尾は、少なくとも 2 つの連続したゼロで埋められたレコードで示されます。(tar のレコード サイズの起源は、Unix ファイルシステム バージョン 7 で使用されている 512 バイトのディスク セクタにあるようです。) アーカイブの最後のブロックは、ゼロで完全な長さにパディングされます。
ファイルヘッダーレコードには、ファイルに関するメタデータが含まれています。異なるバイト順序を持つ様々なアーキテクチャ間での互換性を確保するため、ヘッダーレコードの情報はASCIIでエンコードされています。したがって、アーカイブ内のすべてのファイルがASCIIテキストファイルであり、ASCII名を持っている場合、そのアーカイブは実質的にASCIIテキストファイル(多くのNULL文字を含む)となります。
オリジナルのUnix tarフォーマットで定義されているフィールドは、以下の表に示されています。リンクインジケータ/ファイルタイプテーブルには、いくつかの最新の拡張機能が含まれています。フィールドが使用されていない場合は、NULLバイトで埋められます。ヘッダーは257バイトを使用し、その後NULLバイトでパディングされて512バイトのレコードになります。ヘッダーには、ファイル識別のための「マジックナンバー」はありません。
POSIX.1-1988以前(つまりv7)のtarヘッダー:
POSIX.1-1988以前のリンクインジケータフィールドには、以下の値が含まれます。
POSIX.1-1988より前のtarの実装の中には、ディレクトリ名に末尾のスラッシュ(/)を付けることでディレクトリを示すものがあった。
数値は、先頭にゼロを付けたASCII数字を使用して8進数としてエンコードされます。コンピュータのレジスタサイズとアドレス幅はほぼ常に2のべき乗であり、バイトはオクテットに標準化されているため、4ビットの16進表記が一般的に好まれる現代では、この選択は直感に反するように思えるかもしれませんが、Unixは元々 18ビットCPUと6ビット文字コードを使用するPDP-7向けに開発されたため、3ビットの8進表記の方が望ましいのです。
歴史的な理由から、末尾にはヌル文字またはスペース文字も使用する必要があります。そのため、ファイルサイズを格納するために 12 バイトが予約されていますが、格納できるのは 11 桁の 8 進数のみです。これにより、アーカイブ ファイルの最大ファイル サイズは 8ギガバイトになります。この制限を克服するために、2001 年に star は数値フィールドの最左端のバイトの最上位ビットを設定することで示される base-256 コーディングを導入しました。GNU -tar と BSD-tar はこのアイデアに倣いました。さらに、1988 年の最初の POSIX 標準より前のバージョンの tar では、ゼロの代わりにスペースで値をパディングしていました。
チェックサムは、ヘッダーレコードの符号なしバイト値の合計を計算し、8バイトのチェックサムバイトをASCIIスペース(10進数32)として扱います。これは、先頭にゼロ、NUL、スペースが続く6桁の8進数として格納されます。様々な実装がこの形式に準拠していません。また、一部の古いtar実装では、バイトを符号付きとして扱っていました。通常、実装ではチェックサムを両方の方法で計算し、符号付きまたは符号なしの合計が付属のチェックサムと一致すれば、チェックサムは正常とみなされます。
Unixファイルシステムでは、同じファイルに対して複数のリンク(名前)がサポートされています。tarアーカイブ内にそのようなファイルが複数存在する場合、最初のファイルのみが通常のファイルとしてアーカイブされ、残りはハードリンクとしてアーカイブされます。「リンク先ファイル名」フィールドには、最初のファイルの名前が設定されます。解凍時には、これらのハードリンクがファイルシステム上に再作成されます。
最新のtarプログラムのほとんどは、1988年のPOSIX IEEE P1003.1規格で導入されたUStar(Unix標準TAR [ 8 ] [ 16 ])形式でアーカイブを読み書きします。この規格では、追加のヘッダーフィールドが導入されました。古いtarプログラムは追加情報を無視し(部分的に名前が付けられたファイルを抽出する可能性があります)、新しいプログラムは「ustar」文字列の存在をテストして、新しい形式が使用されているかどうかを判断します。
UStarフォーマットでは、より長いファイル名を使用でき、各ファイルに関する追加情報も保存できます。ファイル名の最大サイズは255ですが、これは先行するパス「ファイル名プレフィックス」とファイル名自体に分割されるため、実際にはもっと小さくできます。[ 17 ]
タイプフラグフィールドには、以下の値を指定できます。
POSIX.1-1988 のベンダー固有の拡張機能は、リンクフラグ値「A」~「Z」を使用しており、ベンダーによって意味が部分的に異なるため、時代遅れとみなされ、ベンダータグも含む POSIX.1-2001 の拡張機能に置き換えられています。
タイプ「7」(連続ファイル)は、POSIX 標準では正式に予約済みとしてマークされていますが、ディスク上に連続して割り当てられるべきファイルを示すことを意図していました。このようなファイルを明示的に作成することをサポートするオペレーティングシステムは少なく、そのためほとんどの tar プログラムではサポートされておらず、タイプ 7 のファイルはタイプ 0(通常)ファイルとして扱われます。例外として、MASSCOMP RTU(リアルタイム Unix)オペレーティングシステム上で実行される古いバージョンの GNU tar では、open() 関数に O_CTG フラグを追加して連続ファイルを要求することができました。ただし、このサポートは GNU tar バージョン 1.24 以降では削除されています。
1997年、Sun Microsystemsはtarフォーマットに拡張機能を追加する方法を提案しました。この方法は後にPOSIX.1-2001規格に採用されました。このフォーマットは拡張tarフォーマットまたはpaxフォーマットとして知られています。新しいtarフォーマットでは、ベンダータグ付きのベンダー固有の拡張機能をユーザーが追加できます。POSIX規格では、以下のタグが定義されています。
2001年、Starプログラムは新しいフォーマットをサポートする最初のtarプログラムとなった。2004年にはGNU tarが新しいフォーマットをサポートしたが[ 18 ] 、 tarプログラムからのデフォルトの出力としてはまだ書き出していない[ 19 ] 。
pax フォーマットは、UStar フォーマットを読み取ることができるすべての実装が pax フォーマットも読み取れるように設計されています。唯一の例外は、長いファイル名などの拡張機能を使用するファイルです。互換性のために、これらは通常ディレクトリの下の特殊ファイルxまたはタイプファイルとして tar ファイルにエンコードされます。[ 20 ] : exthdr.name pax をサポートする実装はこの情報を使用しますが、 7-Zipのようなサポートしていない実装は追加ファイルとして処理します。[ 21 ]gPaxHeaders.XXXX
アーカイブの作成と展開に加えて、さまざまなアーカイブユーティリティの機能は異なります。たとえば、展開する圧縮tarアーカイブの形式を自動的に検出してユーザーが指定する必要がないようにしたり、指定した日付以降に変更されたファイルのみを追加するようにユーザーが制限できるようにしたりする実装もあります。[ 22 ] [ 23 ]
tar [-オプション] <tarアーカイブの名前> [アーカイブに追加するファイルまたはディレクトリ] 基本オプション:
-c, --create— 新しいアーカイブを作成する。-a, --auto-compress さらに、アーカイブのファイル名拡張子によって自動的に決定される圧縮ツールを使用してアーカイブを圧縮します。アーカイブ名がで終わる場合はgzip*.tar.gzを使用し、の場合はxz を使用し、Zstandardの場合はなどを使用します。*.tar.xz*.tar.zst-r, --append— アーカイブの末尾にファイルを追加する。-x, --extract, --get— アーカイブからファイルを抽出する。-f, --file— アーカイブ名を指定します。-t, --list— アーカイブ内のファイルとフォルダの一覧を表示します。-v, --verbose処理済みファイルのリストを表示します。archive.tarファイルREADME.txtとディレクトリからアーカイブファイルを作成しますsrc。
$ tar -cvf archive.tar README.txt src の内容をarchive.tar現在のディレクトリに展開します。
$ tar -xvf archive.tar archive.tar.gzファイルREADME.txtとディレクトリからアーカイブファイルを作成し、 gzipsrcで圧縮します。
$ tar -cavf archive.tar.gz README.txt src の内容をarchive.tar.gz現在のディレクトリに展開します。
$ tar -xvf archive.tar.gz tarpipeとは、アーカイブを標準出力に書き込み、それを別のディレクトリで動作する別のtarプロセスに標準入力としてパイプで渡し、そこで解凍する手法です。このプロセスは、すべての特殊ファイルを含むソースディレクトリツリー全体をコピーします。例:
$ tar cf - srcdir | tar x -C destdir tar形式は、オープンソースソフトウェアの配布において引き続き広く使用されています。*NIXディストリビューションでは、さまざまなソースパッケージやバイナリパッケージの配布メカニズムでtar形式が使用されており、ほとんどのソフトウェアソースコードは圧縮されたtarアーカイブで提供されています。
オリジナルのtarフォーマットはUnixの初期の頃に作成され、現在広く使用されているにもかかわらず、その設計上の特徴の多くは時代遅れと考えられています。[ 24 ]
tarの欠点を補うために、他のフォーマットも作成されている。
フィールドサイズの制約により、元のtar形式では100文字を超えるファイルパスやファイル名を保存することができませんでした。
既存のtarユーティリティによる可読性を維持しながらこの問題を克服するために、GNU tarは100文字を超えるファイルパスと名前を、@LongLinkこの機能を認識していないtarユーティリティが通常のファイルとして認識するエントリに格納します。[ 25 ]同様に、PAXフォーマットはPaxHeadersエントリを使用します。[ 26 ]
古いtarの実装の多くは、拡張属性(xattrs)やアクセス制御リスト(ACL)を記録したり復元したりしません。2001年にStarはPOSIX.1-2001 pax用の独自のタグを通じてACLと拡張属性のサポートを導入しました。bsdtarはstar拡張機能を使用してACLをサポートしています。[ 27 ] GNU tarのより新しいバージョンは、star拡張機能を再実装してLinux拡張属性をサポートしています。[ 28 ] BSD tarのファイルタイプマニュアルtar(5)では、いくつかの拡張機能がレビューされています。[ 27 ]
ハッカーのスラングでtarbombとは、tarballが展開した出力用に特別に作成したディレクトリではなく、展開時に現在のディレクトリまたは他の既存のディレクトリに内容を書き込む多数の項目を含むtarballのことです。[ 29 ]これは、ディレクトリの他の内容に混在する多数のファイルを特定して削除しなければならないユーザーにとって、せいぜい不便なだけです。このような行為は、アーカイブの作成者によるマナー違反とみなされます。
関連する問題として、 tar ファイルを作成する際に絶対パスや親ディレクトリ参照を使用することが挙げられます。このようなアーカイブから抽出されたファイルは、作業ディレクトリ外の通常とは異なる場所に作成されることが多く、tarbomb のように既存のファイルを上書きする可能性があります。ただし、FreeBSD および GNU tar の最新バージョンでは、フラグ-Pまたはオプションで明示的に許可しない限り、デフォルトでは絶対パスや親ディレクトリ参照を作成または抽出しません。多くのオペレーティングシステムで利用可能で、 Mac OS X--absolute-names v10.6のデフォルトの tar 実装である bsdtar プログラムも、親ディレクトリ参照やシンボリックリンクをたどりません。[ 30 ]
ユーザーがセキュリティ対策が施されていない非常に古いtarファイルしか持っていない場合、まずコマンドを使用してtarファイルを調べtar tf archive.tar、内容を一覧表示し、問題のあるファイルを後で除外することで、これらの問題を軽減できます。これらのコマンドはファイルを抽出しませんが、アーカイブ内のすべてのファイルの名前を表示します。問題のあるファイルがある場合は、ユーザーは新しい空のディレクトリを作成してアーカイブをそこに抽出するか、tarファイルを完全に避けることができます。ほとんどのグラフィカルツールは、抽出する前にアーカイブの内容を表示できます。Vimはtarアーカイブを開いてその内容を表示できます。GNU Emacsもtarアーカイブを開いてdiredバッファにその内容を表示できます。
tar形式は、テープバックアップデバイスへのストリーミング用に、ファイルとそのプロパティを一元的に管理するインデックスや目次を持たないように設計されています。代わりに、各ファイルのメタデータ(名前、サイズ、タイムスタンプなど)は、各ファイルの前のヘッダーに格納されます。アーカイブは、ファイルを一覧表示したり抽出したりするには、順次読み込む必要があります。大規模なtarアーカイブの場合、これはパフォーマンスの低下を招くため、tarアーカイブは個々のファイルへのランダムアクセスが頻繁に必要となる状況には適していません。
その結果、この設計により、tarアーカイブはデジタルファイルと物理テープの両方の形式で、欠落部分による損傷に対して耐性を持つようになります。両端に欠落部分がある切り詰められたtarファイルでも、欠落していない最初のtarヘッダーから開始することで、ファイルパス、ファイル名、メタデータなどの欠落していない部分を復元できます。[ 31 ]
適切に構成されたtarファイルが、シーク可能な(つまり、効率的なランダム読み取りが可能な)媒体に保存されている場合、tarプログラムは、ファイルヘッダーの「size」フィールドに従ってファイル読み取りをスキップすることにより、比較的迅速に(ファイル数に対して線形時間で)ファイルを検索できます。これが-nGNU tarのオプションの基礎となっています。tarファイルが全体として圧縮されている場合、圧縮形式は通常シーク不可能であるため、この最適化は実行されません。[ 32 ]シーク可能性を維持するには、tarファイルは各アーカイブの末尾にある末尾のゼロブロックを削除して適切に連結する必要もあります。[ 33 ]
tar形式のもう一つの問題点は、アーカイブ内の複数の(場合によっては異なる)ファイルに、同一のパスとファイル名を持たせることができる点です。このようなアーカイブを展開する際、通常は後から作成されたファイルが前のファイルを上書きしてしまいます。
これにより、明示的ではない(目に見えない)tarbombが作成される可能性があります。これは技術的には絶対パスを持つファイルや親ディレクトリを参照するファイルは含まれていませんが、現在のディレクトリ外のファイルの上書きを引き起こします(たとえば、アーカイブには同じパスとファイル名を持つ2つのファイルが含まれている場合があります。1つ目は現在のディレクトリ外の場所へのシンボリックリンクで、2つ目は通常のファイルです。このようなアーカイブを一部のtar実装で展開すると、シンボリックリンクが指す場所に書き込みが行われる可能性があります)。
歴史的に、多くのシステムがtarを実装しており、多くの汎用ファイルアーカイバは少なくとも部分的にtarをサポートしています(多くの場合、以下の実装のいずれかを使用しています)。tarの歴史は、いわゆる「tar戦争」として知られる非互換性の物語です。ほとんどのtar実装は、cpioとpaxの読み取りと作成も可能です(後者は実際にはPOSIX -2001拡張機能を備えたtarフォーマットです)。
主な実装例(発生順):
tarアーカイブファイルは通常、ファイル拡張子が.tarになります(例:somefile.tar)。
tarアーカイブファイルには、そのファイルに含まれるファイルの非圧縮バイトストリームが格納されています。アーカイブを圧縮するには、gzip、bzip2、xz、lzip、lzma、zstd、compressなど、さまざまな圧縮プログラムが利用できます。これらのプログラムはtarアーカイブ全体を圧縮します。通常、圧縮されたアーカイブのファイル名は、アーカイブファイル名にフォーマット固有の圧縮ツールの接尾辞を付加することで付けられます。たとえば、tarアーカイブarchive.tarは、 gzipで圧縮されるとarchive.tar.gzという名前になります。
BSD 版やGNU版の tarのような一般的な tar プログラムは、作成時または展開時にアーカイブ ファイルを圧縮または解凍するためのコマンドライン オプションZ (compress)、z (gzip)、j (bzip2) をサポートしています。比較的最近追加されたオプションには、 --lzma ( LZMA )、--lzop ( lzop )、--xzまたはJ ( xz )、--lzip (lzip)、--zstd があります。[ 39 ]サポートされているファイル名拡張子が使用されている場合、これらの形式の解凍は自動的に処理され、オプション--auto-compress (短縮形-a ) が該当するバージョンの GNU tar に渡された場合、同じファイル名拡張子を使用して圧縮が自動的に処理されます。[ 17 ] BSD tar は、ファイル名ではなく内部のデータを使用して、さらに広範囲の圧縮ツール ( lrzip、lz4 ) を検出します。 [ 40 ]認識されない形式は、パイプを使用して手動で圧縮または解凍する必要があります。
MS-DOS 8.3のファイル名制限により、圧縮tarアーカイブの命名規則が新たに設けられました。しかし、FATが長いファイル名をサポートするようになったことで、この慣習は衰退しています。

拡張属性は、ファイル内部プロパティにこのデータを保存したくない、または保存できない多くのケースで、ファイルメタデータ(例:
author="John Smith", subject="country landscape"
)を保存するのに非常に役立ちます。
tail --bytes=+100000 "intact archive.tar" >>"missing beginning.tar"を使用して見つけることができます。を使用して復元します。スペースのないファイル名には引用符は必要ありません。dd if="missing beginning.tar" of=recovered.tar ibs=[bytes until next header which starts with file path and name] skip=1