cpio VS tar и cp
Я только что узнал, что у cpio есть три режима: копирование, копирование и пропуск.
Мне было интересно, каковы преимущества и недостатки cpio в режимах копирования и копирования по сравнению с tar. Когда лучше использовать cpio и когда использовать tar?
Аналогичный вопрос для cpio в режиме сквозного доступа по сравнению с cp.
Спасибо и всего наилучшего!
4 ответа
Это чрезвычайно общий обзор:
CPIO лучше справляется с копированием файловой системы, включая создание резервных копий. Он сохраняет такие вещи, как жесткие ссылки, fifos и другие нестандартные функции файла. Большинство реализаций CPIO делают все, что делает TAR, включая чтение и запись файлов.tar. CPIO обычно принимает список файлов из стандартного ввода в архив; это позволяет очень легко передать список из чего-то другого (например, find
).
Прохождение CPIO очень полезно, если у вас есть очень длинный список файлов, которые вы хотите скопировать из каталога A в каталог B. (Например, вы можете использовать find
найти все файлы, которые изменились за последние 2 года в вашей системе)
TAR лучше справляется с простой выгрузкой всех ваших стандартных файлов на ленту (или из архива). Это немного проще в использовании (для наиболее распространенных задач). Он легко отвечает требованиям простого резервного копирования большинства людей; и большая часть его популярности происходит от этого факта.
А теперь для мелкого шрифта. Существует несколько разных версий и реализаций CPIO и TAR. Каждый из них имеет свои особенности, а некоторые имеют разные параметры командной строки. Есть вещи, которые каждый может сделать там, где другой не может; если вы ограничены одним, попробуйте другой. У каждого есть любимый, и 99% времени либо выполнят задачу.
На AE 3 redhat я обнаружил, что cpio имеет ограничение размера 2 ГБ в выходном потоке. Однако tar не имел этого ограничения.
Другие системы могут иметь другие ограничения.
Я понимаю из комментариев и другой информации, что
cpio
стал менее распространенным и несовместимым между версиями. Но
cpio
имеет одно преимущество, которое я недавно нашел бесценным при работе с большим количеством поврежденных архивов tar. Он не останавливается на первой ошибке в tar-файле, но пытается пропустить плохие данные и извлечь как можно больше. Например,
tar xf ./sample.corrupt.tar
напечатает
tar: Skipping to next header
tar: Exiting with failure status due to previous errors
после первой обнаруженной ошибки, тогда как
cpio -F ./sample.corrupt.tar -i -v
распечатает извлеченные файлы и для каждой ошибки напечатает:
cpio: invalid header: checksum error
cpio: warning: skipped 6 bytes of junk
cpio: invalid header: checksum error
cpio: warning: skipped 2 bytes of junk
etc...
Формат tar предполагает, что каждый заголовок архива будет выровнен по границе 512, но если повреждение неправильно выравнивает заголовки,
cpio
делает все возможное, чтобы извлечь как можно больше
Я не вижу причин использовать cpio по любой другой причине, кроме копирования открытых файлов RPM через disrpm или rpm2cpio, но могут быть случаи, когда cpio предпочтительнее tar.
История и популярность
И tar, и cpio являются конкурирующими форматами архивов, которые были введены в Версии 7 Unix в 1979 году, а затем включены в POSIX. 1-1988, хотя в следующем стандарте, POSIX.1-2001 1, остался только tar 1.
Формат файла Cpio менялся несколько раз и не оставался полностью совместимым между версиями. Например, теперь существует ASCII-кодированное представление данных двоичного файла.
Tar известен более широко, с годами стал более универсальным и, скорее всего, будет поддерживаться в данной системе. Cpio все еще используется в некоторых областях, таких как формат пакета Red Hat (RPM), хотя RPM v5 (который по общему признанию неясен) использует xar вместо cpio.
Оба живут в большинстве Unix-подобных систем, хотя tar более распространен. Вот статистика установки Debian:
#rank name inst vote old recent no-files (maintainer)
13 tar 189206 172133 3707 13298 68 (Bdale Garbee)
61 cpio 189028 71664 96346 20920 98 (Anibal Monsalve Salazar)
Режимы
Копирование: это для создания архива, сродни tar -pc
Копирование: это для извлечения архива, сродни tar -px
Сквозной: это в основном оба из вышеперечисленных, сродни tar -pc … |tar -px
но в одной команде (и, следовательно, микроскопически быстрее). Это похоже на cp -pdr
хотя и cpio, и (особенно) tar имеют больше возможностей для настройки. Также рассмотрим rsync -a
, о которых люди часто забывают, так как он чаще используется через сетевое соединение.
Я не сравнивал их производительность, но ожидаю, что они будут очень похожи по процессору, памяти и размеру архива (после сжатия).
Я тоже предпочитаю CPIO. Однако при использовании cpio
с набором файлов неизвестного происхождения (например, файлами, созданными конечными пользователями) лучше работать с NUL
имена файлов: использовать -print0
пометить, чтобы найти и добавить 0
флаг для cpio
, Таким образом, файлы со странными именами (например, включая CRNL
символы) будут обрабатываться правильно.
cd / && find . -xdev -print0 | cpio -pmdu0 /mnt/