2.

TAR(.tar)完全ガイド — Unix アーカイブ仕様・パーミッション保持・tar.gz/tar.xz の組み合わせ

編集
この記事の要点
  • TAR は Tape ARchive の略で、Unix 1979 年に磁気テープへのバックアップ用に作られた歴史あるアーカイブ形式
  • TAR 自体には圧縮機能はなく、複数ファイルを 1 つにまとめるだけ。圧縮は gzip/bzip2/xz/zstd と組み合わせる
  • パーミッション・所有者・グループ・タイムスタンプ・シンボリックリンク・デバイスファイルなど、Unix のファイル属性を完全に保持できる
  • tar.gz / tar.xz / tar.zst の組み合わせが Unix 系の事実標準。Linux カーネルや各種 OSS の配布物で多用される
  • ヘッダは 512 バイト固定。データもブロックサイズ 512 バイトで埋められる
  • --exclude--strip-components-C など実用的なオプションが豊富

概要

TAR(Tape ARchive、ター)は 1979 年、Unix V7 で磁気テープにファイルをバックアップする目的で作られた極めて古いアーカイブ形式です。当時のテープ装置は「ヘッダ + データを連続して書き込む」逐次アクセスデバイスだったため、TAR も ヘッダ → データ → ヘッダ → データ …… という素直なストリーム構造になっています。ランダムアクセス索引(セントラルディレクトリのようなもの)を持たないのが ZIP との大きな違いです。

TAR 自体は 圧縮しません。複数のファイルとディレクトリを 1 つのストリームにまとめ、Unix のファイル属性(パーミッション、所有者 UID/GID、タイムスタンプ、シンボリックリンク、ハードリンク、デバイスファイルなど)をすべて保持することに特化しています。圧縮が必要なら、出力ストリームをそのまま gzip / bzip2 / xz / zstd に流す ―― これが tar.gz, tar.bz2, tar.xz, tar.zst の正体です。

「まとめる」と「圧縮する」を直交した別ツールにする Unix 哲学を体現した存在で、現在もソースコード配布(Linux カーネル、GNU ツール群、各種 OSS)、サーバのバックアップ、Docker イメージレイヤなど、Unix 系の世界では空気のように使われています。

内部構造とマジックナンバー

TAR は 512 バイト固定ヘッダ + ファイルデータ(512 バイト境界にゼロ埋め) という素朴な構造を繰り返します。ヘッダにはファイル名、モード、UID、GID、サイズ、mtime、チェックサム、タイプフラグ(通常ファイル / シンボリックリンク / ディレクトリ / FIFO 等)が固定オフセットで並びます。アーカイブの終端は 512 バイトのゼロブロックが 2 つ連続することで示されます。

形式にはいくつかバリエーションがあります。

  • v7 tar — 1979 年オリジナル。ファイル名 100 バイト制限
  • ustar(POSIX.1-1988) — マジック "ustar\0" + "00" がオフセット 257 に入る。ファイル名 256 バイトまで
  • pax(POSIX.1-2001) — 拡張ヘッダで任意長ファイル名・任意属性。UTF-8 対応
  • GNU tar 拡張 — sparse file、incremental backup、ロングネームなど独自拡張

ZIP のような単一バイト列のマジックナンバーは 先頭にはなく、オフセット 257 にある "ustar" 文字列で判別するのが一般的です。file コマンドもこの位置を見ています。

主な用途

  • Linux カーネルや OSS のソースコード配布(kernel.org の linux-*.tar.xz など)
  • サーバの完全バックアップ(パーミッションや所有者情報の保持が必須なため)
  • Docker イメージレイヤ(OCI Image Spec はレイヤを tar.gz で持つ)
  • ホームディレクトリの引っ越し、設定ファイルのスナップショット
  • chroot や Linux コンテナ rootfs の配布

関連形式との比較

形式圧縮率速度パーミッション保持暗号化備考
tar(非圧縮)なし非常に速い完全なし圧縮は別ツール
tar.gz速い完全なし事実標準
tar.xz高い遅い完全なしカーネル配布で主流
tar.zst高い速い完全なしArch/Debian で採用拡大
ZIP速い不完全AES-256Windows/Mac 標準

コマンド・ツール

# 圧縮なしの tar を作成
tar cvf archive.tar mydir/

# tar.gz を作成(z オプションが gzip)
tar czvf archive.tar.gz mydir/

# tar.gz を展開
tar xzvf archive.tar.gz

# tar.xz を展開(J オプションが xz)
tar xJvf archive.tar.xz

# tar.zst を展開(--zstd を明示)
tar --zstd -xvf archive.tar.zst

# 中身一覧(展開せず確認)
tar tzvf archive.tar.gz

# 特定パターンを除外して圧縮
tar czvf backup.tar.gz --exclude='*.log' --exclude='node_modules' mydir/

# 展開時にトップディレクトリを 1 階層削る(よくある src/foo を foo/ にする)
tar xzvf project-1.0.tar.gz --strip-components=1 -C /usr/local/src/

# 展開先を指定
tar xzvf archive.tar.gz -C /opt/

# 標準出力にストリーム → ssh 経由でリモートに転送
tar czvf - mydir/ | ssh user@host 'cat > backup.tar.gz'

注意点・落とし穴

  • 圧縮率を上げたいなら xz か zst — ソース配布は .tar.xz が事実標準。バックアップ速度重視なら .tar.zst -T0 でマルチスレッド圧縮。
  • パストラバーサル(tar slip) — ZIP と同様、../ を含むファイル名を検証せず展開するライブラリは危険。GNU tar は通常 ../ を含むパスを拒否するが、自作プログラムや古い言語ライブラリで実装する場合は要注意。
  • シンボリックリンク経由の上書き — 展開先に既にシンボリックリンクがあると、リンク先のファイルを上書きされる攻撃が成立する。GNU tar の --no-overwrite-dir-k(既存ファイルを書き換えない)で防御する。
  • Windows での扱い — Windows 10 1803 以降は tar.exe が標準搭載されたが、パーミッションは正しく扱えない。WSL / Git Bash / 7-Zip の利用が無難。
  • 所有者情報 — root で作った tar を一般ユーザーが展開すると uid/gid が変わる。--no-same-owner を付けると展開ユーザー権限になる。
  • 大容量ファイル — tar 自体に 8GB 制限などの歴史的制約があったが、現代の pax/GNU 拡張形式では事実上無制限。

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ZIP(.zip)
  2. TAR(.tar)
  3. GZ / GZIP(.gz / .tgz)
  4. 7z(.7z)
  5. RAR(.rar)
  6. BZ2 / BZIP2(.bz2 / .tbz2)
  7. XZ / LZMA2(.xz / .txz)
  8. Zstandard(.zst / .zstd)
  9. CAB(.cab)
  10. LZH(.lzh / .lha)

最近更新/作成されたページ