Was ist der Unterschied zwischen TAR- und CPIO-Archivdateiformaten?

28346
ianc1215

Ich bin neugierig und habe etwas gelesen, habe aber noch Fragen.

Was unterscheidet CPIO von TAR? In einer anderen Frage wurde mir gesagt, dass tar für das Zusammenfügen vieler Dateien in einem Archiv ist, das dann normalerweise gzip'd oder bzip'd ist.

Mir wurde auch gesagt, TAR kann nicht von STDOUT komprimiert werden. Ich möchte ZFS-Momentaufnahmen für Backups archivieren / komprimieren. Ich habe mich gefragt, ob ich CPIO mit bzip2 kombinieren könnte, um diesen Effekt zu erzielen.

Oder habe ich die völlig falsche Vorstellung? Ist das nicht der Zweck von CPIO?

Dies ist die Art von Befehlen, die ich nach dem Lesen erhalten habe, und Oracle empfiehlt, ZFS-Snapshots zu sichern.

# 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" nicht vergessen: P Janus Troelsen vor 11 Jahren 0
verwandt: 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-hundert-of-dir | https://stackoverflow.com/questions/2966409/cpio-vs-tar-and-cp Ciro Santilli 新疆改造中心 六四事件 法轮功 vor 6 Jahren 0

6 Antworten auf die Frage

60
ktf

Zusätzlich zu dem, was vorher von Grawity und Paul gesagt wurde :

Geschichte

In den "alten Zeiten" war cpio (mit der verwendeten Option -c) das Werkzeug, das zum Verschieben von Dateien in andere UNIX-Derivate verwendet werden sollte, da es portabler und flexibler war als tar . Die Probleme mit der Teerportabilität können jedoch seit den späten achtziger Jahren als gelöst gelten.

Unglücklicherweise war es zu dieser Zeit, dass verschiedene Hersteller das -cFormat von cpio durcheinander gebracht hatten (siehe die Manpage zu GNU cpio und die Option -H). Damals war tar mehr portabel als cpio ... Es dauerte fast ein ganzes Jahrzehnt, bis die verschiedenen UNIX-Anbieter das Problem gelöst hatten. Die Installation von GNU tar und GNU cpio war ein Muss für alle Admins, die sich damals mit Bändern aus verschiedenen Quellen befassen mussten (selbst ich nehme an, dass dies heutzutage der Fall ist).

Benutzeroberfläche

tar kann eine Bandkonfigurationsdatei verwenden, in der der Administrator die an das System angeschlossenen Bandlaufwerke konfigurieren würde. Der Benutzer würde dann einfach sagen "Nun, ich nehme Bandlaufwerk 1", anstatt sich an den genauen Geräteknoten für das Band zu erinnern (was sehr verwirrend sein kann und auch nicht auf verschiedenen UNIX-Plattformen standardisiert ist).

Der Hauptunterschied ist jedoch:

tar kann Verzeichnisse selbst durchsuchen und nimmt die Liste der zu sichernden Dateien oder Verzeichnisse anhand von Befehlszeilenargumenten an.

cpio archiviert nur die Dateien oder Verzeichnisse, denen es mitgeteilt wird, durchsucht aber Unterverzeichnisse nicht selbst rekursiv. Auch cpio wird die Liste der Elemente von zu archivier stdin - deshalb ist es fast immer mit in Kombination verwendet finden .

Ein cpio- Befehl sieht für Anfänger im Vergleich zu Teer oft furchterregend aus :

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

Ich denke, das ist der Hauptgrund, warum die meisten Benutzer tar verwenden, um Archivdateien zu erstellen: Für einfache Aufgaben wie das Bündeln eines vollständigen Verzeichnisses ist es einfacher zu bedienen.

Auch GNU tar bietet die Möglichkeit -z, das Archiv mit GNU zip im laufenden Betrieb zu komprimieren, was die Sache noch einfacher macht.

Andererseits kann man mit find & cpio nette Dinge machen . Tatsächlich handelt es sich dabei eher um einen UNIX-ähnlichen Ansatz: Warum sollten Sie die Verzeichnisbaumsuche in cpio einschließen, wenn es bereits ein Tool gibt, das sich um fast alles kümmert, was Sie sich vorstellen können: find . Dinge, die mir in den Sinn kommen, sichern nur Dateien, die neuer als ein bestimmtes Datum sind, beschränken die Dateien auf diejenigen, die sich im selben Dateisystem befinden, oder filtern die find-output mit grep -v, um bestimmte Dateien auszuschließen ...

