TARとは何か:歴史・仕様・使い方・安全対策を徹底解説
はじめに
TAR(Tape ARchive)は、UNIX系OSで長く使われてきたアーカイブ形式およびそれを扱うツールの総称です。もともとは磁気テープにファイルを連続的に保存するために設計されましたが、現在では圧縮ツールと組み合わせて配布用のパッケージやバックアップに広く用いられています。本稿では、TARの歴史、フォーマット仕様、代表的な実装、運用上の注意点、安全対策、再現可能なアーカイブ作成まで、実務に役立つ深掘りを行います。
歴史と進化
TARは1979年ごろにUNIXで標準化され、その後さまざまな派生が出ました。初期のv7 tarから、ファイル名やメタデータを拡張したustar(POSIX.1-1988/2001の一部)、さらにPAX形式(拡張ヘッダを使って任意長の名前や追加属性を保存可能)へと進化しています。実装面ではGNU tarがデファクトスタンダードとなり、libarchiveを利用したbsdtarなども普及しています。
基本的なフォーマット(アーカイブの中身)
tarアーカイブは512バイトを単位としたブロック列で構成されます。各ファイルはヘッダブロック(512バイト)に続いて、ファイルデータが続き、データ部分は512バイト境界でパディングされます。ヘッダは以下のような主要フィールドを含みます。
- name(100バイト):ファイル名
- mode(8バイト):ファイルモード(パーミッション)
- uid/gid(それぞれ8バイト):数値の所有者・グループ
- size(12バイト):ファイルサイズ(バイト、オクタル表記)
- mtime(12バイト):最終変更時刻(オクタル)
- chksum(8バイト):ヘッダチェックサム(オクタル)
- typeflag(1バイト):ファイル種別(通常ファイル、シンボリックリンク、ディレクトリ等)
- linkname(100バイト):リンク先(シンボリック/ハードリンク向け)
- magic/version:ustar識別子とバージョン(例:"ustar\0" と "00")
- uname/gname:所有者とグループの名前
- prefix:長いパスを分割して格納するためのフィールド(ustarで使用)
この固定長ヘッダ構造のため、従来のtarではファイル名長やサイズ表現に制約がありました。PAXやGNU拡張はこれらを緩和します。
主要なフォーマットと拡張
- v7 tar:古典的な実装。制約が多い。
- ustar(POSIX): 名前をprefixで分割して最大255文字程度のパスをサポート。標準化により互換性向上。
- PAX(POSIX.1-2001の"pax"形式):拡張ヘッダを使い、任意長の名前、拡張属性、ACL、xattrs、正確なタイムスタンプなどを保存可能。
- GNU tar拡張:長い名前用の特別エントリ(typeflag 'L' / 'K' 等)、スパースファイル対応、パッチ形式(--listed-incremental)など実用的拡張を提供。
圧縮と組み合わせ
tar自体は圧縮を行いません。そのため圧縮コマンドと組み合わせて使うのが一般的です。
- .tar.gz / .tgz — gzip(gzip / pigz:並列gzip)
- .tar.bz2 — bzip2(高圧縮だが処理が遅め)
- .tar.xz — xz(高圧縮、CPU負荷が高い。pxzで並列化可)
- .tar.zst / .tar.zstd — zstd(高速で良好な圧縮比、最近の選択肢)
GNU tarはコマンドラインで -z(gzip)、-j(bzip2)、-J(xz)を使えます。--use-compress-program オプションで pigz や zstd を指定すると並列化や別圧縮アルゴリズムが利用できます。
代表的なコマンド例(抜粋)
ここではWordPressなどへ貼る際にそのまま表示されるよう簡単に示します(環境によってオプションが若干異なる場合があります)。
作成: tar -cf archive.tar /path/to/dir 作成+gzip圧縮: tar -czf archive.tar.gz /path/to/dir 展開: tar -xf archive.tar -C /target/dir 一覧: tar -tf archive.tar パイプで圧縮: tar -cf - /path | pigz -9 > archive.tar.gz
高度な機能
- 増分バックアップ:GNU tarの--listed-incremental=SNAPSHOTはスナップショットファイルを使い、前回との差分のみをアーカイブできる。ただし実装依存で完全な互換性は期待できない。
- スパースファイル:大きな空き領域を効率的に保存するために、スパース表現を行うことが可能(実装による互換性に注意)。
- 拡張属性・ACL・SELinuxラベル:PAXやGNU拡張で保存できるが、抽出側のファイルシステムやtar実装が対応している必要がある。
- 署名と検証:tar自体に署名機構はないため、GPGでアーカイブ全体を署名する、あるいはアーカイブ内にチェックサム/メタ情報を含める方法が用いられる。
セキュリティ上の注意点
tarを扱う際は、特に外部から受け取ったアーカイブに対して慎重になる必要があります。主なリスクと対策は以下です。
- パス・トラバーサル("../")や絶対パスによる上書き:アーカイブ内に悪意あるパスがあると、重要なファイルを書き換えられる可能性があります。対策としては、展開前に tar -tf で内容を確認し、空のディレクトリに展開する、--strip-components を用いて階層を削る、あるいはbsdtar/libarchiveなど安全に扱うライブラリを利用することが有効です。
- ルートでの展開は避ける:権限の高いユーザーで展開すると被害が甚大になります。可能なら一般ユーザー権限で作業してください。
- 不正な特殊ファイルの作成:デバイスファイルやソケットなどが含まれていると危険です。--no-same-owner, --no-devices 等のオプションで制限できます(実装によりオプション名が異なる)。
- 信頼性の確認:配布物は署名(GPGなど)で検証する。TLS/HTTPSで転送することも基本です。
互換性と運用上の落とし穴
tarフォーマットには多数の拡張があり、生成側と展開側で実装やオプションが異なると期待通りに復元できないことがあります。例として、長いファイル名やxattr/ACLの扱い、PAX拡張の解釈差異などが問題になります。運用では次を心がけてください。
- 配布先の環境を想定してアーカイブ形式を決める(たとえば古いシステム向けにはustar形式に制限する)。
- ドキュメント化:生成コマンドや使用したオプションをREADMEに残す。
- 互換性テスト:主要なターゲット環境(GNU tar / bsdtar / Windows用ツールなど)で展開テストを行う。
再現可能な(Deterministic)アーカイブ作成
ソフトウェア配布でチェックサムやビルドの再現性が要求される場合、tarアーカイブを同一に再生成できることが重要です。一般的な手法:
- ファイルのソート: --sort=name で順序を安定化
- タイムスタンプの固定: --mtime='YYYY-MM-DD' または環境変数 SOURCE_DATE_EPOCH を活用
- 所有者・グループの固定: --owner=0 --group=0 --numeric-owner
- PAX拡張の制御: 余分なメタ情報を出さない設定
これらを組み合わせることで、異なるホスト上でも同一バイナリを作ることが可能になります。多くのパッケージビルドシステムや再現可能ビルドプロジェクトが同様の手法を採用しています。
代替と組み合わせ技術
- zip:Windowsなどクロスプラットフォームでの互換性が高い(圧縮とアーカイブを同時に扱う)。
- cpio:RPMパッケージや一部のインストール系で使用される。tarと用途が被るがフォーマットが異なる。
- dar、7z:高度な圧縮や分割、冗長化機能を持つ。
- libarchive/bsdtar:安全性や互換性の面で使いやすいライブラリ実装。
まとめ
TARはシンプルかつ柔軟なアーカイブ手段であり、圧縮ツールと組み合わせることで今なお主要な配布・バックアップ手段です。一方で、歴史的な設計から来る制約や実装差異、安全リスクもあるため、運用時はフォーマット選定、オプションの明示、事前確認、署名・検証を徹底することが重要です。再現可能なアーカイブを作るためのテクニックや、並列圧縮での性能改善といった実用的な知識も持っておくと便利です。
参考文献
- GNU tar マニュアル(英語)
- The Open Group: pax (POSIX)(英語)
- Wikipedia: Tar (computing)(英語)
- libarchive / bsdtar(英語)
- Reproducible Builds: SOURCE_DATE_EPOCH(英語)


