| この記事の要点 |
|
概要
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-256 | Windows/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 拡張形式では事実上無制限。
関連リンク
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Git pushした変更の取消し|revert・履歴変更と保護の注意点 2026-10-15 23:49:01
- Gitでローカルを戻す前に|reset・restoreの違いと退避範囲 2026-10-15 23:49:01
- Git rebaseの使い方|対象範囲・競合解決・pushの判断 2026-10-15 22:50:59
- Git pullの使い方|取込み先・ff-only・競合とstashの注意点 2026-10-15 22:50:59
- Git pushの使い方|送信先・タグ・force-with-leaseの条件 2026-10-15 22:12:47
- Git remoteの設定・確認・削除|SSH URLとfetch/pushの違い 2026-10-15 22:12:47
- Gitリモートリポジトリの作成|初回push・既存履歴・mirrorの注意 2026-10-15 15:48:16
- Gitのuser.name・user.email設定|local/global・確認と過去履歴の注意 2026-10-15 15:30:07
- LinuxにGitをインストール|配布元・初期設定・TLSと認証の確認 2026-10-15 15:30:06
- Git導入と初回push|Linuxサーバー・Windows/macOS・SSH設定 2026-10-15 14:51:54
- Db2のCREATE INDEX|索引定義・INCLUDEと実行計画の確認 2026-10-15 14:10:22
- Db2の自動採番|IDENTITY・ID取得とRESTARTの注意点 2026-10-15 14:10:22
- 【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法 2026-10-15 13:53:15
- Db2のシーケンスとIDENTITYの違い|採番とカタログの確認SQL 2026-10-15 13:53:15
- Db2で複数カラムをUPDATEする方法|SET・WHEREと更新前の値 2026-10-15 13:53:15