В чем разница между форматами архивных файлов TAR и CPIO?

28272
ianc1215

Мне любопытно, я немного почитал, но у меня остались вопросы.

Что отличает CPIO от TAR? В другом вопросе мне сказали, что tar предназначен для объединения множества файлов в 1 архив, который обычно называется gzip'd или bzip'd.

Также мне сказали, что TAR не может сжимать из STDOUT. Я хочу заархивировать / сжать моментальные снимки ZFS для резервного копирования. Мне было интересно, смогу ли я объединить CPIO с bzip2, чтобы получить этот эффект.

Или у меня совершенно неверная идея? Разве это не цель CPIO?

Это те команды, которые я придумал после прочтения, поэтому документы Oracle о резервном копировании снимков ZFS.

# Backup snapshot to cpio and bzip2 archive zfs send media/mypictures@20070607 | cpio -o | bzip2 -9c > ~/backups/20070607.bz2  # Restore snapshot from cpio and bzip2 archive zfs recieve media/mypictures@20070607 | cpio -i | bunzip2 -c ~/backups/20070607.bz2 
37
не забудьте `pax`: P Janus Troelsen 11 лет назад 0
связанные: https://serverfault.com/questions/148747/cpio-vs-tar-and-cp | https://unix.stackexchange.com/questions/169504/cpio-vs-tar-what-the-best-archive-solution-in-order-to-compress-hundred-of-dir | https://stackoverflow.com/questions/2966409/cpio-vs-tar-and-cp Ciro Santilli 新疆改造中心 六四事件 法轮功 6 лет назад 0

6 ответов на вопрос

60
ktf

В дополнение к тому, что было сказано ранее Гравитацией и Полом :

история

В «старые времена», CPIO (с опцией -cиспользуется) был инструмент, чтобы использовать, когда он пришел, чтобы переместить файлы в другие дериваты UNIX, так как это было более портативным и гибким, чем смолы . Но проблемы переносимости смолы можно считать решенными с конца 1980-х годов.

К сожалению, примерно в это время разные поставщики внедрили -cформат cpio (просто посмотрите на страницу руководства по GNU cpio и опцию -H). В то время tar стал более переносимым, чем cpio ... Потребовалось почти целое десятилетие, чтобы разные поставщики UNIX разобрались в этом. Имея GNU дегтя и GNU CPIO установлен было обязательным для всех администраторов, которые должны были иметь дело с лентами из различных источников, тогда (даже в настоящее время я полагаю).

Пользовательский интерфейс

