Niveau :      
Résumé : tar ; par2

Comme vous les savez, les disquettes risquent de perdre facilement leurs données. Les CD aussi. Basons-nous sur un article précédent qui explique comment utiliser par2 pour éviter de perdre des données.

Nous allons nous intéresser au cas pratique de l'envoi de 25Go de données par DVD. Voici les contraintes :

  • Nombreux fichiers dans de nombreux répertoires
  • Tailles inégales des fichiers
  • Taille totale supérieure à celle d'un seul support
  • On ne veut pas perdre de données pendant le transfert
  • Un seul envoi (on ne peut pas corriger les erreurs à postériori)
  • Espace disque disponible pour la copie des données à la destination

Création des DVD

Choix du système d'archive

Puisqu'on ne veut pas de perte et un seul envoi, on va utiliser par2 pour créer une grande quantité de redondance. Par2 ne fonctionne bien que pour une liste de fichiers à plat, donc nous utiliserons un système d'archive (tar, zip ar). Puis qu'il y a de la place disque sur la destination cela ne posera pas de problème.

Puisqu'il faut répartir les données sur plusieurs supports et que les données sont de tailles inégales nous utiliserons une archive découpée en morceau.

Quelle archive utiliser ?

  • tar : gère difficilement les split d'archive
  • ar : peu pratique pour ce genre de chose
  • shar : fichiers texte, grosse perte de place
  • zip : il a beaucoup de mal a splitter ses propres fichier
  • 7zip : ne gère pas les droits sur les fichier, mais pratique
  • rar : pas libre

Calcul de la taille des fichiers

Un DVD fait environ 4482Mio (base 1024). On veut faire environ 20% de redondance (voyons large). Avec une petite marge d'erreur cela nous donne 4482/1.21 = 3700Mio par archive (soit 3788800kio pour tar). Quantité qu'on complétera par de la redondance part2 pour faire un DVD complet.

Génération des archives de chaque dvd

Utilisons tar, nous apprendrons quelque chose. Pour gérer les split avec tar, de façon un peu plus propre qu'avec tar | split, on utilise les commande de tar datant de l'époque où les sauvegardes se faisaient toutes sur cassette.

Le manuel nous renseigne sur tout ce qu'il faut :

  • Option -M pour activer le découpage sur plusieurs cassettes virtuelles (volumes)
  • Option -F pour faire un script de changement de volume
  • Option -L pour donner une taille limite aux volumes

Ce qui nous donne la commande tar suivante :

$ export FILE=test.tar
$ tar cM --volno-file $FILE.v -F 'd=dvd$(cat $FILE.v); mkdir $d; mv $FILE $d' -L 3788800 -f $FILE fichiers/de/sauvegarde
$ d=dvd$(cat $FILE.v); mkdir $d; mv $FILE $d

Pour la petite explication, on factorise le nom du fichier pour éviter les embêtements, puis :

  • -f $FILE : le volume virtuel en cours s'appelle toujours $FILE
  • --volno-file $FILE.v on : sauvegarde le numéro du tar en cours pour gérer les volumes
  • -F 'd=dvd$(cat test.tar.v); mkdir $d; mv $FILE $d' : à chaque changement de volume on déplace le volume en cours dans $FILE.<numéro>
  • d=dvd$(cat test.tar.v); mkdir $d; mv $FILE $d : on renomme correctement le dernier volume

On se retrouve donc avec N répertoires nommés dvd1 ... dvdN contenant chacun un fichier nommé $FILE

Attention, si vous voulez ajouter de la compression, c'est ici qu'il faut le faire car tar ne sait pas gérer la compression sur des archives splittées.

Génération de la redondance

La redondance se fait simplement avec par2 :

# 20% de redondance pour chaque fichier tar
$ for i in dvd*; do cd $i; par2 c -r20 $FILE; cd .. ; done

Et voilà, chaque répertoire contient avec chaque archive un certain nombre de fichiers par2 assurant la redondance des données. On peut alors graver les N DVD avec notre outil de gravure favori.

Lecture des DVD

Sans erreur de lecture

On essaie d'abord une lecture en espérant qu'il n'y ait pas d'erreur :

$ cd /destination
$ tar xM --ignore-failed-read --no-same-owner -f /media/cdrom/test.tar

A chaque fin d'archive, tar demandera de changer de volume, changer de disque puis valider.

Avec erreurs

S'il y a des erreurs de lecture, nous avons tous les outils de récupération nécessaire. On va extraire tous les DVD un par un, mais rien n'empêche de laisser sur DVD les fichiers qui sont encore lisibles.

On se base sur un article précédent sur la récupération avec ddrescue.

Si le DVD est montable on évite de perdre de la place (X étant le No du dvd) :

$ mkdir /srv/tmp/dvdX
$ for i in /media/cdrom/*; do ddrescue $i /srv/tmp/dvdX/$i; done

Sinon on récupère une image iso :

$ ddrescue /dev/hdc /srv/tmp/dvd
$ mkdir /srv/tmp/dvddir
$ mount -o loop /srv/tmp/dvd /srv/tmp/dvddir
$ cp -r /srv/tmp/dvddir/* /srv/tmp/dvdX

Et on répare le contenu du dvd :

$ cd /srv/tmp/dvdX
$ par2 r fichier.tar.par2

Reste à restaurer le contenu des archives :

$ cd /destination
$ tar xM --ignore-failed-read --no-same-owner -f /srv/tmp/dvdX/test.tar

Et même topo que précédemment pour le passage au volume précédent.

Note

C'est bien joli, mais on aurait pu faire un peu mieux (et un peu plus dur). Si un DVD est abîmé, il est probable que les données de récupération soient aussi abîmée que l'archive sur ce dvd. Pour bien faire, on devrait donc écrire les données de redondance sur un DVD différent de celui contenant l'archive correspondante.

Si quelqu'un avait le temps et le courage de mettre tout ça dans un script, ça serait bien sympa.