ReLoad

Thierry Jaouen ~ WikiBlog
"Rien à foutre d'être lu, tant que je peux me relire."

Outils pour utilisateurs

Outils du site


blog:2012:07:09:dar

DAR

Mais c'est quoi donc

“dar” permet d'effectuer des backups “full” et “différentiel/incremental” (avec catalogue, etc…). Un peu a la façon de “tar”, mais en beaucoup plus évolué.

~~READMORE~~

Installation

Debian Squeeze:

# aptitude update
# aptitude install dar

Voila.

Bases

On va d'abord étudier des commandes “simples”, afin de ce faire la main…

full backup

Soit un répertoire download dans ma home /home/thierry .

Backup (full) de ce répertoire:

dar -c full1 -R download/
-c “full1” nom du backup (mais pas le nom final!)
-R “download/” “Root” du backup

On ne backup qu'a partir d'un et un seul (!) “Root”.

Si vous voulez quelque chose de plus selectif, revenez vers “tar”.

Donc, revenons a la commande:

$ dar -c full1 -R download/
 
--------------------------------------------
119 inode(s) saved
with 0 hard link(s) recorded
0 inode(s) changed at the moment of the backup
0 inode(s) not saved (no inode/file change)
0 inode(s) failed to save (filesystem error)
0 inode(s) ignored (excluded by filters)
0 inode(s) recorded as deleted from reference backup
--------------------------------------------
Total number of inodes considered: 119
--------------------------------------------
EA saved for 0 inode(s)
--------------------------------------------

Ce qui créé un fichier: full1.1.dar

C'est ainsi que Dar créé les fichiers a partir du nom fournit:

<nom>.<incremental_number>.dar

Le fichier fait 22M alors que le contenu du répertoire aussi:

$ du -sxh download/
23M     download/
$ ls full1.1.dar -lh
-rw-r--r-- 1 thierry thierry 22M  2 mars  22:11 full1.1.dar

On va recommencer en compressant avec “zip”.

$ dar -w -c full1 -R download/ -z

Resultat:

$ ls full1.1.dar -lh
-rw-r--r-- 1 thierry thierry 17M  2 mars  22:25 full1.1.dar
-w Ecraser sans avertissement (un peu soualant)
-z Compresser en “zip” (bzip and lzo are also available)

Mais en fait, on ne souhaite pas compresser certains fichiers qui sont déjà compressé !

$ dar -w -c full1 -R download/ -z -Z "*.zip" -Z "*.gz"
-Z “*.zip” Exclure le fichier terminer par “.zip”

Lister et tester backup

Lister

Lister le contenu de l'archive.

$ dar -l full1

Tester

Tester l'archive.

$ dar -t full1

comparer

Comparer l'archive avec les fichiers en présence.

$ dar -d full1 -R download/

Quelques options

Bases:

-c <name> nom de base pour former le (ou les) fichier
-R <Root> Point de départ (unique) du backup, ainsi nommé: Root

Compressions :

-z Compression en zip
-y Compression en bzip

Filtres :

-Z <file_pattern> Exclure fichiers de la compression
-X <file_pattern> Exclure fichiers
-P <dir_pattern> Exclure les répertoires
-D Pour le répertoire exclu, conserver les attributs du répertoire (sans contenu donc)

Bavards ou pas :

