Qual è la differenza tra i formati di file di archivio TAR vs CPIO?


41

Sono curioso e ho letto un po 'ma ho ancora domande.

Cosa rende CPIO diverso da TAR? Mi è stato detto in un'altra domanda che tar è per riunire molti file in 1 archivio che di solito è gzip'd o bzip'd.

Inoltre mi è stato detto che TAR non può comprimere da STDOUT. Voglio archiviare / comprimere le snapshot ZFS per i backup. Mi chiedevo se avrei potuto combinare CPIO con bzip2 per ottenere questo effetto.

O ho un'idea completamente sbagliata? Non è questo lo scopo di CPIO?

Questo è il tipo di comandi che ho emesso dopo aver letto quindi i documenti Oracle sul backup di snapshot 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

non dimenticare pax: P
Janus Troelsen,

Risposte:


28

Entrambi tare cpiohanno un unico scopo: concatenare molti file separati in un singolo flusso. Non comprimono i dati. (In questi giorni tarè più popolare per la sua relativa semplicità: può prendere i file di input come argomenti invece di doverli accoppiare così findcome cpiosono.)

Nel tuo caso, non hai bisogno di nessuno di questi strumenti; non avrebbero alcun effetto utile, perché non hai molti file separati. zfs sendgià fatto la stessa cosa che taravrebbe fatto. Quindi non hai alcun file, solo un flusso senza nome.

Per comprimere l'istantanea, è sufficiente reindirizzare l' zfsoutput tramite un programma di compressione:

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

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

(È possibile sostituire gzipcon xzo bzip2o qualsiasi altro strumento di compressione dello stream, se lo si desidera.)


Oh, capisco, quindi il mio output ZFS NON è un file, è un flusso di dati? Questo spiegherebbe perché gli esempi Oracle non includono TAR nei comandi.
ianc1215,

1
@Solignis: Puoi pensarlo in questo modo: zfs sendfa già lo stesso che tarfarebbe.
Grawity,

62

Oltre a quanto detto in precedenza da Grawity e Paul :

Storia

