it-swarm.com.de

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

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

Was unterscheidet CPIO von TAR? In einer anderen Frage wurde mir gesagt, dass mit tar viele Dateien zu einem Archiv zusammengefasst werden sollen, 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/[email protected] | cpio -o | bzip2 -9c > ~/backups/20070607.bz2

# Restore snapshot from cpio and bzip2 archive
zfs recieve media/[email protected] | cpio -i | bunzip2 -c ~/backups/20070607.bz2
40
ianc1215

Sowohl tar als auch cpio haben einen einzigen Zweck: viele separate Dateien zu einem einzigen Stream zu verketten. Sie komprimieren keine Daten. (Heutzutage ist tar aufgrund seiner relativen Einfachheit populärer - es kann Eingabedateien als Argumente verwenden, anstatt mit find wie cpio gekoppelt zu werden.)

In Ihrem Fall benötigen Sie keines dieser Tools . Sie hätten keinen nützlichen Effekt, da Sie nicht viele separate Dateien haben . zfs send hat bereits dasselbe getan wie tar. Sie haben also keine Dateien , nur ein namenloser Stream.

Um den Schnappschuss zu komprimieren, müssen Sie lediglich die Ausgabe von zfs durch ein Komprimierungsprogramm leiten:

zfs send media/[email protected] | gzip -c > ~/backups/20070607.gz

gzip -dc ~/backups/20070607.gz | zfs receive media/[email protected]

(Sie können gzip durch xz oder bzip2 oder ein anderes Stream-Komprimierungs-Tool ersetzen, wenn Sie möchten.)

28
grawity

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

Geschichte

In den "alten Tagen" war cpio (mit der Option -c) das zu verwendende Tool Verschieben von Dateien auf andere UNIX-Derivate, da diese portabler und flexibler als tar waren. Die tar -Portabilitätsprobleme können jedoch seit den späten 1980er Jahren als gelöst angesehen werden.

Unglücklicherweise war es ungefähr zu dieser Zeit, dass verschiedene Hersteller das -c-Format von cpio zerrissen haben (schauen Sie einfach in die Handbuchseite für GNU cpio und die Option -H ). Zu dieser Zeit wurde tar portabler als cpio ... Es dauerte fast ein ganzes Jahrzehnt, bis die verschiedenen UNIX-Anbieter das geklärt hatten. GNU tar und GNU cpio installiert zu haben, war ein Muss für alle Administratoren, die sich damals mit Bändern aus verschiedenen Quellen befassen mussten (auch heutzutage nehme ich an). .

Benutzeroberfläche

tar verwendet möglicherweise eine Bandkonfigurationsdatei, in der der Administrator die mit dem System verbundenen 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 eigenständig 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 - daher 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.

Außerdem bietet GNU tar die Option -z, mit der das Archiv im laufenden Betrieb mit GNU Zip komprimiert wird, was die Sache noch einfacher macht.

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 alle Aufgaben erledigt, die 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 mit grep -v, um bestimmte Dateien auszuschließen ...

Die Leute von GNU tar haben viel Arbeit investiert, um viele der Dinge aufzunehmen, 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.

tar 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

Außerdem bietet GNU tar die Option --to-command, um einen Postprozessor-Befehl anzugeben - obwohl ich die Pipe immer noch vorziehen würde. Vielleicht ist es hilfreich, wenn Sie auf bestimmte Hardwaregeräte schreiben.

61
ktf

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 ein Komprimierungsdienstprogramm wie oben beschrieben zu verwenden. Dies liegt daran, dass das Komprimieren einer einzelnen großen Datei sowohl zeit- als auch 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.

6
Paul

Ich habe einen HP-Kundendienst in ca. gefragt. 1996 warum sollte man cpio anstelle von tar verwenden?.

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

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

4
Lynn

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 Befehls cpio Sie nicht daran hindern müssen, mit cpio-Dateien zu interagieren.

4
trombonehero

Während die Antworten hier bereits cpio und tar sehr gut vergleichen, möchte ich eine der Funktionen von cpio hervorheben, die als Pipeline-Modus bezeichnet werden und das Kopieren ausgewählter Dateien (d. H. Über find und Filter) unter Beibehaltung ihrer Verzeichnisstruktur effizienter macht. Diese Funktion ist gut dokumentiert und sieht im Grunde so aus:

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

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

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

Es gibt natürlich andere Alternativen wie rsync und cp --parents, die in einem anderen Thread diskutiert werden, aber nichts kommt der Flexibilität nahe, die die Kombination von find und cpio bietet. Da tar für die Erstellung von Archiven allgegenwärtig ist, ist dies der einzige Grund, aus dem ich noch cpio verwende.

2
haridsv