Введение

Компьютерный формат файла, позволяющий объединять несколько файлов в один файл, называемый "tarball".

В информатике tar – это компьютерная программа-утилита для объединения множества файлов в один архивный файл, часто называемый tarball, для распространения или создания резервных копий. Название происходит от "tape archive" (архив на магнитной ленте), поскольку изначально она была разработана для записи данных на последовательные устройства ввода-вывода, не имеющие собственной файловой системы, такие как устройства, использующие магнитную ленту. Архивные наборы данных, создаваемые tar, содержат различные параметры файловой системы, такие как имя, метки времени, права собственности, разрешения доступа к файлам и структуру каталогов. Стандарт POSIX отказался от tar в пользу pax, однако tar продолжает широко использоваться.

История

Утилита командной строки была впервые представлена в Unix версии 7 в январе 1979 года, заменив программу tp (которая, в свою очередь, заменила "tap"). Структура файлов для хранения этой информации была стандартизирована в POSIX.1 1988 и позднее в POSIX.1 2001, и стала форматом, поддерживаемым большинством современных систем архивирования. Команда tar была упразднена в POSIX.1 2001 в пользу команды pax, предназначенной для поддержки формата файла ustar; о прекращении использования команды tar в пользу pax было заявлено как минимум с 1994 года. В настоящее время Unix-подобные операционные системы обычно включают инструменты для работы с tar-файлами, а также утилиты, часто используемые для их сжатия, такие как xz, gzip и bzip2. Команда также была портирована на операционную систему IBM i. BSD tar включена в Microsoft Windows начиная с обновления April 2018 Update для Windows 10, и существуют различные сторонние инструменты для чтения и записи этих форматов в Windows.

Обоснование

Многие старые ленточные накопители читают и записывают блоки данных переменной длины, оставляя значительное неиспользуемое пространство на ленте между блоками (необходимое для физического запуска и остановки ленты). Некоторые ленточные накопители (и сырые диски) поддерживают только блоки данных фиксированной длины. Кроме того, запись одного большого блока на любой носитель, такой как файловая система или сеть, занимает меньше времени, чем запись множества маленьких блоков. Поэтому команда tar записывает данные в виде записей, состоящих из множества 512-байтных блоков. Пользователь может указать коэффициент блокировки, определяющий количество блоков в записи. Значение по умолчанию — 20, что создает записи размером 10 КиБ.

Формат файла

Существует несколько форматов tar-файлов, включая исторические и современные. В стандарте POSIX кодифицированы два формата: ustar и pax. Формат GNU tar не кодифицирован, но до сих пор широко используется. Tar-архив состоит из последовательности файловых объектов, отсюда и популярный термин "тарбол", отражающий то, как тарбол собирает объекты различных типов, словно прилипшие к его поверхности. Каждый файловый объект включает в себя данные файла и ему предшествует 512-байтовая запись заголовка. Данные файла записываются без изменений, за исключением того, что их длина округляется до кратного 512 байт. Изначальная реализация tar не учитывала содержимое заполняющих байтов и оставляла буферные данные без изменений, однако большинство современных реализаций заполняют дополнительное пространство нулями. Конец архива обозначается как минимум двумя последовательными записями, заполненными нулями. (Происхождение размера записи в tar, вероятно, связано с 512-байтными секторами диска, использовавшимися в файловой системе Unix версии 7.) Последний блок архива дополняется нулями до полной длины.

Распространение программного обеспечения

Формат tar продолжает активно использоваться для распространения программного обеспечения с открытым исходным кодом. *NIX-дистрибутивы применяют его в различных механизмах распространения исходного и двоичного кода, при этом исходный код большинства программ предоставляется в виде сжатых tar-архивов.

Ограничения

Оригинальный формат tar был создан в ранние дни Unix, и, несмотря на его широкое распространение, многие его конструктивные особенности считаются устаревшими. Многие старые реализации tar не сохраняют и не восстанавливают расширенные атрибуты (xattrs) или списки управления доступом (ACLs). В 2001 году Star добавила поддержку ACL и расширенных атрибутов, используя собственные теги для POSIX.1 2001 pax. bsdtar использует расширения Star для поддержки ACL. Более новые версии GNU tar поддерживают расширенные атрибуты Linux, реализуя повторно расширения Star. Обзор ряда расширений представлен в руководстве по типам файлов для BSD tar, tar(5). Если у пользователя есть только очень старая версия tar, не поддерживающая эти меры безопасности, эти проблемы можно смягчить, предварительно просмотрев содержимое tar-файла с помощью команды tar tf archive. tar, которая выводит список файлов и позволяет исключить проблемные файлы впоследствии. Эти команды не извлекают файлы, а отображают имена всех файлов в архиве. Если какие-либо из них вызывают опасения, пользователь может создать новый пустой каталог и извлечь архив в него, либо вовсе отказаться от использования tar-файла. Большинство графических инструментов позволяют просмотреть содержимое архива перед извлечением. Vim может открывать tar-архивы и отображать их содержимое. GNU Emacs также способен открывать tar-архивы и отображать их содержимое в буфере dired.

