tar (англ. tape archive) — формат битового потока или файла

advertisement
tar (англ. tape archive) — формат битового потока или файла архива, а также название
традиционной для Unix программы для работы с такими архивами. Программа tar была
стандартизирована в POSIX.1-1998, а также позднее в POSIX.1-2001. Первоначально
программа tar использовалась для создания архивов на магнитной ленте, а в настоящее
время tar используется для хранения нескольких файлов внутри одного файла, для
распространения программного обеспечения, а также по прямому назначению — для
создания архива файловой системы. Одним из преимуществ формата tar при создании
архивов является то, что в архив записывается информация о структуре каталогов, о
владельце и группе отдельных файлов, а также временны́е метки файлов.
Как и другие утилиты Unix, tar — специализированная программа, которая следует
философии Unix: «делать только одну вещь, но делать её хорошо». Поэтому tar не создаёт
сжатых архивов, а использует для сжатия внешние утилиты, такие как gzip и bzip2. Ранее
для сжатия использовалась также утилита compress, которая практически вышла из
употребления.
Выполняемая функция специфицируется одним из следующих символов:
r
Указанные файлы записываются в конец архива.
x
Указанные файлы извлекаются из архива, а если задан каталог, содержимое
которого было записано в архив, то этот каталог восстанавливается (рекурсивно).
Рекомендуется задавать файлы относительными маршрутными именами, иначе tar не
сможет найти их в архиве. Имя владельца, время модификации, режим доступа также
восстанавливаются (если возможно). Если не указано ни одно имя файла или каталога, то
извлекается все содержимое архива. Заметим, что если в архиве есть несколько файлов с
одним и тем же именем, то в результате извлечется последний.
t
Архив просматривается и имена указанных файлов и информация о них выводятся
всякий раз, когда они встречаются в архиве. Формат вывода аналогичен команде ls -l.
Если имена файлов не указаны, то выводятся сведения обо всех файлах архива.
u
Указанные файлы добавляются в архив, если их там не было или они были
модифицированы после последней записи в архив. Включает спецификацию r.
c
Создание нового архива; файлы начинают записываться с начала архива, а не за
последним файлом. Включает спецификацию r.
Следующие символы могут быть использованы дополнительно к букве, задающей
желаемое действие. Использовать их следует в порядке, указанном в разделе
СИНТАКСИС.
v
Обычно tar выполняет указанное действие без сообщений пользователю. Опция v
заставляет tar выводить имена всех файлов, которые он обрабатывает, причем перед
именами выводится буква, обозначающая действие. Если выбрана функция t, то v дает
больше информации о сохраненном файле, а не просто его имя.
w
Если указан этот модификатор, то tar печатает действие, которое он собирается
сделать, за ним выводит имя файла и ждет подтверждения от пользователя. Если введено
слово, которое начинается с буквы y, то действие выполняется. Любое другое введенное
слово рассматривается как нет.
f
Этот модификатор заставляет использовать следующий аргумент как имя архива
вместо /dev/mt. Если вместо имени файла задан -, то tar пишет на стандартный вывод или
читает со стандартного ввода, в зависимости от указанного действия. Таким образом, tar
может использоваться как начало или конец конвейера. Команда tar может также
использоваться для копирования каталогов вместе с иерархической структурой
подкаталогов при помощи следующей конструкции:
cd fdir; /etc/tar cf - . |(cd tdir; /etc/tar xf -)
b
Если указан этот модификатор, то аргумент блок используется, как коэффициент
блокирования для записей на ленте. По умолчанию он равен 1, максимальный - 20. Если
архив обновляемый или он расположен в специальном блочном файле, то модификатор
неприменим. Этот модификатор может быть использован только для архивов
действительно расположенных на магнитной ленте (см. опцию f выше). Размер блока
определяется автоматически при чтении ленты (режимы x и t).
l
Этот модификатор позволяет выводить сообщения об ошибках, если tar не смог
разрешить все ссылки на сохраняемые файлы. Если модификатор l не указан, то
сообщений об ошибках по этому поводу не будет.
m
При использовании этого модификатора время последней модификации файлов,
извлекаемых из архива, устанавливается равным времени извлечения, а не тому времени,
которое записано в архиве.
o
Этот модификатор придает извлекаемым из архива файлам идентификаторы
владельца и группы пользователя, запустившего программу извлечения, а не
идентификаторы, записанные в архиве. Модификатор корректен только в режиме
извлечения (x).
Сообщения о неправильном спецификаторе и ошибках ввода/вывода на ленту.
Сообщения о нехватке памяти для таблиц ссылок.
СЮРПРИЗЫ
Нет способа указать в архиве n-ый экземпляр заданного файла.
Ошибки ввода/вывода обрабатываются прямолинейно.
Режим u может работать медленно.
Опция b не может быть использована при работе с архивом, который должен обновляться.
Используемый сейчас драйвер магнитной ленты не позволяет отматывать ее назад. Если
архив находится в дисковом файле, то опцию b нельзя применять ни в коем случае,
потому что обновление архива, расположенного на диске, может разрушить его.
Текущее ограничение на длину имени файла равно 100 символам.
Команда tar не копирует пустые каталоги и специальные файлы.
Подробная информация
tar [bundled-flags ] [ | ...]tar {-c} [options] [files | directories]tar {-r | -u} -f archive-file [options]
[files | directories]tar {-t | -x} [options] [patterns]
Описание
tar создает и манипулирует потоковыми архивными файлами. Первая форма комманд
содержит опцию ``bundled''. Такое использование делается в целях совместимости по
историческим соображениям.
Остальные формы команд показывают предпочтительное использвание. Первая опция tar
это индикатор состояния из следующего списка:
-c Создает новый архив содержащий указанные файлы.-r Похож на -c, только новые
строки добавляются к архиву. Учтите, что опция работает только с некомпрессироваными
архивами содержащихся в регулярных файлах.Требует опции -f.-t Выводит содержимое
архива на стандартный вывод.-u Похож на -r, но новые строки добавляются только в том
случае если они содержат дату изменения более новую, нежели находящаяся в архиве.
Данная опция работает только в нескомпрессированых архивах хранящихся в регулярных
файлах. Требует опции -f.-x Распаковывает на диск из архива. Если файл с тем же именем
содержится более одного раза в архиве, каждая копия будет распакована, причем более
поздняя копия заместит собой более ранние.
В -c, -r, или -u режимах, каждай указанный файл или директория добавляется к архиву в
порядке указания в командной строке. По умолчанию, содержимое каждой директории
так же архивируется.
В режиме распаковки или списка, вся командная строка читается и парсируется
прежде,чем архив будет открыт. Имена путей или шаблонов в командной строке
показывают,какие файлы в архиве должны быть обработаны. Стиль шаблонов схож со
стилем шаблонов shell'а как описано в документе на tcsh(1).
Совместимость
Формат связанных аргументов поддерживается для совместимости с историческими
реализациями. Он содержит инициируемое слово (без символа - в начале) в котором
каждый символ указывает на опцию. Аргументы следуют как раздельные слова. Порядок
документов должен совпадать с порядком следования символов в связаном слове.
Например,
tar tbf 32 file.tar
определяет флаги t, b, and f. Флаги b и f - оба требуют аргументов, поэтому должны быть 2
дополнительных аргумента в командной строке. Аргумент 32[color] аргумент
флага [color=brown]b, и file.tar аргумент флага f. Опции режима c, r, t, u, и x, и опции
Безопасность
Определенные проблемы безопасности рапространены во многих архиваторах, включая
tar. Частично тщательно обработанные архивы могут попросить извлек файлы в место
отличное от целевой директории. потенциально это может быть использовано для того что
бы невольно заставить пользователя перезаписать файлы, которые он не хотел
перезаписывать. Если архив извлекается суперпользователем, любой файл в системе
может быть потенциально перезаписан. Это может случиться по трем причинам.
Хотя tar и имеет механизмы для защиты друг друга, здравомыслящие пользователи
должны знать о реализациях:
+o Записи в архивах имеют абсолютные имена пути. По умолчанию, tar удаляет
начальные / символы из имен файлов прежде чем восстановит их, для предотвращения
этой проблемы.
+o Записи в архивах могут иметь имена пути которые содержат .. . По умолчанию, tar
не распакует файлы содержащие такие .. компоненты в именах пути.
+o Записи в архивах могут могут использовать символические ссылки для
восстановления файлов в других директориях. Архив может восстановить символическую
ссылку в другую директорию, затем использовать эту ссылку для восстановления файла в
эту директорию. Для защиты от этого, tar проверяет каждый распакованый путь на
символические ссылки. Если последний элемент пути является символической ссылкой,
он будет удален и замещен записью в архиве. Если указана опция -U любая
промежуточная символическая ссылка будет так же удалена. Если опции -U или -P не
указаны, tar откажется распаковывать строку. Для защиты себя, вы должны опасаться
любых архивов, которые поступают из недостоверных источников. Вы должны проверять
содержимое архива
tar -tf filename
прежде, чем начнете распаковку. Вы должны использовать опцию -k для того что бы
быть увереным что tar не перезапишет существующие файлы или опцию -U для удаления
всех существующих файлов. Обычно вы не должны распаковывать архивы пока
используете привелегии суперпользователя. учтите, что опция -P отключает проверки
безопасности tar'а и позволяет распаковать архивы с сохранением абсолютных имен пути,
.. компонентами, или символическими ссылками на другие директории.
Стандарты
На данный момент нет стандарта POSIX для команды tar он появился в ISO/IEC 99451:1996 (``POSIX.1'') но был выброшен из IEEE Std 1003.1-2001 (``POSIX.1''). Опции
используемые данной реализацией были разработаны с учетом множества реализаций tar,
так же как и с учетом старой спецификации POSIX и текущей спецификации POSIX.
Ustar и pax файловые форматы обмена были определены IEEE Std
1003.1-2001 (``POSIX.1'') для команды pax.
История
команда tar появилась в Седьмой Редакции Unix. Были некоторые другие реализации,
многие из них расширяли формат файла. Реализация John Gilmore'а pdtar находящаяся в
общем владении, в некотором роде повлияла и сформировала основы GNU tar. GNU tar
был включен как часть стандартной системы tar в FreeBSD начиная с FreeBSD 1.0.
Это полная новая реализация основанная на библиотеке libarchive(3).
Ошибки
POSIX и GNU жестко расходятся в том, какое значение несет опция -l. Из-за
потенциальной угрозы, когда кто-то ожидает одного поведения а получает другое, опция l преднамеренно отсутствует в данной реализации.
Опция -C dir может отличатся от исторической реализации.
Весь вывод архива написан в блоках корректного размера, даже если вывод был сжат.
Дополняет ли последний блок полный размер блока, зависит от формата выходного
устройства. Для tar и cpio, последний выходной блок добавляется к полному размеру
блока, если вывод был произведен на стандартный вывод или в символьное или блочное
устройство, такое как ленточный накопитель. Если вывод был записан в файл, последний
блок не добавляется. Многие утилиты сжатия, включая gzip(1) и bzip2(1) жалуются об
отсутствии нулевого добавления в момент декомпрессии архива созданного tar'ом,
но они распакуют его правильно. Сжатие и декомпрессия реализовано внутри, поэтому
много существенных отличий между сжатым выводом созданным
tar -czf - file
и созданым
tar -cf - file | gzip
По умолчанию нужно читать и записывать архивы на стандартный ввод/вывод, но
традиция (и POSIX) утверждают другое.
режимы r и u требуют что бы архив был несжатым и находился в файле на диске. Другие
архивы могут быть модифицированы используя режим c, с расширением @archive-file.
Для архивации файла называемого @foo или -foo вы должны указать их как ./@foo или ./foo, соответственно.
В режиме создания первые ./ всегда удаляются. Первый / удаляется пока не будет
указана опция -P.
Нужна более лучшая поддержка для выбора файлов при создании и распаковки.
Нет поддержки многотомных архивов или архивирования редких файлов.
конвертирование между различными архивными форматами (таких как tar или cpio)
используя опцию @- может вызвать потерю информации (последствие несовместимых
путей благодаря которым различные форматы архивов хранят информацию о жестких
ссылках.
Есть альтернативные длиные опции, для многих коротких опций которые преднамеренно
не задокументированы.
Разбивка на блоки *
При записи на ленту tar записывает содержимое архива в так называемые блоки. Чтобы
изменить размер блока, принимаемый по умолчанию, используйте опцию '--block=size=512-размер'. Каждый блок будет выражен в записях размера (одна запись tar - 512
байт).
Каждый файл, записанный в архив, использует по меньшей мере один целый блок.
Поэтому использование больших блоков может привести к обилию пустых мест при
небольшом количестве файлов. С другой стороны, больший блок может чаще читаться и
более эффективно записываться.
Дальнейшее усложнение проблемы в том, что ленточные устройства полностью
игнорируют разбивку на блоки. В данном случае тоже предпочтительнее большой размер
блока (потому что уровни программного обеспечения ленточного устройства все еще
уважают разбивку на блоки), но это не так важно, как на ленточных устройствах,
уважающих разбивку на блоки.
При чтении архива tar обычно сам вычисляет размер архива. Если при этом был
использован нестандартный размер блока во время создания архива, tar выдает сообщение
о нестандартном блочном факторе, а затем нормально работает. На некоторых ленточных
устройствах, однако, tar не может сам вычислить размер блока. На большинстве из них вы
должны задавать блочный фактор (с помощью '--block-size=512-размер', больший, чем
точный блочный фактор, а затем использовать опцию '--read-full-blocks' ('-B'). (Если вы
задаете блочный фактор с помощью '--block-size=512-размер' и не используете опцию '-read-full-blocks', tar не пытается вычислять размер блока.) На некоторых устройствах вы
можете всегда точно задать размер блока с помощью '--block-size=512-размер' при чтении,
т.к. tar не вычисляет его. В любом случае используйте '--list' перед любым извлечением,
чтобы посмотреть, правильно ли tar прочитал архив.
Если вы испрльзуете блочный фактор больше 20, более старые программы tar могут не
быть способными читать архив, т.ч. мы рекомендуем для использования на практике
ограничиться этим значением. Однако GNU tar предполагает как угодно большие размеры
блоков, ограниченные только количеством виртуальной памяти или физическими
характеристиками ленточного устройства.
Если вы записываете уплотненный архив на ленту с помощью '--compress' или '--gzip',
tar не сможет правильно разбить архив на блоки . Этого не случится, если вы записываете
архив в нормальный файл через канал, или записываете его на ленточное устройство.
Используйте '--compress-blocks' или '--gzip-block', чтобы заставить tar правильно
выполнить разбивку на блоки.
Вариации формата *
Параметры формата задаются, когда архив записан на носитель. Оптимальный выбор
параметров формата варьирует в зависимости от типа и числа архивируемых файлов и от
носителя, используемого для хранения архива.
Чтобы задать параметры формата при создании архива, вы можете использовать опции,
описанные в следующих разделах. По умолчанию, если вы не задаете параметров
формата, tar использует специальные параметры. Вы не можете модифицировать
уплотненный архив. Если вы создаете архив с помощью '--block-size=512-размер', вы
должны задать размер блока для оперировании архивом.
Там приведены примеры параметров формата.
Блочный фактор архива *
Данные в архиве группируются в записи, каждая по 512 байт. Записи записываются и
читаются в так называемых блоках. Число записей в блоке (т.е. размер блока в 512байтных единицах) называется блочным фактором. Опция '--block-size=512-размер' задает
блочный фактор архива. По умолчанию блочный фактор обычно бывает 20 (т.е. 10240
байта), но его можно и устанавливать. Чтобы вычислить блочный фактор существуюшего
архива, используйте 'tar --list --file=имя_архива'. На некоторых устройствах это может не
работать.
Блоки разделены промежутками, которые занимают место на носителе архива. Если вы
архивируете на магнитной ленте, использование большего блочного фактора (и, стало
быть, больших блоков) обеспечивает более быстрое проникновении и позволяет вам
поместить на ленту большее количество данных. Если вы архивируете на картридж, очень
большой блочный фактор (скажем, 126 или больше) сильно повышает эффективность. С
другой стороны, маленький блочный фактор может использоваться при архивировании
маленьких файлов, чтобы избежать большого количества нулей. Вообщем, идеальный
размер блока зависит от размера межблочных промежутков на ленте, которую вы
используете, и среднего размера файлов, которые вы архивируете.
Архивы с блочным фактором больше 20 не могут читаться очень старыми версиями tar
или некоторыми новыми версиями tar, выполняемыми на старых машинах с маленьким
адресным пространством. С помощью GNU tar блочный фактор архива ограничивается
только максимальным размером блока устройства, содержащего архив, или количеством
доступной виртуальной памяти.
Если вы используете свой блочный фактор при создании архива, вы должны задать этот
же блочный фактор при его модификации. Некоторые архивные устройства требуют от
вас также задания блочного фактора при чтении архива, однако обычно это не нужно.
Обычно вы можете использовать '--list' без задания блочного фактора - tar сообщает ваш
размер блока и затем, как обычно, выдает список членов архива. Чтобы извлечь файлы из
архива про нестандартном блочном факторе (в частности, если вы сомневаетесь в его
значении), вы обычно должны использовать опцию '--read-full-blocks' ('-B') при задании
блочного фактора больше, чем блочный фактор архива (т.е. tar --extract --read-full-blocksblock-size=300'.)
Принцип работы
Download