Jaka jest różnica między formatami plików archiwów TAR a CPIO?

41

Jestem ciekawa i trochę czytałam, ale wciąż mam pytania.

Co różni CPIO od TAR? W innym pytaniu powiedziano mi, że tar służy do zebrania wielu plików do jednego archiwum, które wtedy jest zwykle gzip'd lub bzip.

Powiedziano mi również, że TAR nie może kompresować z STDOUT. Chcę archiwizować / kompresować migawki ZFS do tworzenia kopii zapasowych. Zastanawiałem się, czy mógłbym połączyć CPIO z bzip2, aby uzyskać ten efekt.

Czy mam zupełnie zły pomysł? Czy nie taki jest cel CPIO?

Tego rodzaju polecenia pojawiły się po przeczytaniu, więc dokumentacja Oracle dotycząca tworzenia kopii zapasowych migawek 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
ianc1215
źródło
nie zapomnij pax: P
Janus Troelsen

Odpowiedzi:

28

Zarówno tari cpiomają jeden cel: złączyć wiele oddzielnych plików do jednego strumienia. Nie kompresują danych. (Te dni tarsą bardziej popularne ze względu na ich względną prostotę - może przyjmować pliki wejściowe jako argumenty zamiast być łączone z tym, findco cpioma).

W twoim przypadku nie potrzebujesz żadnego z tych narzędzi; nie przyniosą żadnego użytecznego efektu, ponieważ nie masz wielu oddzielnych plików. zfs sendjuż zrobiłem to samo, co tarby zrobił. Więc nie masz żadnych plików, tylko strumień bezimienny.

Aby skompresować migawkę, wystarczy przesłać dane zfswyjściowe przez program do kompresji:

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

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

(Można zastąpić gzipz xzlub bzip2czy jakiekolwiek inne narzędzie strumień kompresji, jeśli chcesz).

grawitacja
źródło
Och, rozumiem, więc moje dane wyjściowe ZFS NIE są plikami, to strumień danych? To by wyjaśniało, dlaczego przykłady Oracle nie zawierają TAR w poleceniach.
ianc1215
1
@ Solignis: Możesz myśleć o tym w ten sposób: zfs sendjuż robi to samo, co tarby zrobił.
grawity
62

Oprócz tego, co wcześniej powiedzieli grawity i Paul :

Historia

W „dawnych czasach”, cpio (z opcją -cużywany) był narzędzie do wykorzystania, gdy przyszło do przenoszenia plików do innych pochodnych UNIX, ponieważ był bardziej mobilny i elastyczny niż smoła . Ale problemy z przenoszeniem zawartości substancji smolistych można uznać za rozwiązane od późnych lat osiemdziesiątych.

Niestety, w tym czasie różni dostawcy zniekształcili -cformat cpio (wystarczy spojrzeć na stronę podręcznika dla GNU cpio i tej opcji -H). W tym czasie smoła stała się bardziej przenośna niż CPIO ... Zajęło to prawie całą dekadę, zanim różni dostawcy UNIXa to rozwiązali. Mając GNU tar i GNU cpio zainstalowana była obowiązkowa dla wszystkich administratorów, które miały do czynienia z taśmami z różnych źródeł, a następnie z powrotem (nawet w dzisiejszych czasach jak mniemam).

Interfejs użytkownika

tar może użyć pliku konfiguracji taśmy, w którym administrator skonfigurowałby napędy taśm podłączone do systemu. Użytkownik powiedziałby wtedy „Cóż, wezmę napęd taśmowy 1” zamiast pamiętać dokładny węzeł urządzenia dla taśmy (co może być bardzo mylące i nie jest standaryzowane na różnych platformach UNIX.

Ale główna różnica polega na:

tar potrafi samodzielnie przeszukiwać katalogi i pobiera listę plików lub katalogów, których kopie zapasowe należy utworzyć z argumentów wiersza poleceń.

cpio archiwizuje tylko pliki lub katalogi, do których jest skierowany, ale nie przeszukuje podkatalogów samodzielnie. Również cpio pobiera listę elementów, które należy zarchiwizować ze standardowego wejścia - dlatego prawie zawsze jest używany w połączeniu z funkcją find .

Cpio polecenia często wygląda przerażające dla początkujących w porównaniu ze smoły :

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

Myślę, że to jest główny powód, dla którego większość ludzi używa tar do tworzenia plików archiwalnych: w przypadku prostych zadań, takich jak łączenie całego katalogu, jest to po prostu łatwiejsze w użyciu.

Również GNU tar oferuje opcję, -zktóra powoduje, że archiwum jest kompresowane za pomocą GNU zip w locie, dzięki czemu wszystko jest jeszcze łatwiejsze.

Z drugiej strony można robić sprytne rzeczy za pomocą find & cpio . W rzeczywistości jest to podejście bardziej podobne do systemu UNIX: Po co włączać wyszukiwanie drzewa katalogów do cpio, jeśli istnieje już narzędzie, które zajmuje się prawie wszystkim, co można sobie wyobrazić: znaleźć . Przychodzi mi na myśl tworzenie kopii zapasowych plików nowszych niż określona data, ograniczanie plików do plików znajdujących się w tym samym systemie plików lub filtrowanie wyników wyszukiwania w grep -vcelu wykluczenia niektórych plików ...

Ludzie GNU tar spędzili dużo pracy, aby uwzględnić wiele rzeczy, które wcześniej były możliwe tylko z cpio . W rzeczywistości oba narzędzia uczyły się od siebie nawzajem - ale tylko procesor może odczytać format tar - nie na odwrót.

przetwarzanie smoły i danych wyjściowych

Ostatnia uwaga do czegoś, co powiedziałeś:

Powiedziano mi również, że TAR nie może kompresować z STDOUT. Chcę archiwizować / kompresować migawki ZFS do tworzenia kopii zapasowych. Zastanawiałem się, czy mógłbym połączyć CPIO z bzip2, aby uzyskać ten efekt.

Cóż, każda wersja tar (GNU lub nie) może być używana w potoku. Wystarczy użyć znaku minus ( -) jako nazwy archiwum:

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

Również GNU tar oferuje opcję --to-commandokreślenia polecenia postprocesora - chociaż nadal wolałbym potok. Może przydaje się podczas pisania na niektóre urządzenia.

ktf
źródło
czy nie byłoby inaczej „ze STDIN” niż „STDOUT” .. „ze STDOUT” nie ma dla mnie sensu
Joakim Elofsson,
Cóż, cytowałem tylko oryginalne pytanie. Ideed - to jest trochę źle sformułowane, ale myślę, że jeden ma sens.
ktf
3
„Po co dołączać wyszukiwanie drzewa katalogów do cpio, jeśli istnieje już narzędzie, które zajmuje się prawie wszystkim, co można sobie wyobrazić” Dobre pytanie, ale wtedy musielibyśmy również zadać to pytanie o copy ( cp), move ( mv) diffitd.; - )
Mecki,
1
trombonehero powiedział : BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. powiedziałeś: only cpio may read the format of tar. czy to nie jest sprzeczność?
n611x007,
6