Случайный доступ

Формат tar был разработан без централизованного индекса или оглавления для файлов и их свойств, предназначенного для потоковой записи на ленточные устройства резервного копирования. Архив необходимо читать последовательно для просмотра списка файлов или их извлечения. Для больших tar-архивов это приводит к снижению производительности, что делает их неподходящими для ситуаций, где часто требуется произвольный доступ к отдельным файлам. Если хорошо сформированный tar-файл хранится на носителе с возможностью произвольного доступа (то есть, обеспечивающем эффективное случайное чтение), программа все еще может относительно быстро (за линейное время относительно количества файлов) находить файл, пропуская чтение файлов на основе поля "размер" в заголовках файлов. Это лежит в основе опции в GNU tar. Когда tar-файл сжимается целиком, формат сжатия, как правило, не поддерживающий произвольный доступ, препятствует применению этой оптимизации. Некоторые "индексированные" компрессоры, учитывающие формат tar, могут восстановить эту возможность для сжатых файлов. Для сохранения возможности произвольного доступа, tar-файлы также должны быть правильно объединены, путем удаления завершающего нулевого блока в конце каждого файла.

Дубликаты

Еще одна проблема формата tar заключается в том, что он допускает наличие в архиве нескольких (возможно, различных) файлов с одинаковыми путями и именами. При извлечении такого архива обычно более поздняя версия файла перезаписывает предыдущую. Это может привести к созданию скрытой (неочевидной) тарбомбы, которая технически не содержит файлов с абсолютными путями или ссылками на родительские каталоги, но всё равно вызывает перезапись файлов вне текущего каталога. Например, архив может содержать два файла с одинаковым путем и именем, первый из которых является символической ссылкой на какое-либо местоположение вне текущего каталога, а второй – обычным файлом. В этом случае извлечение такого архива в некоторых реализациях tar может привести к записи данных в местоположение, на которое указывает символическая ссылка.

Суффиксы для сжатых файлов

Файлы tar-архивов обычно имеют суффикс файла tar (например, somefile.tar). Файл tar-архива содержит несжатые байтовые потоки файлов, которые он содержит. Для достижения сжатия архива доступны различные программы сжатия, такие как gzip, bzip2, xz, lzip, lzma, zstd или compress, которые сжимают весь tar-архив. Обычно сжатая форма архива получает имя файла путем добавления суффикса компрессора, специфичного для формата, к имени файла архива. Например, tar-архив archive.tar, при сжатии с помощью gzip, называется archive.tar.gz. Популярные программы tar, такие как версии tar BSD и GNU, поддерживают параметры командной строки Z (compress), z (gzip) и j (bzip2) для сжатия или декомпрессии архивного файла при создании или распаковке. Сравнительно недавними дополнениями являются lzma (LZMA), lzop (lzop), xz или J (xz), lzip (lzip) и zstd. Декомпрессия этих форматов обрабатывается автоматически, если используются поддерживаемые расширения имен файлов, а сжатие обрабатывается автоматически с использованием тех же расширений имен файлов, если опция автокомпрессии (краткая форма a) передается применимой версии GNU tar. Нераспознанные форматы должны быть сжаты или распакованы вручную с помощью конвейера. Ограничения имен файлов MS DOS 8.3 привели к дополнительным соглашениям об именовании сжатых tar-архивов. Однако эта практика сократилась, поскольку FAT теперь поддерживает длинные имена файлов. + Соответствия суффиксов файловКомпрессор Длинный Краткийbzip2 tar.bz2 tb2, tbz, tbz2, tz2gzip tar.gz taz, tgzlzip tar.lz lzlzma tar.lzma tlzlzop tar.lzo xz tar.xz txzcompress tar.Z tZ, taZzstd tar.zst tzst