Ai vecchi tempi, cpio (con l'opzione -cutilizzata) era lo strumento da utilizzare quando si trattava di spostare i file in altri derivati ​​UNIX poiché era più portabile e flessibile di tar . Ma i problemi di portabilità del catrame possono essere considerati risolti dalla fine degli anni '80.

Purtroppo è stato in quel periodo che diversi produttori hanno modificato il -cformato di cpio (basta guardare la pagina di manuale di GNU cpio e l'opzione -H). A quel tempo il catrame è diventato più portatile di cpio ... Ci sono voluti quasi un intero decennio prima che i diversi venditori UNIX lo risolvessero. Avere GNU tar e GNU cpio installati era un must per tutti gli amministratori che all'epoca avevano a che fare con nastri di diverse fonti (anche oggi presumo).

Interfaccia utente

tar può usare un file di configurazione del nastro in cui l'amministratore configurerebbe le unità nastro connesse al sistema. L'utente quindi dovrebbe semplicemente dire "Bene, prendo l'unità a nastro 1" invece di dover ricordare il nodo esatto del dispositivo per il nastro (che potrebbe essere molto confuso e non essere standardizzato su diverse piattaforme UNIX.

Ma la differenza principale è:

tar è in grado di cercare le directory da solo e accetta l'elenco di file o directory di cui eseguire il backup dagli argomenti della riga di comando.

cpio archivia solo i file o le directory a cui viene detto, ma non cerca le sottodirectory ricorsivamente da sola. Inoltre cpio ottiene l'elenco degli elementi da archiviare da stdin - questo è il motivo per cui è quasi sempre usato in combinazione con find .

Un comando cpio sembra spesso spaventoso per il principiante se confrontato con tar :

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

Penso che sia il motivo principale per cui la maggior parte delle persone usa tar per creare file di archivio: per compiti semplici come raggruppare una directory completa è solo più facile da usare.

Anche GNU tar offre l'opzione -zche consente di comprimere l'archivio con zip GNU al volo, rendendo le cose ancora più facili.

D'altro canto, con find & cpio si possono fare cose eleganti . In realtà è un approccio più simile a UNIX: perché includere la ricerca dell'albero delle directory in cpio se c'è già uno strumento che si prende cura di quasi tutto ciò che si può pensare: find . Le cose che vengono in mente sono solo il backup dei file più recenti di una certa data, limitando i file a quelli che risiedono nello stesso filesystem o filtrando l'output di ricerca con grep -vper escludere determinati file ...

Le persone di GNU tar hanno speso molto lavoro per includere molte di quelle cose che prima erano possibili solo con cpio . In effetti entrambi gli strumenti appresi l'uno dall'altro - ma solo cpio può leggere il formato di tar - non viceversa.

elaborazione tar e output

Un'ultima nota a qualcosa che hai detto:

Inoltre mi è stato detto che TAR non può comprimere da STDOUT. Voglio archiviare / comprimere le snapshot ZFS per i backup. Mi chiedevo se avrei potuto combinare CPIO con bzip2 per ottenere questo effetto.

Bene, ogni versione di tar (GNU o meno) può essere usata in una pipe. Basta usare un segno meno ( -) come nome dell'archivio:

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

Anche GNU tar offre la possibilità --to-commanddi specificare un comando postprocessor, anche se preferirei comunque la pipe. Forse è utile quando si scrive su determinati dispositivi hardware.


non sarebbe "da STDIN" che differisce, piuttosto che "da STDOUT" ... "da STDOUT" non ha davvero senso per me
Joakim Elofsson,

Bene, stavo solo citando la domanda originale. Ideed - è in qualche modo errato, ma penso che uno abbia capito.
ktf,

3
"Perché includere la ricerca dell'albero delle directory in cpio se c'è già uno strumento che si prende cura di quasi tutto quello che si può pensare di" Buona domanda, ma allora dovresti anche chiederlo per copy ( cp), move ( mv) diff, ecc.; - )
Mecki,

1
trombonehero ha detto : BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. hai detto: only cpio may read the format of tar. non è una contraddizione?
n611x007,

6

tar e cpio hanno essenzialmente la stessa funzione, che è quella di creare un singolo file contiguo da un input di più file e directory. Inizialmente questo doveva mettere il risultato su nastro, ma oggigiorno viene generalmente utilizzato per alimentare un'utilità di compressione come sopra. Questo perché la compressione di un singolo file di grandi dimensioni è più efficiente in termini di tempo e spazio rispetto alla compressione di molti file di piccole dimensioni. Dovresti notare che molti formati di immagine (png, jpg ecc.) Sono già altamente compressi e potrebbero effettivamente diventare un po 'più grandi se sottoposti a un'utilità di compressione.

Né tar né cpio fanno alcuna compressione da soli. Tar ha effettivamente "vinto" la guerra "che cosa dovremmo usare per creare file aggregati", ma cpio può dare un'occhiata in vari luoghi. Non sono a conoscenza di alcun vantaggio dell'uno rispetto all'altro, il catrame vince grazie all'utilizzo più comune.

tar può effettivamente prendere input su stdin e output su stdout, che verrebbero quindi reindirizzati in bzip2 come hai fatto o qualcosa di simile. Se chiamato con l'opzione "z", invocherà automaticamente gzip sull'output.


1
Sì e non è -jinvocare bzip2?
ianc1215,

2
sì, -j è bzip2 e alcune versioni (più risentite?) hanno ottenuto -J come xv, per GNUtar thatis
Joakim Elofsson

4
Le versioni più recenti di GNU tar possono persino indovinare il formato di compressione desiderato dal nome del file di archivio quando si utilizza l'opzione -a. Quindi questo: tar -caf myfiles.tar.xz myfiles/comprimerà usando xze questo tar -caf myfiles.tar.gz myfiles/comprimerà usando gzip.
gerlos,

5

Ho chiesto un supporto tecnico HP in ca. 1996 perché usare cpiooltre tar.

Mi è stato detto che i nastri si allungano e si consumano. Quando tarraggiunge una parte illeggibile del nastro, non riesce e restituisce un numero di errore. Quando cpioraggiunge una parte illeggibile, continua con il successivo blocco leggibile, si risincronizza e continua.

Non ho mai visto la documentazione a supporto di questo, ma ho sempre usato cpio.


Secondo il post, il danno bit a bit di tar sembra essere localizzato nell'area / file che interessa, lo stesso che hai detto su cpio. oxfordrepo.blogspot.tw/2008/12/archive-file-resiliences.html
okwap

4

Vale anche la pena notare: su (almeno) FreeBSD e Mac OS X, puoi manipolare i file cpio con tar. Il catrame BSD utilizza libarchive sotto il cofano, quindi può gestire cpio, pax, shar ...

Ciò significa che i problemi di usabilità del cpiocomando non devono impedirti di interagire con i file cpio.


KTF ha detto : only cpio may read the format of tar. hai detto: BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. non è una contraddizione?
n611x007,

1
@ n611x007 Questa risposta parla di tar BSD. L'altro probabilmente sta parlando di GNU tar. Sono programmi diversi.
Navin

3

Mentre le risposte qui sono già comparabili cpioe tarmolto bene, vorrei evidenziare una delle cpiocaratteristiche chiamate modalità pipeline che rende più efficiente la copia di file selettivi (cioè, via finde filtro) preservando la loro struttura di directory. Questa funzionalità è ben documentata e nella sua premessa di base è simile alla seguente:

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

L'equivalente con tarimplicherebbe qualcosa del genere:

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

Esistono ovviamente altre alternative come rsynce cp --parentsdiscusse in un altro thread , ma nulla si avvicina alla flessibilità offerta dalla combinazione di finde cpio. Con taressendo onnipresente per la creazione di archivi, questa è l'unica ragione per la quale ho ancora utilizzare cpio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.