Quelle est la différence entre les formats de fichier d'archive TAR vs CPIO?

41

Je suis curieux et j'ai lu un peu, mais j'ai encore des questions.

Qu'est-ce qui différencie CPIO de TAR? On m'a dit dans une autre question que tar servait à rassembler de nombreux fichiers dans une archive, qui est alors généralement gzip'd ou bzip'd.

De plus, on m'a dit que TAR ne peut pas compresser à partir de STDOUT. Je souhaite archiver / compresser des instantanés ZFS pour les sauvegardes. Je me demandais si je pouvais combiner CPIO avec bzip2 pour obtenir cet effet.

Ou est-ce que j'ai une idée complètement fausse? N'est-ce pas le but de CPIO?

C’est le genre de commande que j’ai eu à lire après avoir lu afin que Oracle docs sur la sauvegarde des instantanés 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
la source

Réponses:

28

Les deux taret cpioont un seul but: concaténer de nombreux fichiers séparés en un seul flux. Ils ne compressent pas les données. (Ces jours tarsont plus populaires en raison de leur relative simplicité - il peut prendre des fichiers d'entrée en tant qu'arguments au lieu d'avoir à être couplés avec ce findqui cpioa été fait.)

Dans votre cas, vous n'avez besoin d' aucun de ces outils. ils n'auraient aucun effet utile, car vous n'avez pas beaucoup de fichiers séparés. zfs senddéjà fait la même chose qui taraurait fait. Donc, vous n'avez aucun fichier, seulement un flux sans nom.

Pour compresser l'instantané, il vous suffit de diriger la zfssortie via un programme de compression:

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

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

(Vous pouvez remplacer gzipavec xzou bzip2ou tout autre outil de compression de flux, si vous le souhaitez.)

Grawity
la source
Oh, je vois, donc ma sortie ZFS n’est PAS un fichier, c’est un flux de données? Cela expliquerait donc pourquoi les exemples Oracle n'incluent pas TAR dans les commandes.
ianc1215
1
@Solignis: Vous pouvez penser de cette façon: fait zfs senddéjà la même chose que vous tarferiez.
Grawity
62

En plus de ce qui a été dit auparavant par Grawity et Paul :

Histoire

A l'époque, cpio (avec l'option -cutilisée) était l' outil à utiliser pour déplacer des fichiers vers d'autres dérivés UNIX, car il était plus portable et plus flexible que tar . Mais les problèmes de portabilité du goudron peuvent être considérés comme résolus depuis la fin des années 1980.

