TAR (Tape ARchive) — формат файла и утилита

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

TAR (Tape ARchive) — это формат файла и утилита командной строки для объединения множества файлов в один архивный файл. Изначально разработанный для записи на магнитные ленты (отсюда и название), сегодня он является стандартом де-факто в Unix/Linux-системах для распространения исходного кода, бэкапов и пакетов программного обеспечения.


История и суть формата

Формат появился в 1979 году в составе Version 7 Unix. Главная особенность TAR — он не сжимает данные сам по себе. Он лишь последовательно склеивает файлы, сохраняя их метаданные (имена, права доступа, владельца, временные метки, структуру каталогов) в специальных заголовках.

Именно поэтому TAR-файлы почти всегда используются в связке с утилитами сжатия:

  • .tar.gz или .tgz — TAR + Gzip (самый популярный вариант, баланс скорости и степени сжатия).
  • .tar.bz2 или .tbz2, TAR + Bzip2 (лучшее сжатие, но медленнее).
  • .tar.xz или .txz — TAR + XZ (максимальное сжатие, стандарт для дистрибутивов Linux, например, Arch Linux);
  • .tar.zst, TAR + Zstandard (современный алгоритм, очень высокая скорость распаковки).

Внутренняя структура TAR-файла

TAR-файл представляет собой поток байтов, состоящий из блоков по 512 байт. Структура проста:

  1. Заголовок файла (Header) — 512 байт, содержащие метаданные: имя файла (до 100 байт в старом формате), режим (права), UID/GID, размер, время модификации, контрольную сумму, тип файла (обычный, каталог, симлинк и т.д.) и имя связанного файла (для ссылок).
  2. Данные файла — содержимое файла, выровненное до блока 512 байт (добивается нулями).
  3. Повторение — для каждого файла в архиве.
  4. Конец архива — два и более пустых блока (заполненных нулями).

Важно: Из-за лимита 100 байт на имя файла в оригинальном формате (v7), были разработаны расширения: USTAR (POSIX.1-1988) и PAX (POSIX.1-2001). Они позволяют хранить длинные имена, большие файлы (> 8 ГБ), кодировку UTF-8, расширенные атрибуты и ACL.


Основные команды (Linux / macOS / WSL)

Утилита tar имеет множество флагов. Самые частые комбинации:

Создание архива

# Создать архив с сжатием gzip (-z), показать процесс (-v), в файл (-f)
tar -czvf archive.tar.gz /path/to/directory

tar -cJvf archive.tar.xz /path/to/directory

tar -cvf archive.tar /path/to/directory

Распаковка архива

# Распаковать (-x) с автоматическим определением сжатия (-a), показать файлы (-v)
tar -xavf archive.tar.gz

tar -xavf archive.tar.gz -C /target/directory

Просмотр содержимого без распаковки

tar -tvf archive.tar.gz

Добавление файлов в существующий архив (только для несжатых .tar)

tar -rvf archive.tar newfile.txt

Лайфхак: Флаг -a (auto-compress) сам определяет алгоритм сжатия по расширению файла (.gz, .xz, .zst и т.д.). Не нужно запоминать -z, -J, --zstd.


TAR в Windows

Раньше в Windows требовались сторонние программы (7-Zip, WinRAR). Начиная с Windows 10 (build 17063) и Windows 11, утилита tar.exe встроена в систему и доступна в PowerShell и CMD.

# PowerShell / CMD
tar -xvf archive.tar.gz
tar -czvf archive.tar.gz folder_name

Также полноценно поддерживается в WSL (Windows Subsystem for Linux).


Сравнение TAR с ZIP и RAR

<хорошая

Характеристика TAR (+ gzip/xz) ZIP RAR
Сжатие Отдельный этап (solid-архив) Пофайловое Solid-архив (по умолчанию)
Права доступа (chmod) Полная поддержка Ограниченная (только в расширениях Info-ZIP) Поддерживается
Символические/Жесткие ссылки Да Нет (превращаются в копии) Да
Владелец (UID/GID) Да Нет Да
Скорость добавления 1 файла Низкая (перезапись всего архива) Высокая Средняя
Степень сжатия (solid) Лучшая (словарь общий для всех файлов) Хуже (словарь на файл)
Стандартизация POSIX.1-2001 (PAX) PKWARE / ISO/IEC 21320-1 Проприетарный (RAR5 открыт частично)

Типичные сценарии использования

  • Распространение ПО в Linux: Исходники ядра, утилит, бинарные релизы на GitHub (Releases) почти всегда в .tar.gz или .tar.xz.
  • Резервное копирование (Backup): tar идеален для инкрементальных бэкапов (флаг -g / --listed-incremental), сохраняет все атрибуты файловой системы.
  • Docker/Контейнеры: Образы Docker по сути являются слоями в формате TAR (с метаданными JSON). docker save и docker export выдают .tar.
  • Перенос файловых систем: tar -cf ― /src | (cd /dst && tar -xf -), классический способ клонировать систему с сохранением всех прав, ссылок и спецфайлов.

Частые проблемы и решения

Ошибка «tar: Exiting with failure status due to previous errors»

Часто бывает из-за прав доступа (Permission denied) при чтении файлов. Решение: запускать от sudo или исключать проблемные папки (--exclude=/proc --exclude=/sys --exclude=/dev).

Проблемы с длинными именами файлов (> )

Старые версии tar или нестандартные реализации могут обрезать имена. Используйте формат PAX (современный стандарт):

tar --format=pax -cvf archive.tar /path/with/very/long/names

«File changed as we read it»

Предупреждение, а не ошибка. Файл менялся во время архивации (логи, БД). Для консистентности БД нужно останавливать сервис или использовать снапшоты LVM/ZFS/Btrfs.

Распаковка на FAT32/exFAT

Файловые системы без поддержки прав доступа (FAT32, exFAT) не сохранят атрибуты chmod, владельца и симлинки. При распаковке на флешке все файлы станут исполняемыми или принадлежать текущему пользователю.


Продвинутые трюки

Исключение файлов/папок

tar -czvf backup.tar.gz /home/user --exclude='*.cache' --exclude='node_modules' --exclude='.git'

Потоковая передача по SSH (без создания промежуточного файла)

# Сжать папку на локальной машине и сразу развернуть на сервере
tar -czf ― /local/path | ssh user@server "tar -xzf ― -C /remote/path"

Сохранение расширенных атрибутов (xattr) и ACL

# GNU tar 1.27+
tar --acls --xattrs -cvf archive.tar /path

Инкрементальный бэкап

# Первый полный бэкап (создает файл-снимок snapshot.snar)
tar -czvf backup-full.tar.gz -g backup.snar /home/user

tar -czvf backup-inc1.tar.gz -g backup.snar /home/user

TAR — это «клей» для файлов в Unix-мире. Он не сжимает, но идеально сохраняет структуру файловой системы: права, владельцев, ссылки, спецфайлы. В связке с современными компрессорами (zstd, xz, gzip) он остается золотым стандартом для дистрибуции ПО, системных бэкапов и контейнеров.

Понимание флагов -c, -x, -v, -f, -a, --exclude и умение работать с потоками (- вместо файла) — базовый навык любого разработчика, DevOps-инженера или администратора Linux.