Juin 142011
 

Problème:
j’ai fait une grosse archive tar (non compressée) et l’extraction des données a été interrompue suite à une corruption de disque.

tar est très lent a reprendre l’extraction ou il en était et échoue lamentablement au final à cause des erreurs rencontrées..
c’est parce que tar lit séquentiellement le fichier backup.tar, il travaille en bloc.

Solution :
créer un index des fichiers se trouvant dans l’archive, tar va lire l’intégralité du fichier une première fois mais ensuite, il n’aura plus à le relire entièrement.

$ FICHIER=archive.tar
$ tar --list --block-number --verbose --file=$FICHIER > ${FICHIER}.index


dans mon cas c’était une archive de 174Go
environ une heure pour lire toute l’archive et en écrire l’index contenant les numeros de blocks, nom et attributs des fichiers.

voici comment récupérer un fichier spécifique dans l’archive, je vous montre après comment récupérer la presque totalité de l’archive tar.

mettons que l’on veuille récupérer le fichier linux.iso dans l’archive archive.tar.
on va se servir du fichier index généré plus haut:

$ grep linux.iso ${FICHIER}.index
      bloc 17321848: -rw-r--r-- atlantis/users 189491200 2007-09-08 18:59 rep1/rep2/linux.iso

on a sa taille (189491200) et le block ou il se trouve (17321848).
on sait que tar utilise des blocks de 512.
donc:

$ START=17321848
$ STOP=`echo '(189491200 / 512) + 512' |bc` # donne 370612
$ dd if=${FICHIER} skip=$START count=$STOP bs=512 2>/dev/null | \
tar --list --verbose --block-number "rep1/rep2/linux.iso" 2>/dev/null
      bloc 0: -rw-r--r-- atlantis/users 189491200 2007-09-08 18:59 rep1/rep2/linux.iso

remplacez –list par –extract et le tour est joué !!!

et voici un petit cadeau, le script qui fera tout à votre place.

Download : tar_extract.sh#!/bin/bash

#——————————————————–#
# VARIABLE A REMPLIR #
#
INDEX_CATALOG=/hdds/stock1/BCK/archive.tar.index
ARCHIVE_FILE=/hdds/stock1/BCK/archive.tar
DEST_DIR=/net/192.168.1.11/restau
#——————————————————–#

#——————————————————–#
# VARIABLES PAR DEFAUT #
#
BS=512
TAR_OPTS= »–extract –verbose –block-number –no-wildcards »
#——————————————————–#

cd « ${DEST_DIR} »
[ « $? » = « 0 » ] || exit 2

[ -f « ${INDEX_CATALOG} » ] || {
echo « fichier index ‘${INDEX_CATALOG}’ inexistant, je vais le créer pour vous (peut-être long) »
tar –list –block-number –verbose –file= »${ARCHIVE_FILE} » |tee « ${INDEX_CATALOG} »
}

while read bloc BN rwx user SIZE date time FILE
do
[ -z « $(echo « ${FILE} » |grep -vi « Thumbs.db ») » ] && continue

[ -d « ${FILE} » ] && continue
[ -f « ${FILE} » ] && {
XSIZE= »$(/bin/ls -l « ${FILE} » |awk ‘{print $5}’) »
[ « $SIZE » -eq « $XSIZE » ] && continue
echo « le fichier existe mais n’a pas la bonne taille: [$SIZE != $XSIZE] »
}

START= »$(echo $BN |sed ‘s/://’) »
STOP= »$(echo « ($SIZE / $BS) + $BS » |bc) »

echo « ${FILE} »
dd if= »${ARCHIVE_FILE} » skip=$START count=$STOP bs=$BS 2>/dev/null |tar ${TAR_OPTS} « ${FILE} » 2>/dev/null
done < "${INDEX_CATALOG}" [/bash]

 Laisser un commentaire

Vous pouvez utiliser ces tags et attributs HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(requis)

(requis)

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.