Malheureusement, c’est à peu près à cette époque que différents fournisseurs ont modifié le -cformat de cpio (il suffit de regarder la page de manuel de GNU cpio et l’option -H). À ce moment-là, tar devenait plus portable que cpio ... Il a fallu presque une décennie pour que les différents fournisseurs UNIX aient réglé le problème. L' installation de GNU tar et de GNU cpio était une nécessité pour tous les administrateurs qui devaient traiter des bandes de sources différentes à l'époque (encore aujourd'hui, je présume).

Interface utilisateur

tar peut utiliser un fichier de configuration de bande dans lequel l'administrateur configurerait les lecteurs de bande connectés au système. L'utilisateur pourrait alors simplement dire "Je prendrai le lecteur de bande 1" au lieu de devoir mémoriser le nœud de périphérique exact de la bande (ce qui peut être très déroutant et n'est pas standardisé sur différentes plates-formes UNIX.

Mais la principale différence est:

tar est capable de rechercher seul des répertoires et prend la liste des fichiers ou des répertoires à sauvegarder à partir d'arguments en ligne de commande.

cpio archive uniquement les fichiers ou les répertoires auxquels il est dit, mais ne recherche pas les sous-répertoires de manière récursive. De plus, cpio obtient la liste des éléments à archiver de stdin - c’est pourquoi il est presque toujours utilisé en combinaison avec find .

Une commande cpio semble souvent effrayante pour le débutant si elle est comparée à tar :

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

Je pense que c'est la raison principale pour laquelle la plupart des gens utilisent tar pour créer des fichiers d'archive: Pour des tâches simples comme assembler un répertoire complet, il est simplement plus facile à utiliser.

De plus, GNU tar offre la possibilité -zde compresser l’archive à la volée avec GNU zip , ce qui rend les choses encore plus faciles.

D'autre part, on peut faire des choses intéressantes avec find & cpio . En fait, il s’agit d’une approche plus semblable à UNIX: pourquoi inclure la recherche dans l’arborescence de répertoires dans cpio s’il existe déjà un outil prenant en charge presque tout ce à quoi on peut penser: find . Les choses qui me viennent à l’esprit ne font que sauvegarder des fichiers plus récents qu’une certaine date, limiter les fichiers à ceux qui résident dans le même système de fichiers ou filtrer la recherche-sortie grep -ven excluant certains fichiers ...

Les utilisateurs de GNU tar ont consacré beaucoup de temps à inclure un grand nombre de choses auparavant possibles uniquement avec cpio . En fait, les deux outils ont appris l'un de l'autre - mais seul cpio peut lire le format de tar - et non l'inverse.

traitement de goudron et de sortie

Une dernière note à quelque chose que vous avez dit:

De plus, on m'a dit que TAR ne peut pas compresser à partir de STDOUT. Je souhaite archiver / compresser des instantanés ZFS pour les sauvegardes. Je me demandais si je pouvais combiner CPIO avec bzip2 pour obtenir cet effet.

Eh bien, chaque version de tar (GNU ou non) peut être utilisée dans un tuyau. Utilisez simplement un signe moins ( -) comme nom d’archive:

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

De plus, GNU tar offre la possibilité --to-commandde spécifier une commande de post-processeur - bien que je préfère quand même le canal. Peut-être est-il utile lors de l'écriture sur certains périphériques matériels.

ktf
la source
ce ne serait pas 'de STDIN' qui diffère, plutôt que de 'à STDOUT' .. '' de STDOUT 'n'a pas vraiment de sens pour moi
Joakim Elofsson
Eh bien, je ne faisais que citer la question initiale. Ideed - c'est un peu mal formulé, mais je pense qu'on comprend.
KTF
3
"Pourquoi inclure la recherche dans l'arborescence de répertoires dans cpio s'il existe déjà un outil prenant en charge presque tout ce que l'on peut penser de" Bonne question, mais vous devrez alors également lui demander copy ( cp), move ( mv) diff,, etc.; - )
Mecki
1
trombonehero dit : BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. vous avez dit: only cpio may read the format of tar. n'est-ce pas une contradiction?
n611x007
6

tar et cpio ont essentiellement la même fonction, qui consiste à créer un seul fichier contigu à partir d'une entrée de plusieurs fichiers et répertoires. À l'origine, c'était pour mettre le résultat sur une bande, mais de nos jours, il est généralement utilisé pour alimenter un utilitaire de compression, comme vous l'avez décrit ci-dessus. En effet, la compression d'un seul fichier volumineux est plus efficace en termes de temps et d'espace que de compresser beaucoup de petits fichiers. Notez que de nombreux formats d'image (png, jpg, etc.) sont déjà fortement compressés et peuvent même devenir un peu plus grands s'ils sont soumis à un utilitaire de compression.

Ni tar ni cpio ne font de compression eux-mêmes. Tar a effectivement "remporté" la guerre "que devons-nous utiliser pour créer des fichiers agrégés", mais cpio est consulté à divers endroits. Je ne suis pas au courant des avantages de l'un sur l'autre, tar gagne en étant plus couramment utilisé.

tar peut en effet prendre les entrées sur stdin et les sorties sur stdout - qui seront ensuite redirigées vers bzip2 comme vous l'avez déjà fait ou quelque chose de similaire. Si appelé avec l'option "z", il invoquera automatiquement gzip sur la sortie.

Paul
la source
1
Oui, et ne -jpas invoquer bzip2?
ianc1215
2
oui, -j est bzip2 et certaines versions (plus souvent renvoyées?) ont obtenu -J comme xv, pour GNUtar thatis
Joakim Elofsson
4
Les versions les plus récentes de GNU tar peuvent même deviner le format de compression souhaité à partir du nom du fichier d’archive lorsque vous utilisez l’option -a. Donc ceci: tar -caf myfiles.tar.xz myfiles/compressera en utilisant xzet ceci tar -caf myfiles.tar.gz myfiles/compressera en gzip.
gerlos
5

J'ai demandé à un support technique HP en ca. 1996 pourquoi utiliser cpioplus tar.

On m'a dit que les bandes s'étiraient et s'usaient. Lorsqu'il taratteint une partie illisible de la bande, il échoue et renvoie le numéro de l'erreur. Lorsque cpioatteint une partie illisible, il continue au prochain bloc lisible, se resynchronise et continue.

Je n'ai jamais vu de documentation à l'appui, mais toujours utilisée cpio.

Lynn
la source
Selon le message, les dommages au bit au bit du goudron semblent être localisés dans la zone / les fichiers concernés, comme dans le cas de cpio. oxfordrepo.blogspot.tw/2008/12/archive-file-resiliences.html
okwap
4

A noter également: sur (au moins) FreeBSD et Mac OS X, vous pouvez manipuler des fichiers cpio avec tar. BSD tar utilise libarchive sous le capot, il peut donc gérer cpio, pax, shar ...

Cela signifie que les problèmes d'utilisation de la cpiocommande ne doivent pas nécessairement vous empêcher d'interagir avec les fichiers cpio.

trombonehero
la source
ktf dit : only cpio may read the format of tar. vous avez dit: BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. n'est-ce pas une contradiction?
n611x007
1
@ n611x007 Cette réponse parle de tar BSD. L'autre parle probablement de GNU tar. Ce sont des programmes différents.
Navin
3

Bien que les réponses ici comparent déjà cpioet tartrès bien, je voudrais mettre en évidence l’une des cpiofonctionnalités de ce dernier, appelée mode pipeline, qui rend plus efficace la copie de fichiers sélectifs (c.-à-d. Via findet filter) tout en préservant la structure de leurs répertoires. Cette fonctionnalité est bien documentée et se présente comme suit:

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

L'équivalent avec tarimpliquerait quelque chose comme ceci:

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

Il existe bien sûr d’autres alternatives telles que rsyncet cp --parentsdiscutées dans un autre fil , mais rien n’est comparable à la flexibilité offerte par la combinaison de findet cpio. Étant taromniprésent dans la création d’archives, c’est la seule raison pour laquelle j’utilise encore cpio.

haridsv
la source