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

41

Ich bin neugierig und habe ein bisschen gelesen, habe aber noch Fragen.

Was unterscheidet CPIO von TAR? Mir wurde in einer anderen Frage gesagt, dass tar zum Zusammenführen vieler Dateien in einem Archiv dient, das dann normalerweise gzip'd oder bzip'd ist.

Außerdem wurde mir mitgeteilt, dass TAR von STDOUT nicht komprimiert werden kann. Ich möchte ZFS-Snapshots für Backups archivieren / komprimieren. Ich habe mich gefragt, ob ich CPIO mit bzip2 kombinieren kann, um diesen Effekt zu erzielen.

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

Dies ist die Art von Befehlen, die ich nach dem Lesen aufgerufen habe, damit Oracle Dokumente zum Sichern von ZFS-Snapshots erstellt.

# 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
quelle

Antworten:

28

Beide tarund cpiohaben einen einzigen Zweck: Verknüpfen Sie mehrere separate Dateien zu einem einzigen Stream. Sie komprimieren keine Daten. (Heutzutage tarist es aufgrund seiner relativen Einfachheit populärer - es kann Eingabedateien als Argumente annehmen, anstatt mit diesen gekoppelt zu findwerden cpio.)

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

Um den Schnappschuss zu komprimieren, müssen Sie nur die zfsAusgabe 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-Komprimierungs-Tool ersetzen , wenn Sie möchten.)

Grawity
quelle
Oh, ich verstehe, also ist meine ZFS-Ausgabe KEINE Dateien, sondern ein Datenstrom? Das würde also erklären, warum die Oracle-Beispiele TAR nicht in den Befehlen enthalten.
ianc1215
1
@Solignis: Man kann sich das so vorstellen: zfs sendmacht schon das selbe, tarwas das machen würde.
Grawity
62

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

Geschichte

In den "alten Tagen" war cpio (mit verwendeter Option -c) das Werkzeug, um Dateien auf andere UNIX-Derivate zu verschieben, da es portabler und flexibler als tar war . Die Teer- Portabilitätsprobleme können jedoch seit Ende der 1980er Jahre als gelöst angesehen werden.

Unglücklicherweise war es ungefähr zu dieser Zeit, dass verschiedene Hersteller das -cFormat von cpio zerrissen haben (schauen Sie sich einfach die Handbuchseite für GNU cpio und die Option an -H). Zu dieser Zeit wurde tar portabler als cpio ... Es dauerte fast ein ganzes Jahrzehnt, bis die verschiedenen UNIX-Anbieter das geklärt hatten. Mit GNU tar und GNU cpio installiert wurde ein Muss für alle Administratoren , die mit Bändern aus verschiedenen Quellen beschäftigen mußten dann zurück (auch heute nehme ich an ).

Benutzeroberfläche

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

Der Hauptunterschied ist jedoch:

tar kann Verzeichnisse selbst durchsuchen und verwendet die Liste der zu sichernden Dateien oder Verzeichnisse aus Befehlszeilenargumenten.

cpio archiviert nur die Dateien oder Verzeichnisse, denen es befohlen wurde, durchsucht die Unterverzeichnisse jedoch nicht rekursiv. Außerdem ruft cpio die Liste der zu archivierenden Elemente von stdin ab. Deshalb wird es fast immer in Kombination mit find verwendet .

Ein cpio- Befehl sieht für den Anfänger im Vergleich zu tar 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 Leute tar verwenden , um Archivdateien zu erstellen: Für einfache Aufgaben wie das Bündeln eines vollständigen Verzeichnisses ist es einfach einfacher zu verwenden.

Auch GNU tar bietet die Möglichkeit , -zdie das Archiv verursacht mit zu komprimierenden GNU Zip - on - the - fly, so dass die Dinge noch einfacher.

Andererseits kann man mit find & cpio raffinierte Dinge machen . Tatsächlich handelt es sich eher um einen UNIX-ähnlichen Ansatz: Warum sollte die Verzeichnisbaumsuche in cpio aufgenommen werden, wenn es bereits ein Tool gibt, das fast alles erledigt, was man sich vorstellen kann: find . Dinge, die mir in den Sinn kommen, sind nur das Sichern von Dateien, die neuer sind als ein bestimmtes Datum, das Einschränken der Dateien auf diejenigen, die sich im selben Dateisystem befinden oder das Filtern der Find-Ausgabe grep -v, um bestimmte Dateien auszuschließen ...

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

Teer- und Ausgabeverarbeitung

Eine letzte Anmerkung zu etwas, das Sie gesagt haben:

Außerdem wurde mir mitgeteilt, dass TAR von STDOUT nicht komprimiert werden kann. Ich möchte ZFS-Snapshots für Backups archivieren / komprimieren. Ich habe mich gefragt, ob ich CPIO mit bzip2 kombinieren kann, 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 Archivname:

 $ 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, wenn Sie auf bestimmte Hardwaregeräte schreiben.