tar может использовать файл конфигурации ленты, где администратор может настроить накопители на магнитной ленте, подключенные к системе. Затем пользователь просто сказал бы: «Ну, я возьму ленточный накопитель 1», вместо того, чтобы запоминать точный узел устройства для ленты (что может быть очень запутанным, а также не стандартизированным на разных платформах UNIX.

Но главное отличие заключается в следующем:

tar может самостоятельно искать каталоги и берет список файлов или каталогов, которые должны быть скопированы из аргументов командной строки.

cpio архивирует только те файлы или каталоги, к которым оно относится, но не выполняет рекурсивный поиск в подкаталогах. Также cpio получает список элементов, которые будут заархивированы из stdin - поэтому он почти всегда используется в сочетании с find .

Команда cpio часто выглядит пугающе для новичка по сравнению с tar :

 $ find myfiles -depth -print0 | cpio -ovc0 | gzip -7 > myfiles.cpio.gz $ tar czvf myfiles.tar.gz myfiles 

Я думаю, что это основная причина, по которой большинство людей используют tar для создания архивных файлов: для простых задач, таких как создание полного каталога, его просто использовать.

Также GNU tar предлагает опцию, -zкоторая заставляет архив сжиматься с помощью GNU zip на лету, что делает вещи еще проще.

С другой стороны, можно делать отличные вещи с помощью команды find & cpio . На самом деле это более UNIX-подобный подход: зачем включать поиск по дереву каталогов в cpio, если уже есть инструмент, который позаботится почти обо всем, что только можно придумать: find . На ум приходят только резервные копии файлов, которые новее определенной даты, ограничение файлов теми, которые находятся в одной файловой системе, или фильтрация поиска-вывода с помощью grep -vисключения определенных файлов ...

Люди из GNU tar потратили много времени на то, чтобы включить те вещи, которые раньше были возможны только с помощью cpio . На самом деле оба инструмента учились друг у друга - но только cpio может читать формат tar - не наоборот.

обработка смолы и выходных данных

Последнее замечание к тому, что вы сказали:

Также мне сказали, что TAR не может сжимать из STDOUT. Я хочу заархивировать / сжать моментальные снимки ZFS для резервного копирования. Мне было интересно, смогу ли я объединить CPIO с bzip2, чтобы получить этот эффект.

Ну, любая версия tar (GNU или нет) может использоваться в конвейере. Просто используйте знак минус ( -) в качестве имени архива:

 $ tar cvf - myfiles | bzip > myfiles.tar.bz 

Также GNU tar предлагает опцию --to-commandдля указания команды постпроцессора - хотя я бы все же предпочел трубу. Может быть, это полезно при записи на определенные устройства.

Очень поучительно, спасибо за информацию. ianc1215 12 лет назад 0
Разве это не «от STDIN», который отличается, а «от STDOUT» .. «от STDOUT» для меня не имеет смысла Joakim Elofsson 12 лет назад 0
Ну, я только цитировал оригинальный вопрос. Идея - это несколько неправильно сформулировано, но я думаю, что в этом есть смысл. ktf 12 лет назад 0
_ "Зачем включать поиск по дереву каталогов в cpio, если уже есть инструмент, который позаботится почти обо всем, о чем только можно подумать" _ Хороший вопрос, но тогда вам также придется запросить его для копирования (`cp`), перемещения (` mv `),` diff` и т. д .;-) Mecki 11 лет назад 3
trombonehero [сказал] (https://superuser.com/a/653498/129520): `tar в BSD использует libarchive под капотом, поэтому он может обрабатывать cpio, pax, shar`. вы сказали: `только cpio может читать формат tar`. разве это не противоречие? n611x007 8 лет назад 1
27
grawity

Оба tarи cpioимеют единственную цель: объединить множество отдельных файлов в один поток. Они не сжимают данные. ( В наши дни tarболее популярным из - за своей относительной простоте - он может принимать входные файлы в качестве аргументов вместо того, чтобы быть вместе с, findкак cpioесть.)

В вашем случае вам не нужен ни один из этих инструментов; они не будут иметь никакого полезного эффекта, потому что у вас не так много отдельных файлов. zfs sendуже сделал то же самое, tarчто сделал бы. Таким образом, у вас нет никаких файлов, только безымянный поток.

Чтобы сжать моментальный снимок, все, что вам нужно сделать, это направить zfsвывод через программу сжатия:

zfs send media/mypictures@20070607 | gzip -c > ~/backups/20070607.gz  gzip -dc ~/backups/20070607.gz | zfs receive media/mypictures@20070607 

(Вы можете заменить gzipс xzили bzip2или любым другим инструментом потока сжатия, если вы хотите.)

О, я вижу, так что мой вывод ZFS НЕ файлы его поток данных? Это объясняет, почему примеры Oracle не включают TAR в команды. ianc1215 12 лет назад 0
@Solignis: Вы можете думать об этом так: `zfs send` уже делает то же самое, что делал бы` tar`. grawity 12 лет назад 0
6
Paul

У tar и cpio, по сути, одна и та же функция, которая заключается в создании единого непрерывного файла из множества файлов и каталогов. Первоначально это было для того, чтобы поместить результат на ленту, но в наши дни он обычно используется для подачи в утилиту сжатия, как вы делали выше. Это связано с тем, что сжатие одного большого файла требует больше времени и пространства, чем сжатие большого количества маленьких файлов. Вы должны заметить, что многие форматы изображений (png, jpg и т. Д.) Уже сильно сжаты и могут даже стать немного больше, если использовать утилиту сжатия.

Ни tar, ни cpio не делают сжатия самостоятельно. Tar эффективно «выиграл» войну «что мы будем использовать для создания совокупных файлов», но cpio может найти его в разных местах. Я не знаю ни о каких преимуществах одного над другим, деготь выигрывает благодаря более частому использованию.

tar действительно может принимать входные данные в stdin и выводить в stdout - который затем будет передан в bzip2, как у вас, или что-то подобное. Если вызывается с параметром «z», он автоматически вызывает gzip на выходе.

Да и не `-j` для вызова bzip2? ianc1215 12 лет назад 1
да, -j это bzip2, а некоторые (более возмущенные?) версии получили -J как xv, для GNUtar thatis Joakim Elofsson 12 лет назад 2
Самые последние версии GNU tar могут даже угадать желаемый формат сжатия по имени файла архива, когда вы используете опцию -a. Так вот: `tar -caf myfiles.tar.xz myfiles /` сжимается с помощью `xz`, а этот` tar -caf myfiles.tar.gz myfiles / `сжимается с помощью` gzip`. gerlos 8 лет назад 4
4
trombonehero

Также стоит отметить: на (по крайней мере) FreeBSD и Mac OS X вы можете манипулировать файлами cpio с помощью tar. BSD tar использует libarchive под капотом, поэтому он может обрабатывать cpio, pax, shar ...

Это означает, что проблемы с удобством использования cpioкоманды не должны мешать вам взаимодействовать с файлами cpio.

ktf [сказал] (https://superuser.com/a/343943/129520): `только cpio может читать формат tar`. вы сказали: `BSD tar использует libarchive под капотом, поэтому он может обрабатывать cpio, pax, shar`. разве это не противоречие? n611x007 8 лет назад 0
@ n611x007 Этот ответ говорит о смоле BSD. Другой, вероятно, говорит о GNU tar. Это разные программы. Navin 8 лет назад 1
2
Lynn

Я попросил техническую поддержку HP в ок. 1996, почему использование cpioзакончено tar.

Мне сказали, что ленты растягиваются и изнашиваются. При tarдостижении нечитаемой части ленты происходит сбой и возвращается номер ошибки. Когда cpioдостигает нечитаемой части, она переходит к следующему читаемому блоку, выполняет повторную синхронизацию и продолжается.

Я никогда не видел документацию, подтверждающую это, но всегда использовал cpio.

Согласно сообщению, битовое повреждение tar, похоже, локализовано в области / файлах, на которые он влияет, так же, как вы говорили о cpio. http://oxfordrepo.blogspot.tw/2008/12/archive-file-resiliences.html okwap 6 лет назад 0
1
haridsv

Хотя ответы здесь уже сравниваются cpioи tarочень хорошо, я хотел бы выделить одну из cpioфункций, называемых конвейерным режимом, которая позволяет более эффективно копировать отдельные файлы (например, через findи фильтровать), сохраняя при этом их структуру каталогов. Эта функция хорошо документирована и в своей основной предпосылке выглядит следующим образом:

find . <predicates> | cpio -pdmv /destination/dir 

Эквивалент с tarбудет включать что-то вроде этого:

find . <predicates> | tar -T - -cf - | (cd /destination/dir; tar xvf -) 

Конечно, есть и другие альтернативы, такие как rsyncи cp --parentsобсуждаемые в другой ветке, но ничто не сравнится с гибкостью, предлагаемой комбинацией findи cpio. Ввиду tarповсеместного создания архивов, это единственная причина, по которой я до сих пор пользуюсь cpio.

Похожие вопросы