Recibo entre 4 y 100 archivos tar muy grandes (~20 GB) todos los días. Los he estado concatenando en el pasado recorriendo cada uno de los archivos que veo en el sistema de archivos y haciendo algo como esto
/bin/tar -concatenate --file=allTars.tar receivedTar.tar
Sin embargo, el problema con esto es que a medida que concateno más y más archivos tar, debe leer hasta el final allTars.tar
para comenzar a concatenar nuevamente. A veces se necesitan más de 20 minutos para comenzar a agregar otro archivo tar. Es demasiado lento y me falta un tiempo de entrega acordado para el producto completo allTars.tar
.
También intenté entregarle a mi comando tar una lista de archivos como este:
/bin/tar --concatenate --file=alltars.tar receiverTar1.tar receivedTar2.tar receivedTar3.tar...etc
Esto dio resultados muy extraños. allTars.tar
sería el tamaño esperado (es decir, cerca de todos los receivedTar.tar
tamaños de archivos sumados) pero parecía sobrescribir los archivos cuando allTars.tar
se descomprimió.
¿Hay alguna forma de concatenar todos estos archivos tar en un solo comando para que no sea necesario leer hasta el final del archivo que se concatena cada vez?y¿Hacer que se descompriman correctamente y con todos los archivos/datos?
Respuesta1
Puede que esto no le ayude, pero si está dispuesto a utilizar la -i
opción al extraer del archivo final, puede simplemente cat
juntar los archivos tar. Un archivo tar termina con un encabezado lleno de nulos y más relleno de nulos hasta el final del registro. Con --concatenate
tar debemos recorrer todos los encabezados hasta encontrar la posición exacta del encabezado final, para poder comenzar a sobrescribir allí.
Si solo usa cat
los alquitranes, solo tendrá nulos adicionales entre los encabezados. La -i
opción le pide a tar que ignore estos valores nulos entre encabezados. Así que puedes
cat receiverTar1.tar receivedTar2.tar ... >>alltars.tar
tar -itvf alltars.tar
Además, su tar --concatenate
ejemplo debería estar funcionando. Sin embargo, si tiene el mismo archivo con el mismo nombre en varios archivos tar, reescribirá ese archivo varias veces cuando lo extraiga todo del tar resultante.
Respuesta2
Esta pregunta es bastante antigua, pero desearía que me hubiera resultado más fácil encontrar la siguiente información antes. Entonces, si alguien más se topa con esto, que lo disfrute:
Lo que Jeff describe arriba es un error conocido en gnu tar (informado en agosto de 2008). Solo -f
se elimina el marcador EOF del primer archivo (el que está después de la opción). Si intenta concatenar más de 2 archivos, los últimos archivos estarán "ocultos" detrás de los marcadores de final de archivo.
Es un error en el alquitrán. Concatena archivos completos, incluidos los bloques de ceros finales, por lo que, de forma predeterminada, la lectura del archivo resultante se detiene después de la primera concatenación.
Fuente:https://lists.gnu.org/archive/html/bug-tar/2008-08/msg00002.html (y siguientes mensajes)
Teniendo en cuenta la antigüedad del error, me pregunto si alguna vez se solucionará. Dudo que haya una masa crítica afectada.
La mejor manera de evitar este error podría ser utilizar la -i
opción, al menos para archivos .tar en su sistema de archivos.
Como señala Jeff, tar --concatenate
puede tomar mucho tiempo llegar al EOF antes de que concatene el siguiente archivo. Entonces, si vas a quedarte atrapado con un archivo "roto" que necesita la tar -i
opción de descomprimir, te sugiero lo siguiente:
En lugar de usar
tar --concatenate -f archive1.tar archive2.tar archive3.tar
probablemente será mejor que corras cat archive2.tar archive3.tar >> archive1.tar
o canalizar dd
si desea escribir en un dispositivo de cinta. Tenga en cuenta también que estopodríaconducir a un comportamiento inesperado si las cintas no se pusieron a cero antes de (sobre)escribir nuevos datos en ellas. Por esa razón, el enfoque que voy a adoptar en mi aplicación es tars anidados como se sugiere en los comentarios debajo de la pregunta.
La sugerencia anterior se basa en el siguiente punto de referencia de muestra muy pequeño:
time tar --concatenate -vf buffer.100025.tar buffer.100026.tar
real 65m33.524s
user 0m7.324s
sys 2m50.399s
time cat buffer.100027.tar >> buffer.100028.tar
real 46m34.101s
user 0m0.853s
sys 1m46.133s
Los archivos buffer.*.tar tienen un tamaño de 100 GB, el sistema estaba prácticamente inactivo excepto por cada una de las llamadas. La diferencia de tiempo es lo suficientemente significativa como para que personalmente considere que este punto de referencia es válido a pesar del pequeño tamaño de la muestra, pero usted es libre de juzgar esto y probablemente sea mejor que ejecute un punto de referencia como este en su propio hardware.
Respuesta3
Como ha indicado, el archivo de destino debe leerse hasta el final antes de agregarle el segundo archivo de origen. GNU tar tiene una -n
opción que le indica que asuma que un archivo se puede buscar (recuerde que tar fue diseñado para archivos en cinta y secuencias que no se pueden buscar). GNU tar supuestamente detecta automáticamente de forma predeterminada si un archivo es buscable, sin embargo, muchos usuarios como usted pueden asegurarse de que tar omita la lectura del contenido completo de cada registro agregando la -n
opción:
tar -n --concatenate --file=target_file.tar other_file.tar
No puedo verificar (en el momento de escribir este artículo) qué versiones de tar, si las hay, funcionarán como se esperaba para este comando. Si otros usuarios tienen la capacidad de probar esta solución, comente a continuación y actualizaré esta respuesta en consecuencia.
Respuesta4
Como la concatenación requiere un uso intensivo de E/S, recomendaría que sean necesarios 3 SSD (1 TB) en un RAID 0. Un solo SSD en sata 3 proporcionará 500 MB/s de lectura y similar para escritura. Caro, sí, pero rápido x3.