ktf
quelle
Wäre es nicht "von STDIN", das sich unterscheidet, anstatt "von STDOUT". "von STDOUT", ergibt für mich keinen Sinn
Joakim Elofsson
Nun, ich habe nur die ursprüngliche Frage zitiert. Ideed - es ist etwas falsch formuliert, aber ich denke, man versteht den Punkt.
ktf
3
"Warum Verzeichnisbaum-Suche in cpio einbinden, wenn es bereits ein Tool gibt, das sich um fast alles kümmert, was man sich denken kann" Gute Frage, aber dann müsste man es auch nach copy ( cp), move ( mv) diffusw. fragen ; )
Mecki
1
trombonehero sagte : BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. Sie haben gesagt: only cpio may read the format of tar. ist das kein widerspruch
n611x007,
6

tar und cpio haben im Wesentlichen dieselbe Funktion: Sie erstellen eine einzige zusammenhängende Datei aus einer Eingabe mehrerer Dateien und Verzeichnisse. Ursprünglich diente dies dazu, das Ergebnis auf Band zu bringen, aber heutzutage wird es im Allgemeinen verwendet, um in ein Komprimierungsdienstprogramm wie das oben beschriebene einzuspeisen. 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 möglicherweise sogar etwas größer werden, wenn sie mit einem Komprimierungsprogramm erstellt werden.

Weder tar noch cpio machen selbst eine Komprimierung. Tar hat den Krieg "Was sollen wir verwenden, um aggregierte Dateien zu erstellen" effektiv "gewonnen", aber cpio bekommt an verschiedenen Stellen einen Lookin. Mir sind keine Vorteile des einen gegenüber dem anderen bekannt, Teer gewinnt dadurch, dass er häufiger verwendet wird.

tar kann in der Tat die Eingabe von stdin und die Ausgabe von stdout übernehmen - was dann in bzip2 weitergeleitet wird, wie Sie es getan haben oder so ähnlich. Bei Aufruf mit der Option "z" wird automatisch gzip für die Ausgabe aufgerufen.

Paul
quelle
1
Ja und ist -jbzip2 nicht aufzurufen?
ianc1215
2
ja, -j ist bzip2 und einige (mehr resent?) Versionen haben -J als xv, für GNUtar thatis
Joakim Elofsson
4
Die neuesten Versionen von GNU tar können sogar das gewünschte Komprimierungsformat anhand des Archivdateinamens erraten, wenn Sie die Option -a verwenden. Also das: tar -caf myfiles.tar.xz myfiles/wird mit komprimieren xzund das tar -caf myfiles.tar.gz myfiles/wird mit komprimieren gzip.
Gerlos
5

Ich habe einen HP-Kundendienst in ca. gefragt. 1996 warum cpioüber tar.

Mir wurde gesagt, dass sich Bänder dehnen und abnutzen. Wenn tarein nicht lesbarer Teil des Bandes erreicht wird, schlägt dies fehl und gibt die Fehlernummer zurück. Wenn cpioein unlesbarer Teil erreicht wird, wird der nächste lesbare Block erneut synchronisiert und fortgesetzt.

Ich habe noch nie eine Dokumentation gesehen, die dies unterstützt, aber immer verwendet cpio.

Lynn
quelle
Laut dem Beitrag scheint der bitweise Schaden von Teer auf den betroffenen Bereich / die betroffenen Dateien beschränkt zu sein, genau wie Sie es über cpio gesagt haben. oxfordrepo.blogspot.tw/2008/12/archive-file-resiliences.html
okwap
4

Ebenfalls erwähnenswert: Unter (mindestens) FreeBSD und Mac OS X können Sie cpio-Dateien mit tar bearbeiten. BSD tar benutzt libarchive unter der Haube, damit es mit cpio, pax, shar ... umgehen kann

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

Posaunenheld
quelle
ktf sagte : only cpio may read the format of tar. Sie haben gesagt: BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. ist das kein widerspruch
n611x007,
1
@ n611x007 Diese Antwort handelt von BSD-Teer. Der andere spricht wahrscheinlich von GNU-Teer. Sie sind verschiedene Programme.
Navin
3

Obwohl die Antworten hier bereits vergleichbar cpiound tarsehr gut sind, möchte ich eine der cpioFunktionen hervorheben , die als Pipeline-Modus bezeichnet werden und die es effizienter macht, ausgewählte Dateien (dh Via findund Filter) unter Beibehaltung ihrer Verzeichnisstruktur zu kopieren . Diese Funktion ist gut dokumentiert und sieht im Grunde so aus:

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

Das Äquivalent mit tarwürde ungefähr so ​​aussehen:

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

Es gibt natürlich auch andere Alternativen wie rsyncund cp --parentsdiskutierte in einem anderen Thread , aber nichts kommt nah an der Flexibilität durch die Kombination angeboten von findund cpio. Da tarich für die Erstellung von Archiven allgegenwärtig bin, ist dies der einzige Grund, warum ich ihn immer noch benutze cpio.

haridsv
quelle