tar i cpio mają zasadniczo tę samą funkcję, czyli tworzenie jednego ciągłego pliku z danych wejściowych wielu plików i katalogów. Pierwotnie miało to na celu umieszczenie wyniku na taśmie, ale w dzisiejszych czasach jest on zwykle używany jako narzędzie do kompresji, tak jak to opisano powyżej. Jest tak, ponieważ kompresja pojedynczego dużego pliku zajmuje więcej czasu i miejsca niż kompresja wielu małych plików. Należy zauważyć, że wiele formatów graficznych (png, jpg itp.) Jest już mocno skompresowanych i może faktycznie stać się nieco większych, jeśli zostaną poddane kompresji.

Ani tar, ani cpio nie wykonują żadnej kompresji samodzielnie. Tar skutecznie „wygrał” wojnę o „to, czego będziemy używać do tworzenia plików zbiorczych”, ale cpio szuka w różnych miejscach. Nie jestem świadomy żadnych korzyści z jednej strony, smoła wygrywa przez to, że jest częściej używana.

tar może rzeczywiście pobierać dane wejściowe na stdin i wysyłać je na stdout - które następnie byłyby przesyłane do bzip2 tak jak ty lub coś podobnego. Wywołany opcją „z”, automatycznie wywoła gzip na wyjściu.

Paweł
źródło
1
Tak i nie -jma wywoływać bzip2?
ianc1215,
2
tak, -j to bzip2, a niektóre (bardziej urażone?) wersje otrzymały -J jako xv, dla GNUtar thatis
Joakim Elofsson
4
Najnowsze wersje GNU tar potrafią nawet odgadnąć żądany format kompresji na podstawie nazwy pliku archiwum, gdy używasz opcji -a. Więc to: tar -caf myfiles.tar.xz myfiles/kompresuje za pomocą xzi to tar -caf myfiles.tar.gz myfiles/kompresuje za pomocą gzip.
gerlos
5

Poprosiłem o pomoc techniczną HP w ok. 1996 dlaczego używać cpioponad tar.

Powiedziano mi, że taśmy rozciągają się i zużywają. Gdy tarosiągnie nieczytelną część taśmy, nie powiedzie się i zwróci numer błędu. Gdy cpioosiągnie nieczytelną część, przechodzi do następnego czytelnego bloku, ponownie synchronizuje i kontynuuje.

Nigdy nie widziałem dokumentacji na poparcie tego, ale zawsze używane cpio.

Lynn
źródło
Zgodnie z postem, bitowe uszkodzenie tar wydaje się być zlokalizowane w obszarze / plikach, na które wpływa, tak samo jak powiedziałeś o cpio. oxfordrepo.blogspot.tw/2008/12/archive-file-resiliences.html
okwap
4

Warto również zauważyć: na (przynajmniej) FreeBSD i Mac OS X można manipulować plikami CPIO za pomocą tar. BSD tar używa libarchive pod maską, więc może obsługiwać cpio, pax, shar ...

Oznacza to, że problemy z użytecznością cpiopolecenia nie muszą powstrzymywać Cię przed interakcją z plikami CPIO.

puzon
źródło
KTF powiedział : only cpio may read the format of tar. powiedziałeś: BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. czy to nie jest sprzeczność?
n611x007,
1
@ n611x007 Ta odpowiedź mówi o tar BSD. Drugi prawdopodobnie mówi o tar GNU. Są to różne programy.
Navin,
3

Podczas gdy odpowiedzi tutaj już się porównują cpioi tarbardzo dobrze, chciałbym podkreślić jedną z cpiofunkcji zwaną trybem potokowym, która sprawia, że ​​bardziej wydajne jest kopiowanie wybranych plików (tj. Poprzez findi filtrowanie) przy jednoczesnym zachowaniu ich struktury katalogów. Ta funkcja jest dobrze udokumentowana, a jej podstawowa zasada wygląda następująco:

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

Odpowiednik z tarobejmowałby coś takiego:

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

Istnieją oczywiście inne alternatywy, takie jak rsynci cp --parentsomówione w innym wątku , ale nic nie zbliża się do elastyczności oferowanej przez kombinację findi cpio. Ponieważ tarjestem wszechobecny w tworzeniu archiwów, jest to jedyny powód, dla którego wciąż go używam cpio.

haridsv
źródło