В вычислительной технике tar — это компьютерная программная утилита для сбора множества файлов в один архивный файл , часто называемый tarball , для целей распространения или резервного копирования. Название происходит от «tape archive», поскольку изначально он был разработан для записи данных на последовательные устройства ввода-вывода без собственной файловой системы, такие как устройства, использующие магнитную ленту . Наборы архивных данных, созданные tar, содержат различные параметры файловой системы , такие как имя, временные метки, владелец, права доступа к файлам и организация каталогов . POSIX отказался от tar в пользу pax , однако tar продолжает широко использоваться.
Утилита командной строки была впервые представлена в версии 7 Unix в январе 1979 года, заменив программу tp (которая, в свою очередь, заменила «tap»). [7] Структура файла для хранения этой информации была стандартизирована в POSIX .1-1988 [8] и позднее в POSIX.1-2001, [9] и стала форматом, поддерживаемым большинством современных систем архивации файлов. Команда tar была отменена в POSIX.1-2001 в пользу команды pax , которая должна была поддерживать формат файла ustar; команда tar была указана для отзыва в пользу команды pax по крайней мере с 1994 года.
Сегодня Unix-подобные операционные системы обычно включают в себя инструменты для поддержки tar-файлов, а также утилиты, обычно используемые для их сжатия, такие как xz , gzip и bzip2 .
Команда tar также была перенесена в операционную систему IBM i . [10]
BSD-tar был включен в Microsoft Windows с момента обновления Windows 10 за апрель 2018 г. [11] [12] , и существует множество сторонних инструментов для чтения и записи этих форматов в Windows.
Многие исторические ленточные накопители считывают и записывают блоки данных переменной длины , оставляя значительное неиспользуемое пространство на ленте между блоками (для того, чтобы лента физически начала и остановилась). Некоторые ленточные накопители (и необработанные диски) поддерживают только блоки данных фиксированной длины. Кроме того, при записи на любой носитель, такой как файловая система или сеть, требуется меньше времени для записи одного большого блока, чем для записи множества маленьких блоков. Поэтому команда tar записывает данные в записи из множества блоков по 512 байт . Пользователь может указать фактор блокировки, который представляет собой количество блоков на запись. Значение по умолчанию равно 20, что дает записи по 10 КБ . [13]
Существует несколько форматов файлов tar, включая исторические и современные. Два формата tar кодифицированы в POSIX: ustar и pax. Не кодифицирован, но все еще используется в настоящее время формат GNU tar.
Архив tar состоит из ряда файловых объектов, отсюда и популярный термин tarball , указывающий на то, как tarball собирает объекты всех видов, которые прилипают к его поверхности. Каждый файловый объект включает любые файловые данные и предваряется 512-байтовой записью заголовка . Данные файла записываются без изменений, за исключением того, что их длина округляется до кратного 512 байтам. Первоначальная реализация tar не заботилась о содержимом байтов заполнения и оставляла данные буфера неизменными, но большинство современных реализаций tar заполняют дополнительное пространство нулями. [14] Конец архива отмечен как минимум двумя последовательными записями, заполненными нулями. (Происхождение размера записи tar, по-видимому, связано с 512-байтовыми секторами диска, используемыми в файловой системе Unix версии 7.) Последний блок архива дополняется нулями до полной длины.
Заголовочная запись файла содержит метаданные о файле. Для обеспечения переносимости между различными архитектурами с различным порядком байтов информация в заголовочной записи кодируется в ASCII . Таким образом, если все файлы в архиве являются текстовыми файлами ASCII и имеют имена ASCII, то архив по сути является текстовым файлом ASCII (содержащим много символов NUL ).
Поля, определенные исходным форматом tar Unix, перечислены в таблице ниже. Таблица индикаторов ссылок/типов файлов включает некоторые современные расширения. Когда поле не используется, оно заполняется байтами NUL. Заголовок использует 257 байт, затем дополняется байтами NUL, чтобы заполнить запись размером 512 байт. В заголовке нет «магического числа» для идентификации файла.
Заголовок tar до POSIX.1-1988 (т.е. v7):
Поле индикатора связи до POSIX.1-1988 может иметь следующие значения:
В некоторых реализациях tar до POSIX.1-1988 каталог обозначался косой чертой (/) в конце имени.
Числовые значения кодируются восьмеричными числами с использованием цифр ASCII с ведущими нулями. По историческим причинам следует также использовать конечный символ NUL или пробел . Таким образом, хотя для хранения размера файла зарезервировано 12 байт, можно сохранить только 11 восьмеричных цифр. Это дает максимальный размер файла в 8 гигабайт для архивных файлов. Чтобы преодолеть это ограничение, в 2001 году star представила кодировку base-256, которая указывается установкой старшего бита самого левого байта числового поля. [ необходима цитата ] GNU-tar и BSD-tar следовали этой идее. Кроме того, версии tar до первого стандарта POSIX от 1988 года дополняют значения пробелами вместо нулей.
Контрольная сумма вычисляется путем суммирования значений беззнаковых байтов записи заголовка с восемью байтами контрольной суммы, взятыми как пробелы ASCII (десятичное значение 32). Она хранится как шестизначное восьмеричное число с ведущими нулями, за которыми следует NUL и затем пробел. Различные реализации не придерживаются этого формата. Кроме того, некоторые исторические реализации tar обрабатывали байты как знаковые. Реализации обычно вычисляют контрольную сумму обоими способами и считают ее хорошей, если либо знаковая, либо беззнаковая сумма совпадает с включенной контрольной суммой.
Файловые системы Unix поддерживают несколько ссылок (имен) для одного и того же файла. Если в архиве tar появляется несколько таких файлов, только первый из них архивируется как обычный файл; остальные архивируются как жесткие ссылки, при этом поле "имя связанного файла" устанавливается на имя первого. При извлечении такие жесткие ссылки должны быть воссозданы в файловой системе.
Большинство современных программ tar читают и записывают архивы в формате UStar ( Unix Standard TAR [7] [15] ), введенном стандартом POSIX IEEE P1003.1 с 1988 года. Он ввел дополнительные поля заголовка. Старые программы tar будут игнорировать дополнительную информацию (возможно, извлекая частично именованные файлы), в то время как новые программы будут проверять наличие строки "ustar", чтобы определить, используется ли новый формат.
Формат UStar допускает более длинные имена файлов и сохраняет дополнительную информацию о каждом файле. Максимальный размер имени файла составляет 256, но он делится между предшествующим путем "префикс имени файла" и самим именем файла, поэтому может быть намного меньше. [16]
Поле флага типа может иметь следующие значения:
Расширения поставщика POSIX.1-1988, использующие значения флага ссылки «A»–«Z», частично имеют разное значение у разных поставщиков и поэтому считаются устаревшими и заменяются расширениями POSIX.1-2001, которые также включают тег поставщика.
Тип '7' (непрерывный файл) формально отмечен как зарезервированный в стандарте POSIX, но предназначался для обозначения файлов, которые должны быть размещены на диске непрерывно. Немногие операционные системы поддерживают создание таких файлов явно, и поэтому большинство программ TAR не поддерживают их и будут обрабатывать файлы типа 7 так, как если бы они были типа 0 (обычные). Исключением являются старые версии GNU tar при запуске в операционной системе MASSCOMP RTU (Real Time Unix), которые поддерживали флаг O_CTG для функции open() для запроса непрерывного файла; однако эта поддержка была удалена из GNU tar версии 1.24 и более поздних версий.
В 1997 году Sun предложила метод добавления расширений в формат tar. Этот метод был позже принят для стандарта POSIX.1-2001. Этот формат известен как расширенный формат tar или формат pax . Новый формат tar позволяет пользователям добавлять любые типы улучшений, специфичных для поставщика, с тегами поставщика. Следующие теги определены стандартом POSIX:
В 2001 году программа Star стала первым tar, поддерживающим новый формат. [ требуется ссылка ] В 2004 году GNU tar поддержал новый формат, [17] хотя он пока не записывает его как свой вывод по умолчанию из программы tar. [18]
Формат pax разработан таким образом, что все реализации, способные читать формат UStar, смогут читать и формат pax. Единственным исключением являются файлы, использующие расширенные возможности, такие как более длинные имена файлов. Для совместимости они кодируются в файлах tar как специальные x
или g
типовые файлы, обычно в PaxHeaders.XXXX
каталоге. [19] : exthdr.name Реализация, поддерживающая pax, будет использовать эту информацию, в то время как неподдерживающие, такие как 7-Zip, будут обрабатывать их как дополнительные файлы. [20]
Помимо создания и извлечения архивов, функциональность различных архивных утилит различается. Например, реализации могут автоматически определять формат сжатых архивов TAR для извлечения, чтобы пользователю не приходилось указывать его, и позволять пользователю ограничивать добавление файлов теми, которые были изменены после указанной даты. [21] [22]
tar [-options] <имя архива tar> [файлы или каталоги, которые нужно добавить в архив]
Основные опции:
-c, --create
— создать новый архив;-a, --auto-compress
— дополнительно сжать архив компрессором, который будет автоматически определен по расширению имени файла архива. Если имя архива заканчивается на , *.tar.gz
то используйте gzip , если , *.tar.xz
то используйте xz , *.tar.zst
для Zstandard и т. д.;-r, --append
— добавлять файлы в конец архива;-x, --extract, --get
— извлечь файлы из архива;-f, --file
— указать название архива;-t, --list
— показать список файлов и папок в архиве;-v, --verbose
— показать список обработанных файлов.Создайте архивный файл archive.tar
из файла README.txt
и каталога src
:
$ tar -cvf archive.tar README.txt src
Извлеките содержимое в archive.tar
текущий каталог:
$ tar -xvf архив.tar
Создайте архивный файл archive.tar.gz
из файла README.txt
и каталога src
и сожмите его с помощью gzip :
$ tar -cavf archive.tar.gz README.txt src
Извлеките содержимое в archive.tar.gz
текущий каталог:
$ tar -xvf архив.tar.gz
Tarpipe — это метод создания архива в стандартном выходном файле утилиты tar и его передачи другому процессу tar в его стандартном входе , работающему в другом каталоге, где он распаковывается. Этот процесс копирует все исходное дерево каталогов, включая все специальные файлы, например:
$ tar cf - исходный каталог | tar x -C целевой каталог
Формат tar продолжает широко использоваться для распространения программного обеспечения с открытым исходным кодом . *Дистрибутивы NIX используют его в различных механизмах распространения исходных и двоичных пакетов, при этом большая часть исходного кода программного обеспечения доступна в сжатых архивах tar. [ требуется ссылка ]
Первоначальный формат tar был создан на заре Unix, и, несмотря на его широкое распространение в настоящее время, многие из его конструктивных особенностей считаются устаревшими. [23]
Для устранения недостатков tar были созданы другие форматы.
Из-за размера поля исходный формат TAR не мог хранить пути к файлам и имена длиной более 100 символов.
Чтобы преодолеть эту проблему, сохраняя при этом читаемость для существующих утилит TAR , GNU tar сохраняет пути к файлам и имена, превышающие 100 символов, в @LongLink
записях, которые утилиты TAR, не знающие об этой функции, будут рассматривать как обычные файлы. [24] Аналогично формат PAX использует PaxHeaders
записи. [25]
Многие старые реализации tar не записывают и не восстанавливают расширенные атрибуты (xattrs) или списки контроля доступа (ACL). В 2001 году Star представила поддержку ACL и расширенных атрибутов через свои собственные теги для POSIX.1-2001 pax. bsdtar использует расширения star для поддержки ACL. [26] Более поздние версии GNU tar поддерживают расширенные атрибуты Linux, повторно реализуя расширения star. [27] Ряд расширений рассматривается в руководстве по типам файлов для BSD tar, tar(5). [26]
Tarbomb , на хакерском сленге , — это tar-файл, содержащий множество файлов, которые извлекаются в рабочий каталог. Такой tar - файл может создавать проблемы, перезаписывая файлы с одинаковыми именами в рабочем каталоге или смешивая файлы одного проекта с файлами другого. В лучшем случае это неудобство для пользователя, который обязан идентифицировать и удалить ряд файлов, перемежающихся с другим содержимым каталога. Такое поведение считается дурным тоном со стороны создателя архива.
Связанная с этим проблема — использование абсолютных путей или ссылок на родительские каталоги при создании файлов tar. Файлы, извлеченные из таких архивов, часто создаются в необычных местах за пределами рабочего каталога и, как tarbomb, могут перезаписывать существующие файлы. Однако современные версии FreeBSD и GNU tar по умолчанию не создают и не извлекают абсолютные пути и ссылки на родительские каталоги, если только это явно не разрешено флагом -P
или опцией --absolute-names
. Программа bsdtar, которая также доступна во многих операционных системах и является утилитой tar по умолчанию в Mac OS X v10.6, также не следует ссылкам на родительские каталоги или символическим ссылкам. [28] [ неудавшаяся проверка ]
Если у пользователя есть только очень старый tar, который не имеет этих мер безопасности, эти проблемы можно смягчить, сначала проверив tar-файл с помощью команды tar tf archive.tar
, которая выводит список содержимого и позволяет впоследствии исключить проблемные файлы. Эти команды не извлекают файлы, а отображают имена всех файлов в архиве. Если какие-либо файлы являются проблемными, пользователь может создать новый пустой каталог и извлечь в него архив — или вообще избежать tar-файла. Большинство графических инструментов могут отображать содержимое архива перед его извлечением. Vim может открывать tar-архивы и отображать их содержимое. GNU Emacs также может открывать tar-архив и отображать его содержимое в буфере dired .
Формат tar был разработан без централизованного индекса или таблицы содержимого для файлов и их свойств для потоковой передачи на ленточные устройства резервного копирования. Архив должен быть прочитан последовательно для перечисления или извлечения файлов. Для больших архивов tar это приводит к снижению производительности, что делает архивы tar непригодными для ситуаций, в которых часто требуется произвольный доступ к отдельным файлам.
При правильно сформированном tar-файле, хранящемся на носителе с возможностью поиска (т. е. допускающем эффективное случайное чтение), tar
программа может относительно быстро (за линейное время относительно количества файлов) искать файл, пропуская чтения файла в соответствии с полем «размер» в заголовках файла. Это основа для опции -n
в GNU tar. Когда tar-файл сжимается целиком, формат сжатия, будучи обычно не допускающим поиска, препятствует выполнению этой оптимизации. [29] Ряд «индексированных» компрессоров, которые знают о формате tar, могут восстановить эту функцию для сжатых файлов. [30] Для сохранения возможности поиска tar-файлы также должны быть правильно объединены, путем удаления завершающего нулевого блока в конце каждого файла. [31]
Другая проблема с форматом tar заключается в том, что он позволяет нескольким (возможно разным) файлам в архиве иметь одинаковые пути и имена файлов. При извлечении такого архива обычно последняя версия файла перезаписывает первую.
Это может создать неявный (неочевидный) tarbomb, который технически не содержит файлов с абсолютными путями или ссылается на родительские каталоги, но все равно приводит к перезаписи файлов за пределами текущего каталога (например, архив может содержать два файла с одинаковым путем и именем файла, первый из которых является символической ссылкой на некоторое местоположение за пределами текущего каталога, а второй — обычным файлом; тогда извлечение такого архива в некоторых реализациях tar может привести к записи в местоположение, на которое указывает символическая ссылка).
Исторически многие системы реализовали tar, и многие общие архиваторы файлов имеют по крайней мере частичную поддержку tar (часто используя одну из реализаций ниже). История tar — это история несовместимостей, известных как «войны tar». Большинство реализаций tar также могут читать и создавать cpio и pax (последний на самом деле является форматом tar с расширениями POSIX -2001).
Ключевые реализации в порядке происхождения:
Кроме того, большинство реализаций pax и cpio могут читать и создавать несколько типов файлов 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 . [37] Распаковка этих форматов выполняется автоматически, если используются поддерживаемые расширения имен файлов, а сжатие выполняется автоматически с использованием тех же расширений имен файлов, если параметр --auto-compress (короткая форма -a ) передается соответствующей версии GNU tar. [16] BSD tar обнаруживает еще более широкий диапазон компрессоров ( lrzip , lz4 ), используя не имя файла, а данные внутри него. [38] Нераспознанные форматы должны быть вручную сжаты или распакованы с помощью конвейера.
Ограничения на имена файлов MS-DOS 8.3 привели к дополнительным соглашениям по именованию сжатых архивов tar. Однако эта практика пошла на спад, поскольку FAT теперь предлагает длинные имена файлов .
атрибуты могут быть очень ценными для хранения метаданных файла (например, author="John Smith", subject="country landscape") во многих случаях, когда вы не хотите или не можете хранить эти данные во внутренних свойствах файла.