Table des matières
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:
- restorer d'abord a partir du dernier Full (fonctionnel)
- restorer dans l'ordre les differentiels suivants
- 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 dansDAR_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