stringtranslate.com

tar (вычисления)

В вычислительной технике 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 появляется несколько таких файлов, только первый из них архивируется как обычный файл; остальные архивируются как жесткие ссылки, при этом поле "имя связанного файла" устанавливается на имя первого. При извлечении такие жесткие ссылки должны быть воссозданы в файловой системе.

Формат UStar

Большинство современных программ 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 и более поздних версий.

POSIX.1-2001/пакс

В 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> [файлы или каталоги, которые нужно добавить в архив]

Основные опции:

Основное использование

Создайте архивный файл 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 теперь предлагает длинные имена файлов .

Архивирование tar часто используется вместе с методом сжатия, таким как gzip , для создания сжатого архива. Как показано, комбинация файлов в архиве сжимается как единое целое.

Смотрите также

Ссылки

  1. ^ "libarchive - библиотека C и инструменты командной строки для чтения и записи tar, cpio, zip, ISO и других форматов архивов @ GitHub". www.libarchive.org .
  2. ^ Сергей Позняков (18 июля 2023 г.). "tar-1.35 выпущен [стабильная]" . Получено 26 июля 2023 г. .
  3. ^ Джон Гилмор (1986-12-10). "v07i088: Программа TAR в открытом доступе". Группа новостей : mod.sources. Архивировано из оригинала 2022-02-07 . Получено 2022-02-07 .
  4. ^ "позикстар".
  5. ^ "звезда". Архивировано из оригинала 2023-11-12 . Получено 2023-11-12 .
  6. ^ Гилмор, Джон; Фенласон, Джей (4 февраля 2019 г.). «Basic Tar Format». gnu.org . и другие. Free Software Foundation . Получено 17 апреля 2019 г. .
  7. ^ ab "tar(5) manual page". FreeBSD.org . FreeBSD. 20 мая 2004 . Получено 2 мая 2017 .
  8. ^ IEEE Std 1003.1-1988, Стандарт IEEE для информационных технологий — Интерфейс переносимой операционной системы (POSIX)
  9. ^ IEEE Std 1003.1-2001, Стандарт IEEE для информационных технологий — Интерфейс переносимой операционной системы (POSIX)
  10. ^ IBM . "IBM System i Version 7.2 Programming Qshell" (PDF) . IBM . Получено 2020-09-05 .
  11. ^ "Анонс Windows 10 Insider Preview Build 17063 для ПК". Блог Windows Experience . 2017-12-19 . Получено 2 июля 2018 г.
  12. ^ «Tar и Curl приходят в Windows!». 2019-03-22.
  13. ^ "Блокировка". ftp.gnu.org . Получено 2020-08-26 .
  14. ^ Hoo, James. "Открытие/извлечение файла TAR с помощью бесплатного ПО на Windows/Mac/Linux". e7z Org . Архивировано из оригинала 6 февраля 2015 г. Получено 3 сентября 2019 г.
  15. ^ Kientzle, Tim (1995). Форматы файлов Интернета. Coriolis Groups Books. стр. 196. ISBN 978-1-883577-56-8. Получено 10.11.2022 .
  16. ^ abc "GNU tar 1.32: 8.1 Использование меньшего пространства за счет сжатия". GNU . 2019-02-23 . Получено 2019-08-11 .
  17. ^ НОВОСТИ, git.savannah.gnu.org - ищите «Добавлена ​​поддержка форматов архивов POSIX.1-2001 и ustar».
  18. ^ "GNU tar 1.34: 8. Управление форматом архива". GNU . Получено 2022-07-11 .
  19. ^ pax  – Справочник по оболочкам и утилитам, Единая спецификация UNIX , версия 4 от The Open Group
  20. ^ "#2116 Tar с заголовками pax не анализируются". 7-Zip / Ошибки | SourceForge .
  21. ^ GNU tar 1.35: 6.8 Работа только с новыми файлами
  22. ^ Различия между BSD tar и GNU tar и star | Baeldung on Linux
  23. ^ "duplicity: Новый формат файла". duplicity.nongnu.org .
  24. ^ gnu_tar/src/create.c в master · gitGNU/gnu_tar · GitHub, строка 546
  25. ^ src/bin/pax/tar.c в 8df76133309eacd4092b091ee0504adb842322a5 · openbsd/src · GitHub, строка 1066
  26. ^ ab tar(5) –  Руководство по форматам файлов FreeBSD
  27. ^ "Расширенные атрибуты: хорошие, не очень хорошие, плохие". Les bons comptes . 15 июля 2014 г. Архивировано из оригинала 14 декабря 2014 г. Получено 3 сентября 2019 г. Расширенные атрибуты могут быть очень ценными для хранения метаданных файла (например, author="John Smith", subject="country landscape") во многих случаях, когда вы не хотите или не можете хранить эти данные во внутренних свойствах файла.
  28. ^ "bsdtar(1)". man.freebsd.org .
  29. ^ BillThor (28 июля 2017 г.). «Что делает архив tar доступным для поиска?». Super User . Получено 15 декабря 2023 г. .
  30. Василевский, Дэйв (6 декабря 2023 г.). "pixz".
  31. ^ "GNU tar 1.35: 4.2.4 Объединение архивов с помощью --concatenate". www.gnu.org .
  32. ^ Шиллинг, Йорг. "Star a very fast and Posix 1003.1 compliant tar archiver for UNIX". Архивировано из оригинала 2023-07-09 . Получено 2023-09-02 .
  33. ^ Томас Э. Дики (4 января 2015 г.). "TAR против портативности: тар Шилли" . Получено 23 октября 2021 г.
  34. ^ Йорг Шиллинг (4 сентября 2021 г.). "star - уникальный стандартный ленточный архиватор" . Получено 23 октября 2021 г.
  35. ^ модуль tarfile, python.org
  36. ^ tarfile.py, github.com
  37. ^ Позняков, Сергей (2019-01-02). "tar-1.31 released [stable]". Списки рассылки GNU . Получено 2019-08-06 .
  38. ^ tar(1)  –  Руководство по основным командам FreeBSD

Внешние ссылки