¿Cuál es la diferencia entre los formatos de archivo TAR vs CPIO?

41

Tengo curiosidad y leí un poco, pero todavía tengo preguntas.

¿Qué hace a CPIO diferente de TAR? En otra pregunta me dijeron que tar es para juntar muchos archivos en 1 archivo que generalmente es gzip'd o bzip'd.

También me dijeron que TAR no puede comprimir desde STDOUT. Quiero archivar / comprimir instantáneas ZFS para copias de seguridad. Me preguntaba si podría combinar CPIO con bzip2 para obtener este efecto.

¿O tengo una idea completamente equivocada? ¿No es ese el propósito de CPIO?

Este es el tipo de comandos que he encontrado después de leer, por lo que Oracle documenta la copia de seguridad de las instantáneas de 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
fuente
no olvides pax: P
Janus Troelsen

Respuestas:

28

Ambos tary cpiotienen un único propósito: concatenar muchos archivos separados en una sola secuencia. No comprimen datos. (En estos días tares más popular debido a su relativa simplicidad: puede tomar archivos de entrada como argumentos en lugar de tener que combinarlos findcomo lo cpioha hecho).

En su caso, no necesita ninguna de estas herramientas; no tendrían ningún efecto útil, porque no tienes muchos archivos separados. zfs sendYa hice lo mismo que tarhubiera hecho. Por lo tanto, no tiene ningún archivo, solo una secuencia sin nombre.

Para comprimir la instantánea, todo lo que tiene que hacer es canalizar la zfssalida a través de un programa de compresión:

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

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

(Si lo desea, puede sustituirlo gzipcon xzo con bzip2cualquier otra herramienta de compresión de flujo).

Gravedad
fuente
Oh, ya veo, ¿entonces mi salida ZFS NO es archivos, es una secuencia de datos? Eso explicaría por qué los ejemplos de Oracle no incluyen TAR en los comandos.
ianc1215
1
@Solignis: Puedes pensarlo de esta manera: zfs sendya hace lo mismo que tarharía.
Grawity
62

Además de lo dicho anteriormente por Grawity y Paul :

Historia

En los "viejos tiempos", cpio (con la opción -cutilizada) era la herramienta que se usaba para mover archivos a otros derivados de UNIX, ya que era más portátil y flexible que el tar . Pero los problemas de portabilidad del alquitrán pueden considerarse resueltos desde finales de los años ochenta.

Desafortunadamente, fue en ese momento que diferentes proveedores destrozaron el -cformato de cpio (solo mire la página del manual para GNU cpio y la opción -H). En ese momento, el alquitrán se volvió más portátil que cpio ... Pasaron casi una década completa hasta que los diferentes proveedores de UNIX lo resolvieron. Tener GNU tar y GNU cpio instalados era una necesidad para todos los administradores que tenían que lidiar con cintas de diferentes fuentes en ese entonces (incluso hoy en día supongo).

Interfaz de usuario

tar puede usar un archivo de configuración de cinta donde el administrador configuraría las unidades de cinta conectadas al sistema. El usuario simplemente diría "Bueno, tomaré la unidad de cinta 1" en lugar de tener que recordar el nodo exacto del dispositivo para la cinta (que podría ser muy confuso y tampoco está estandarizado en diferentes plataformas UNIX).

Pero la principal diferencia es:

tar es capaz de buscar directorios por sí mismo y toma la lista de archivos o directorios de los argumentos de la línea de comandos.

cpio archiva solo los archivos o directorios que se le indican, pero no busca subdirectorios recursivamente por sí mismo. También cpio obtiene la lista de elementos para archivar desde stdin ; es por eso que casi siempre se usa en combinación con find .

Un comando cpio a menudo parece aterrador para el principiante en comparación con tar :

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

Creo que esa es la razón principal por la que la mayoría de las personas usan tar para crear archivos de almacenamiento: para tareas simples como agrupar un directorio completo es más fácil de usar.

Además, GNU tar ofrece la opción -zque hace que el archivo se comprima con GNU zip sobre la marcha, lo que facilita aún más las cosas.

Por otro lado, uno puede hacer cosas ingeniosas con find & cpio . De hecho, es un enfoque más parecido a UNIX: ¿Por qué incluir la búsqueda de árbol de directorios en cpio si ya hay una herramienta que se encarga de casi todo lo que uno puede pensar: encontrar . Lo que viene a la mente es solo hacer una copia de seguridad de los archivos más nuevos que una fecha determinada, restringir los archivos a los que residen en el mismo sistema de archivos o filtrar el resultado de búsqueda grep -vpara excluir ciertos archivos ...

La gente de GNU tar pasó mucho trabajo para incluir muchas de esas cosas que antes solo eran posibles con cpio . De hecho, ambas herramientas aprendieron unas de otras, pero solo cpio puede leer el formato de tar , no al revés.

procesamiento de alquitrán y salida

Una última nota a algo que dijiste:

