systemadmin.es > Backup > Como eliminar la parte corrupta de un tar

Como eliminar la parte corrupta de un tar

Si por algún motivo se ha corrompido un tar y con las opciones –ignore-zeros y/o –ignore-failed-read no podemos recuperar más datos siempre podemos probar editando a mano el fichero y eliminando la parte dañada a ojo.

Primero de todo vamos a ver como funciona el tar. Creamos unos ficheros y vemos el contenido del fichero generado:

# mkdir tmp
# cd tmp/
# echo "fichero a" > f1
# echo "fichero b" > f2
# echo "fichero c" > f3
# cd ..
# tar cf tmp.tar tmp/

Mediante strings podemos ver las cadenas que hay en el tar:

tmp/
0000755
0000000
0000000
00000000000
11206460275
010357
ustar
root
root
tmp/f1
0000644
0000000
0000000
00000000012
11206460264
010577
ustar
root
root
fichero a
tmp/f2
0000644
0000000
0000000
00000000012
11206460270
010575
ustar
root
root
fichero b
tmp/f3
0000644
0000000
0000000
00000000012
11206460275
010603
ustar
root
root
fichero c

Suponiendo que mediante tar xf tmp.tar tenemos un problema con el fichero f2:

# tar xf tmp.tar
tar: Skipping to next header
tar: Error exit delayed from previous errors

Deberemos editar el fichero binario eliminando la parte corrupta hasta encontrar los ceros que marcan el siguiente fichero. En el ejemplo:

00000400  66 69 63 68 65 72 6f 20  61 0a 00 00 00 00 00 00  |fichero a.......|
00000410  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000600  74 6d 70 2f 66 32 00 00  00 00 00 00 00 00 00 00  |tmp/f2..........|
00000610  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000660  00 00 00 00 30 30 30 30  36 34 34 00 30 30 30 30  |....0000644.0000|
00000670  30 30 30 00 30 30 30 30  30 30 30 00 30 30 30 30  |000.0000000.0000|
00000680  30 30 30 30 30 31 32 00  31 31 32 30 36 34 36 30  |0000012.11206460|
00000690  32 37 30 00 30 31 30 35  37 35 00 20 30 00 00 00  |270.010575. 0...|
000006a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000700  00 75 73 74 61 72 20 20  00 72 6f 6f 74 00 00 00  |.ustar  .root...|
00000710  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000720  00 00 00 00 00 00 00 00  00 72 6f 6f 74 00 00 00  |.........root...|
00000730  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000800  66 69 63 68 65 72 6f 20  62 0a 00 00 00 00 00 00  |fichero b.......|
00000810  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000a00  74 6d 70 2f 66 33 00 00  00 00 00 00 00 00 00 00  |tmp/f3..........|
00000a10  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

Eliminaríamos toda la linea que contiene “/tmp/f2” hasta el “fichero b” segudio de ceros. Esto es así porque el fichero no contiene datos en mas lineas, por lo que para este caso concreto nos serviría un simple grep:

# cat tmp.tar | grep --binary-files=text -v f2 > tmp/tmp2.tar
# tar xf tmp2.tar
# find ./tmp
./tmp
./tmp/f1
./tmp/f3

Para ficheros no tan simples se requiere de un poco de paciencia con el hexdump y el uso de alguna herramienta como el hexedit.

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>