Die Leute von GNU tar haben viel Arbeit investiert, um viele Dinge aufzunehmen, die bisher nur mit cpio möglich waren . Tatsächlich haben beide Tools voneinander gelernt - aber nur cpio kann das Format von tar lesen - nicht umgekehrt.

Teer- und Ausgabeverarbeitung

Eine letzte Anmerkung zu etwas, das Sie gesagt haben:

Mir wurde auch gesagt, TAR kann nicht von STDOUT komprimiert werden. Ich möchte ZFS-Momentaufnahmen für Backups archivieren / komprimieren. Ich habe mich gefragt, ob ich CPIO mit bzip2 kombinieren könnte, um diesen Effekt zu erzielen.

Nun, jede Version von tar (GNU oder nicht) kann in einer Pipe verwendet werden. Verwenden Sie einfach ein Minuszeichen ( -) als Archivnamen:

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

Auch GNU tar bietet die Möglichkeit, --to-commandeinen Post - Prozessor - Befehl angeben - obwohl ich würde immer noch das Rohr bevorzugen. Vielleicht ist es hilfreich beim Schreiben auf bestimmte Hardwaregeräte.

Sehr aufschlussreich, danke für die Informationen. ianc1215 vor 13 Jahren 0
Wäre es nicht "von STDIN", das sich unterscheidet, statt "zu STDOUT". "Von STDOUT" ist für mich nicht wirklich sinnvoll Joakim Elofsson vor 13 Jahren 0
Nun, ich habe nur die ursprüngliche Frage zitiert. Ideed - es ist etwas falsch formuliert, aber ich denke, man hat den Punkt verstanden. ktf vor 13 Jahren 0
_ "Warum die Verzeichnisbaumsuche in cpio einschließen, wenn es bereits ein Tool gibt, das sich um fast alles kümmert, was man sich vorstellen kann" _ Gute Frage, aber dann müsste man es auch nach einer Kopie (`cp`) fragen, verschieben (` mv `),` diff` usw. ;-) Mecki vor 11 Jahren 3
trombonehero [sagte] (https://superuser.com/a/653498/129520): `BSD-Teer verwendet libarchive unter der Haube, damit kann es mit cpio, pax, shar umgehen." Sie haben gesagt: "Nur cpio kann das Format von Teer lesen." Ist das nicht ein Widerspruch? n611x007 vor 8 Jahren 1
27
grawity

Beides tarund cpiohaben einen einzigen Zweck: Verketten Sie viele separate Dateien zu einem einzigen Stream. Sie komprimieren keine Daten. (Heutzutage tarist es aufgrund seiner relativen Einfachheit beliebter - es kann Eingabedateien als Argumente verwenden, anstatt mit findas wie gekoppelt zu werden cpio.)

In Ihrem Fall benötigen Sie keines dieser Tools. Sie hätten keine nützliche Wirkung, da Sie nicht viele separate Dateien haben. zfs sendtat schon dasselbe, was targetan hätte. Sie haben also keine Dateien, nur einen namenlosen Stream.

Um den Snapshot zu komprimieren, müssen Sie die zfsAusgabe nur durch ein Komprimierungsprogramm leiten:

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

(Sie können gzipmit xzoder bzip2oder einem anderen Stream-Komprimierungswerkzeug ersetzen, wenn Sie möchten.)

Oh ich verstehe, also ist meine ZFS-Ausgabe NICHT ein Datenstrom? Das würde erklären, warum die Oracle-Beispiele keine TAR in die Befehle aufnehmen. ianc1215 vor 13 Jahren 0
@ Solignis: Man kann sich das so vorstellen: `zfs send` macht bereits dasselbe wie` tar`. grawity vor 13 Jahren 0
6
Paul

tar und cpio haben im Wesentlichen die gleiche Funktion, nämlich das Erstellen einer einzigen zusammenhängenden Datei aus einer Eingabe mehrerer Dateien und Verzeichnisse. Ursprünglich sollte das Ergebnis auf Band gespeichert werden, heutzutage wird es jedoch normalerweise verwendet, um ein Kompressionsprogramm wie oben beschrieben zu verwenden. Dies liegt daran, dass das Komprimieren einer einzelnen großen Datei zeit- und platzsparender ist als das Komprimieren vieler kleiner Dateien. Sie sollten beachten, dass viele Bildformate (png, jpg usw.) bereits stark komprimiert sind und tatsächlich etwas größer werden können, wenn sie ein Komprimierungsprogramm verwenden.

Weder tar noch cpio führen selbst eine Komprimierung durch. Tar hat praktisch das gewonnen, was wir verwenden sollen, um Aggregate-Dateien zu erstellen, aber cpio bekommt an verschiedenen Stellen einen Blick. Ich kenne keine Vorteile des einen gegenüber dem anderen, Teer gewinnt, indem es häufiger verwendet wird.

tar kann zwar Eingaben für stdin und ausgaben für stdout übernehmen - die dann wie bzgl. in bzip2 geleitet werden oder ähnliches. Bei Aufruf mit der Option "z" wird automatisch gzip für die Ausgabe aufgerufen.

Ja und ist nicht -j, um bzip2 aufzurufen? ianc1215 vor 13 Jahren 1
Ja, -j ist bzip2 und einige (mehr nachgesendete?) Versionen haben -J als xv erhalten, für GNUtar thatis Joakim Elofsson vor 13 Jahren 2
Die aktuellsten Versionen von GNU tar können sogar das gewünschte Komprimierungsformat anhand des Archivdateinamens erraten, wenn Sie die Option -a verwenden. Also folgendes: `tar -caf myfiles.tar.xz myfiles /` wird mit `xz` komprimiert und dieses` tar -caf myfiles.tar.gz myfiles / `wird mit` gzip` komprimiert. gerlos vor 9 Jahren 4
4
trombonehero

Erwähnenswert: Auf (zumindest) FreeBSD und Mac OS X können Sie cpio-Dateien mit tar bearbeiten. BSD-Teer verwendet libarchive unter der Haube, damit kann es mit cpio, pax, shar ...

Dies bedeutet, dass die Benutzerfreundlichkeitsprobleme des cpioBefehls Sie nicht daran hindern müssen, mit cpio-Dateien zu interagieren.

ktf [sagte] (https://superuser.com/a/343943/129520): `Nur cpio kann das Format von tar lesen. ' Sie haben gesagt: "BSD-Teer verwendet libarchive unter der Haube, damit kann es mit cpio, pax, shar umgehen". Ist das nicht ein Widerspruch? n611x007 vor 8 Jahren 0
@ n611x007 Diese Antwort bezieht sich auf BSD-Teer. Die andere spricht wahrscheinlich von GNU-Teer. Sie sind verschiedene Programme. Navin vor 8 Jahren 1
2
Lynn

Ich habe einen HP technischen Support in ca. 1996 warum cpiomehr als tar.

Mir wurde gesagt, dass sich die Bänder dehnen und abnutzen. Wenn tarein nicht lesbarer Teil des Bandes erreicht wird, schlägt das Band fehl und es wird die Fehlernummer zurückgegeben. Wenn cpioein nicht lesbarer Teil erreicht wird, wird mit dem nächsten lesbaren Block fortgefahren, es wird erneut synchronisiert.

Ich habe noch nie Unterlagen gesehen, die dies unterstützen, aber immer verwendet cpio.

Dem Beitrag zufolge scheint der bitweise Schaden von Teer in dem Bereich / den Dateien, auf den er wirkt, lokalisiert zu sein, genau wie Sie es von cpio erfahren haben. http://oxfordrepo.blogspot.tw/2008/12/archive-file-resiliences.html okwap vor 6 Jahren 0
1
haridsv

Während die Antworten hier schon vergleichen cpiound tarsehr gut, würde Ich mag eine der Highlight cpio‚s Funktionen Pipeline - Modus genannt, die sie effizienter macht selektiv Dateien zu kopieren (dh über findund Filter), während ihre Verzeichnisstruktur erhalten bleibt. Diese Funktion ist gut dokumentiert und sieht in ihrer Grundannahme folgendermaßen aus:

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

Das Äquivalent mit tarwürde so etwas beinhalten:

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

Es gibt natürlich andere Alternativen wie rsyncund, cp --parentsdie in einem anderen Thread diskutiert werden, aber die Flexibilität, die die Kombination von findund bietet, kommt der Flexibilität nicht nahe cpio. Da tarich für das Erstellen von Archiven allgegenwärtig bin, verwende ich nur noch diesen Grund cpio.