Чим відрізняються формати файлів архіву TAR від CPIO?


41

Мені цікаво і трохи читаю, але все ще є питання.

Що 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

не забувайте pax: P
Janus Troelsen

Відповіді:


28

Обидва 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

1
@Solignis: Ви можете подумати про це так: zfs sendвже робить те саме, що tarбуло б.
grawity

62

На додаток до того, що було сказано раніше, милосердя та Павло :

Історія

У «старі часи», CPIO (з опцією -cвикористовується) був інструмент , щоб використовувати , коли він прийшов , щоб перемістити файли в інші деривати UNIX , так як це було більш портативним і гнучким , ніж смоли . Але переносимість смоли може вважатися вирішеною з кінця 1980-х.

На жаль, саме в цей час різні постачальники допрацювали -cформат cpio (просто подивіться на сторінку керівництва для GNU cpio та опцію -H). У той час дьоготь став більш портативним, ніж cpio ... Минуло майже ціле десятиліття, поки різні постачальники UNIX не розібралися з цим. Маючи GNU дьогтю і GNU CPIO встановлений був обов'язковим для всіх адміністраторів , які повинні були мати справу з стрічками з різних джерел , тоді (навіть в даний час я вважаю).

Інтерфейс користувача

tar може використовувати файл конфігурації стрічки, де адміністратор налаштував би стрічкові накопичувачі, підключені до системи. Потім користувач просто скаже «Добре я візьму стрічковий накопичувач 1» замість того, щоб пам’ятати точний вузол пристрою для стрічки (що може бути дуже заплутаним, а також не стандартизовано для різних платформ UNIX.

Але головна відмінність:

tar здатний самостійно здійснювати пошук у каталогах та приймає список файлів чи каталогів, які слід створити резервну копію з аргументів командного рядка.

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

Команда cpio часто виглядає для початківця страхітливою у порівнянні з дьогтем :

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

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

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

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

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

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

Остання остання нота до того, що ви сказали:

Також мені сказали, що TAR не може стискатися з STDOUT. Я хочу архівувати / стискати знімки ZFS для створення резервних копій. Мені було цікаво, чи можна комбінувати CPIO з bzip2, щоб отримати цей ефект.

Що ж, будь-яка версія дьогтю (GNU чи ні) може використовуватися в трубі. Просто використовуйте знак мінус ( -) як назву архіву:

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

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


чи не буде це "від STDIN", що відрізняється, а не "STDOUT" .. "від STDOUT" для мене насправді не має сенсу
Joakim Elofsson

Ну, я лише цитував оригінальне запитання. Ідея - це дещо неправильно, але я думаю, що хтось отримує бал.
ktf

3
"Навіщо включати пошук дерева каталогів у cpio, якщо вже є інструмент, який піклується про майже всіх, хто може подумати" Хороший питання, але тоді вам доведеться також запитати його для copy ( cp), move ( mv) diffтощо; - )
Мецькі

1
trombonehero сказав : BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. Ви сказали: only cpio may read the format of tar. Хіба це не протиріччя?
n611x007

6

tar і cpio по суті мають одну і ту ж функцію, яка полягає у створенні єдиного суміжного файлу з введення декількох файлів і каталогів. Спочатку це було для нанесення результату на стрічку, але в наші дні зазвичай використовується для подачі в утиліту стиснення, як у вас вище. Це пояснюється тим, що стиснення одного великого файлу є більш економічним за часом та простором, ніж стискання безлічі невеликих файлів. Слід зазначити, що багато форматів зображень (png, jpg тощо) вже сильно стиснуті і можуть насправді отримати трохи більше, якщо поставити його через утиліту стиснення.

Ні дьоготь, ні кпіо не роблять компресії самостійно. Тар ефективно "виграв" війну "що ми будемо використовувати для створення сукупних файлів" війни, але cpio отримує вигляд у різних місцях. Я не знаю жодних переваг однієї над іншою, дьоготь виграє завдяки більш частому використанню.

tar дійсно може брати вклад на stdin та виводити в stdout - який би потім передавався на bzip2, як у вас, або щось подібне. Якщо викликати за допомогою параметра "z", він автоматично викликає gzip на виході.


1
Так, і не -jпотрібно викликати bzip2?
ianc1215

2
так, -j - це bzip2, а деякі (більш обурені?) версії отримали -J як xv, для GNUtar thatis
Йоакім Елофссон

4
У останніх версіях GNU tar навіть можна здогадатися про потрібний формат стиснення з імені файлу архіву при використанні опції -a. Отже це: tar -caf myfiles.tar.xz myfiles/буде стискати за допомогою, xzі це tar -caf myfiles.tar.gz myfiles/буде стискати за допомогою gzip.
герлос

5

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

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

Я ніколи не бачив документації на підтвердження цього, але завжди використовувався cpio.


Відповідно до публікації, пошкоджене пошкодження дьогтю, здається, локалізується у зоні / файлах, на які він впливає, так само, як ви розповідали про cpio. oxfordrepo.blogspot.tw/2008/12/archive-file-resiliences.html
okwap

4

Також варто відзначити: на (принаймні) FreeBSD та Mac OS X можна керувати файлами cpio за допомогою tar. Дьоготь BSD використовує лібархію під кришкою, щоб він міг працювати з cpio, pax, shar ...

Це означає, що проблеми користування cpioкомандою не повинні перешкоджати вам взаємодії з файлами cpio.


KTF сказав : only cpio may read the format of tar. Ви сказали: BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. Хіба це не протиріччя?
n611x007

1
@ n611x007 Ця відповідь говорить про BSD tar. Інший, мабуть, говорить про дьоготь GNU. Вони різні програми.
Навін

3

Хоча відповіді тут вже порівнюються 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.