-w Traitement sans “warning” (et sans interraction avec l'utilisateur)
-v mode bavard
-O ignorer qu'on n'est pas “root”

Slices

On peut découper les backups en plusieurs fichiers.

-S <taille> Decoupera en fichier de max <taille>

Restorer

tout

Toujours avec notre (unique) fichier full1.1.dar .

On va dans un répertoire pour nos tests, par exemple:

$ mkdir -p tmp/undar
$ cd tmp/undar

Bon, on decompresse (dans le répertoire courant!) :

$ dar -O -x ~/full1
-O parce que dar est trop bavard
-x <name> nom de base de l'ensemble de fichier a décompresser

2 fichiers

$ dar -w -O -x ~/full1 -g "day_ten.pdf" -g "day_eleven.pdf"

Pour voir ce qui est fait, on serait aviser de rajouter: -v .

-g <fichier> nom (chemin relatif complet) du fichier a restorer

On peut ajouter -r , qui ne restore que si le fichier est plus recent.

-r seulement si plus récent

Backup Differentiel

ou Incremental ?

Bref, voila:

$ dar -v -c diff1 -A full1 -R download/ -z
Extracting contents of the archive...
Adding file to archive: /home/thierry/download/old.tar.gz
Adding file to archive: /home/thierry/download/new.tar.gz
Adding reference to files that have been destroyed since reference backup...
Writing archive contents...

En fait, old.tar.gz a juste changé de date (avec touch).
new.tar.gz est un nouveau fichier.

-A <name> Fichier de référence

S'il n'y a pas de référence , il n'y a pas de Differentiel.

Et voila:

$ ls -lh diff1*
-rw-r--r-- 1 thierry thierry 1,7M  2 mars  23:46 diff1.1.dar

Restorer

$ cd tmp/undar
<effacer le contenu pour nos test avec un:>$ rm -Rf *

Et enfin:

$ dar -v -w -O -x ~/diff1
Extracting contents of the archive...
Restoring file: /home/thierry/tmp/undar/old.tar.gz
Restoring file: /home/thierry/tmp/undar/new.tar.gz
:!: le differentiel ne contient que les derniers fichiers !!!!

Pour restore l'ensemble, il faut restorer d'abord le FULL puis les DIFF dans l'ordre chronologique !

Dans notre cas:

$ dar -r -v -w -O -x ~/full1

Et voila pour commencer.

Enchainement des differentiels

Les backups differentiels se perpetue comme cela:

dar -v -c <current_diff> -A <previous_diff> -R download/

Exemple:

$ dar -v -c diff2 -A diff1 -R download/ -z
$ dar -v -c diff3 -A diff2 -R download/ -z
$ dar -v -c diff4 -A diff3 -R download/ -z
etc...

Problemes a connaître

restoration

dar conserve l'effacement/modification des fichiers…

Mais pour cela, il convient d'effectuer les restorations de la façon suivante:

  1. restorer d'abord a partir du dernier Full (fonctionnel)
  2. restorer dans l'ordre les differentiels suivants
  3. jusqu'au dernier differentiels (fonctionnel)

A la fin: on retrouve un etat exact du dernier backup.

Cas pratiques

Backup

On va sauvegarder tout un systeme Debian… rien de trés compliqué.

Full

# dar --noconf \
      -Q \
      -w \
      -R "/" \
      -z6 \
      -Z "*.zip" \
      -Z "*.gz" \
      -D \
      -P proc \
      -P dev \
      -P sys \
      -P mnt \
      -P tmp \
      -K "bf:clef_secrete" \
      -c /mnt/nfs_share/myfirst-full-backup

Où:

  • “clef_secrete” est eventuellement une clef secrete pour chiffrer les données.
  • le backup est fait sur un partage NFS (ou autres)

En tout cas: il faut exclure le fichier final du backup …

A la fin, on se retrouve, par exemple, avec un fichier comme ça:

# ls /mnt/nfs_share/ -lh
total 584M
-rw-r--r-- 1 root root 583M 13 juillet  11:25 myfirst-full-backup.1.dar

Tester

(facultatif)

# dar -t /mnt/nfs_share/myfirst-full-backup -K "bf:clef_secrete"
Warning, the archive myfirst-full-backup has been encrypted. A wrong key is not possible to detect, it would cause DAR to report the archive as corrupted
...
0 inode(s) with error
...

Ne pas oublier la “clef” si on en a utilisé une.

Differentiel

Quelques temps (heures ou jours?) plus tard, on fait un nouveau backup, mais differentiel.

On reprend les même options, sauf les dernieres qu'on adapte…

# dar --noconf \
      -Q \
      -w \
      -R "/" \
... snip ...
      -c /mnt/nfs_share/myfirst-diff-backup-1 \
      -J "bf:clef_secrete" \
      -A /mnt/nfs_share/myfirst-full-backup

On ajoute “-J” (pour la clef) et “-A” pour spécifier le fichier de reference pour le differentiel.

A la fin:

# ls /mnt/nfs_share/ -lrth
total 584M
-rw-r--r-- 1 root root 583M 13 juillet  11:25 myfirst-full-backup.1.dar
-rw-r--r-- 1 root root 347K 13 juillet  11:33 myfirst-diff-backup-1.1.dar

Encore un autre differentiel, et encore et encore…

...
      -c /mnt/nfs_share/myfirst-diff-backup-2
...

Encore…

...
      -c /mnt/nfs_share/myfirst-diff-backup-3
...

Etc…

# ls /mnt/nfs_share/ -lrth
total 585M
-rw-r--r-- 1 root root 583M 13 juillet  11:25 myfirst-full-backup.1.dar
-rw-r--r-- 1 root root 347K 13 juillet  11:33 myfirst-diff-backup-1.1.dar
-rw-r--r-- 1 root root 345K 13 juillet  11:39 myfirst-diff-backup-2.1.dar
-rw-r--r-- 1 root root 340K 13 juillet  11:39 myfirst-diff-backup-3.1.dar
-rw-r--r-- 1 root root 346K 13 juillet  11:39 myfirst-diff-backup-4.1.dar

A savoir

Quelques warnings peuvent apparaitre si des fichiers (log ou base de données) changent pendant les traitements !

Ce n'est pas dramatique, sauf peut être pour les bases de données, qu'il faudrait “dumper” avant backup.

Restoration

On utilise les mêmes fichiers, mais pour la restoration sur un autre serveur.

Les fichiers a restorer sont dans /mnt/share4backup/my-server , mais peu importe.

Comme je n'ai pas envie de tout casser, je vais faire la restoration dans un répertoire quelconque… comme:

# cd /tmp
# mkdir restore
# cd restore

Et la dedans, je restore d'abord le full :

# dar -v \
      -w \
      -K "bf:clef_secrete" \
      -x /mnt/share4backup/my-server/myfirst-full-backup

En dehors de “-x …” , le reste est facultatif ou depend des circonstances.

On va ensuite restorer a partir des differentiels, si existe, ce qui notre cas:

...
-wa \
-x  /mnt/share4backup/my-server/myfirst-diff-backup-1
...
-wa \
-x  /mnt/share4backup/my-server/myfirst-diff-backup-2

...
-wa \
-x  /mnt/share4backup/my-server/myfirst-diff-backup-3
...
-wa \
-x  /mnt/share4backup/my-server/myfirst-diff-backup-4
-wa pour ne pas avoir de confirmation lors de la suppression d'un fichier disparu …

Et voila.

Notre répertoire courant contient un etat “exact” du dernier backup effectué.

Si on ne veut extraire qu'une partie de l'arborescence, il suffit d'ajouter par exemple:

...
-g "etc" -g "var/log"

Ce qui ne restorera que les contenus des répertoires “etc” et “var/log” . (avec respect de l'arborescence, of course)

Scripte Backup

Idée de base

On va utiliser un fichier CATALOG externe, pour simplifier les backups.

A chaque etape, on créera le fichier CATALOG: Pour les backups differentiels, on aura besoin de ne faire référence qu'a ce catalogue.

Exemple:

$ dar -c full1 -R download/ -z
$ dar -C CATALOG -A full1

Et pour les incrémentales:

$ dar -c diff1 -A CATALOG -R download/ -z
$ dar -C CATALOG -A diff1

Et ainsi de suite:

$ dar -c diff2 -A CATALOG -R download/ -z
$ dar -C CATALOG -A diff2

Nul besoin de connaitre le nom du fichier précedent: il suffit d'avoir le “catalog” a jour.

Application

  • Full le dimanche
  • Differentiel le reste de la semaine
  • Les backups sont stockes sur un partage externe (NFS, SAMBA, FTPFS ou autres)
  • Le catalogue reste sur la machine (sans les données donc)

Mise en place avec 3 fichiers, dont 2 fichiers de conf.

Les 2 fichiers de conf:

  • dar_backup.conf
  • dar_backup_options.conf

Contenu de dar_backup.conf ( a adapter ) :

BACKUP_DIR="/mnt/backups"
CATALOG_DIR=/var/backups
STATUS_DIR=${CATALOG_DIR}
NAME="mail-local-eez"
DAR_OPTIONS="-B dar_backup_options.conf"
#DISABLE_NICE=1
# ---------- Root Readable Only -------------
#SECRET_KEY="bf:xxxxxxxxx"
# -------------------------------------------

Qui dit en gros:

  • Sauvegarde dans le répertoire (dans les faits, un partage samba) dans BACKUP_DIR
  • Garde le catalogue dans le répertoire CATALOG_DIR
  • Garde ton status/etat dans STATUS_DIR
  • Les fichiers seront prefixé par le nom NAME
  • Les parametres a passer a dar sont dans DAR_OPTIONS
  • On n'active pas “nice” (suffit de decommenter)
  • On ne chiffre pas avec “blowfish” (suffit de décommenter et choisir un mot de passe)

Contenu de dar_backup_options.conf ( a adapter ) :

-w
--slice 2G
-R "/"
-z6
-Z "*.zip"
-Z "*.gz"
-D
-P proc
-P dev
-P sys
-P mnt
-P tmp

Qui dit en trés gros:

  • sauvergarder a partir de la racine
  • compresser , mais ne fait pas des fichiers de plus de 2G.
  • ne prendre en compte que l'essentiel (ni '/mnt' ni '/tmp' etc…)

Le script:

Pour mon usage, les 2 fichiers de conf vont dans:

/usr/local/etc

Et le script dans:

/usr/local/bin

Pour l'executer :

# cd /usr/local/etc

Et taper:

# /usr/local/bin/dar_backup.sh

Que ce passe-t'il ?

Un “full” backup est executé la 1er fois, ou chaque dimanche.

Les backups sont stockés sur un partage, et ils n'ont plus besoin d'être accessible.

L'essentiel (pour enchainer les backups), le catalogue et le status de la conf, est maintenu en local dans /var/backups .

J'active l'execution quotidienne dans le cron :

# crontal -l
20 4  *  *  *  cd /usr/local/etc; /usr/local/bin/dar_backup.sh >/dev/null

Pour être complet: un autre scripte , sur une autre machine, va récuperer les backups, les chiffrer avec “gpg” , puis les archiver sur… dl.free.fr avec dlfix ;-)

D'où la limite de 2G :-)

blog/2012/07/09/dar.txt · Dernière modification: 2012/07/09 12:04 par thierry