También me dijeron que TAR no puede comprimir desde STDOUT. Quiero archivar / comprimir instantáneas ZFS para copias de seguridad. Me preguntaba si podría combinar CPIO con bzip2 para obtener este efecto.

Bueno, todas las versiones de tar (GNU o no) pueden usarse en una tubería. Simplemente use un signo menos ( -) como nombre de archivo:

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

Además, GNU tar ofrece la opción --to-commandde especificar un comando de postprocesador, aunque todavía prefiero la tubería. Tal vez sea útil al escribir en ciertos dispositivos de hardware.

ktf
fuente
¿No sería 'de STDIN' lo que difiere, en lugar de 'de STDOUT' ... 'de STDOUT' realmente no tiene sentido para mí
Joakim Elofsson
Bueno, solo estaba citando la pregunta original. Ideado: está algo mal redactado, pero creo que uno entiende el punto.
ktf
3
"¿Por qué incluir la búsqueda de árbol de directorios en cpio si ya hay una herramienta que se encarga de casi todo lo que uno puede pensar?" Buena pregunta, pero entonces también tendría que pedirle copia ( cp), mover ( mv) diff, etc. )
Mecki
1
trombonehero dijo : BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. usted ha dicho: only cpio may read the format of tar. ¿No es eso una contradicción?
n611x007
6

tar y cpio tienen esencialmente la misma función, que es crear un solo archivo contiguo a partir de una entrada de múltiples archivos y directorios. Originalmente, esto era para poner el resultado en una cinta, pero en estos días generalmente se usa para alimentar una utilidad de compresión como lo hizo anteriormente. Esto se debe a que comprimir un solo archivo grande es más eficiente en tiempo y espacio que comprimir muchos archivos pequeños. Debe tener en cuenta que muchos formatos de imagen (png, jpg, etc.) ya están muy comprimidos y, de hecho, pueden ser un poco más grandes si se utilizan una utilidad de compresión.

Ni tar ni cpio hacen ninguna compresión por sí mismos. Tar efectivamente ha "ganado" la guerra de "lo que usaremos para hacer archivos agregados", pero cpio lo mira en varios lugares. No conozco ningún beneficio de uno sobre el otro, el alquitrán gana por ser más comúnmente utilizado.

De hecho, tar puede tomar la entrada en stdin y la salida en stdout, que luego se canalizaría a bzip2 como usted o algo similar. Si se llama con la opción "z", invocará automáticamente gzip en la salida.

Paul
fuente
1
Sí y no es -jinvocar bzip2?
ianc1215
2
sí, -j es bzip2 y algunas versiones (¿más resentidas?) obtuvieron -J como xv, para GNUtar thatis
Joakim Elofsson
44
Las versiones más recientes de GNU tar incluso pueden adivinar el formato de compresión deseado del nombre del archivo de almacenamiento cuando usa la opción -a. Entonces esto: tar -caf myfiles.tar.xz myfiles/se comprimirá usando xzy esto tar -caf myfiles.tar.gz myfiles/se comprimirá usando gzip.
gerlos
5

Pedí un soporte técnico de HP en ca. 1996 por qué usar cpiomás tar.

Me dijeron que las cintas se estiran y desgastan. Cuando tarllega a una parte ilegible de la cinta, falla y devuelve el número de error. Cuando cpioalcanza una porción ilegible, continúa al siguiente bloque legible, se resincroniza y continúa.

Nunca he visto documentación que respalde esto, pero siempre la he usado cpio.

Lynn
fuente
Según la publicación, el daño bit a bit del alquitrán parece estar localizado en el área / archivos que afecta, lo mismo que le contó sobre cpio. oxfordrepo.blogspot.tw/2008/12/archive-file-resiliences.html
okwap
4

También vale la pena señalar: en (al menos) FreeBSD y Mac OS X, puede manipular archivos cpio con tar. BSD tar utiliza libarchive debajo del capó, por lo que puede manejar cpio, pax, shar ...

Esto significa que los problemas de usabilidad del cpiocomando no tienen que impedir que interactúe con archivos cpio.

trombonehero
fuente
ktf dijo : only cpio may read the format of tar. usted ha dicho: BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. ¿No es eso una contradicción?
n611x007
1
@ n611x007 Esta respuesta habla sobre el alquitrán BSD. El otro probablemente está hablando de GNU tar. Son diferentes programas.
Navin
3

Si bien las respuestas aquí ya se comparan cpioy tarmuy bien, me gustaría resaltar una de cpiolas características llamadas modo de canalización que hace que sea más eficiente copiar archivos selectivos (es decir, a través findy filtrar) al tiempo que conserva su estructura de directorios. Esta característica está bien documentada y en su premisa básica se ve así:

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

El equivalente con tarimplicaría algo como esto:

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

Por supuesto, hay otras alternativas como rsyncy cp --parentsdiscutidas en otro hilo , pero nada se acerca a la flexibilidad que ofrece la combinación de findy cpio. Al tarser omnipresente para crear archivos, esta es la única razón por la que todavía uso cpio.

haridsv
fuente