Dar

dar est un utilitaire sous linux permettant de réaliser des sauvegardes simple avec quelques fonctions avancées comme :

  • la gestion des sauvegardes complètes et incrémentales
  • le support du chiffrement des données
  • la compression des données

Cette page décrit comment l'utiliser ponctuellement ou de manière automatisée.

Installation

Installer le paquet :

  • dar

Aide intégrée

Voici le résultat de l'aide intégrée à dar.

# dar -h
usage: dar [ -c | -x | -d | -t | -l | -C | -+ ] [<path>/]<basename> [options...]
       dar -h
       dar -V

Commands are:
   -c  creates an archive
   -x  extracts files from the archive
   -d  compares the archive with the existing filesystem
   -t  tests the archive integrity
   -l  lists the contents of the archive
   -C  isolates the catalogue from an archive
   -+  merge two archives / create a sub archive

   -h  displays this help information
   -V  displays version information

Common options:
   -v              verbose output
   -q              suppress final statistics report
   -vs             display skipped files
   -R <path>       filesystem root directory (current dir by default)
   -X <mask>       files to exclude from the operation (none by default)
   -I <mask>       files to include in the operation (all by default)
   -P <path>       subdirectory to exclude from the operation
   -g <path>       subdirectory to include in the operation
   -[ <filename>   filename contains a list of files to include
   -] <path>       filename contains a list of files to exclude
   -n              don't overwrite files
   -w              don't warn before overwriting files
   -wa             don't warn before overwriting and removing files
   -b              ring the terminal bell when user action is required
   -O[ignore-owner | mtime | inode-type] do not consider user and group
                   ownership
   -H [N]          ignore shift in dates of an exact number of hours
   -E <string>     command to execute between slices
   -F <string>     same as -E but for the archive of reference
   -u <mask>       mask to ignore certain EA
   -U <mask>       mask to allow certain EA
   -K <string>     use <string> as key to encrypt/decrypt
   -J <string>     same as -K but it does concern the archive of reference
   -# <integer>    encryption block size
   -* <integer>    same as -# but for archive of reference
   -B <filename>   read options from given file
   -N              do not read ~/.darrc nor /etc/darrc configuration file
   -e              dry run, fake execution, nothing is produced
   -Q              suppress the initial warning when not launched from a tty
   -aa             do not try to preserve atime of file open for reading.
   -ac             do not try to preserve ctime (default behavior).
   -am             set ordered mode for all filters
   -an             the masks that follow are now case insensitive
   -acase          the masks that follow are now case sensitive
   -ar             set the following masks to be regex expressions
   -ag             set the following masks to be glob expressions
   -j              ask user what to do when memory is exhausted

Saving / Isolation / merging options (to use with -c, -C or -+):
   -A [path/]<basename> archive to take as reference
   -@ [path/]<basename> auxiliary archive of reference for merging
   -$ <string>     encryption key for auxiliary archive
   -~ <string>     command between slices of the auxiliary archive
   -z [level]      compress data in archive using gzip algorithm
   -y [level]      compress data in archive using bzip2 algorithm.
   -s <integer>    split the archive in several files of size <integer>
   -S <integer>    first file size (if different from following ones)
   -aSI            slice size suffixes k, M, T, G, etc. are power of 10
   -abinary        slice size suffixes k, M, T, G, etc. are power of 2
   -p              pauses before writing to a new file
   -D              excluded directories are stored as empty directories
   -Z <mask>       do not compress the matching filenames
   -Y <mask>       do only compress the matching filenames
   -m <number>     do not compress file smaller than <number>
   --nodump        do not backup, files having the nodump 'd' flag set
   -G [path/]<basename> Do on-fly catalogue isolation of the resulting archive
   -M              stay in the same filesystem while scanning directories
   -,              ignore directories that follow the Directory Tagging
                   Standard

Restoring options (to use with -x) :
   -k              do not remove files destroyed since the reference backup
   -r              do not restore file older than those on filesystem
   -f              do not restore directory structure

Reading options (to use with -x, -d, -t, -l, -A)
   -i <named pipe> pipe to use instead of std input to read data from dar_slave
   -o <named pipe> pipe to use instead of std output to orders dar_slave

Listing options (to use with -l):
   -T              tree output format
   -as             only list files saved in the archive


Type "man dar" for more details and for all available options.

Sauvegarder un dossier à la main

Commençons par un simple sauvegarde de /home :

dar -v -c home -R / -g home

Quelques détails des options :

  • -c home : indique que nous voulons créer la sauvegarde home.dar
  • -R / : défini le chemin relatif pour la sauvegarde, sinon le répertoire actuel est utilisé
  • -g home : indique le répertoire à sauvegarder, celui-ci est relatif à l'option -R
  • -v : active le mode verbeux

Exemple d'exécution :

# dar -v -c home -R / -g home
Adding file to archive: /home
Adding file to archive: /home/matthieu
Adding file to archive: /home/matthieu/.bashrc
Adding file to archive: /home/matthieu/.bash_logout
Adding file to archive: /home/matthieu/.profile
....
....
Writing archive contents...


 --------------------------------------------
 56 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)
 28 inode(s) ignored (excluded by filters)
 0 inode(s) recorded as deleted from reference backup
 --------------------------------------------
 Total number of inodes considered: 84
 --------------------------------------------
 EA saved for 0 inode(s)
 --------------------------------------------

Lister les fichiers sauvegardés

Pour visualiser la sauvegarde, il faut utiliser l'option -l :

dar -l home

Exemple :

[data ][ EA  ][compr] | permission | user  | group | size  |          date                 |    filename
----------------------+------------+-------+-------+-------+-------------------------------+------------
[Saved]       [-----]   drwxr-xr-x   0  root    0       Sun Mar  7 15:08:58 2010        home
[Saved]       [-----]   drwxr-xr-x   matthieu   matthieu        0       Fri Mar  5 21:48:35 2010        home/matthieu
[Saved]       [     ]   -rw-r--r--   matthieu   matthieu        3116    Fri Mar  5 21:48:35 2010        home/matthieu/.bashrc
[Saved]       [     ]   -rw-r--r--   matthieu   matthieu        220     Fri Mar  5 21:48:35 2010        home/matthieu/.bash_logout
[Saved]       [     ]   -rw-r--r--   matthieu   matthieu        675     Fri Mar  5 21:48:35 2010        home/matthieu/.profile
...

Restaurer une sauvegarde

Avant toute restauration, il est important de comprendre que seule une sauvegarde complète contient toutes les données. Pour restaurer des sauvegardes incrémentales ou différentielles, il faut restaurer dans un premier temps la sauvegarde complète puis les intermédiaires.

:!: L'option -R indique où restaurer, les fichiers présents seront potentiellement écrasés.

dar -v -R /dossier_cible -x sauvegarde_a_restaurer

Exemple :

root@/backup# dar -v -R /restore/ -x full_20120815_040001.1.dar
Warning, full_20120815_040001.1.dar seems more to be a slice name than a base name. Do you want to replace it by full_20120815_040001 ? [return = OK | Esc = cancel]
Continuing...
Extracting contents of the archive...
Restoring file: /restore/selinux
Restoring file: /restore/backup
Restoring file: /restore/bin
Restoring file: /restore/media

Il faut ensuite restaurer les intermédiaires avec la même commande et l'option ”-w” pour écraser les fichiers :

root@/backup# dar -v -R /restore/ -x inc_20120827_040001.1.dar -w
Warning, inc_20120827_040001.1.dar seems more to be a slice name than a base name. Do you want to replace it by inc_20120827_040001 ? [return = OK | Esc = cancel]
Continuing...
Extracting contents of the archive...
Restoring file: /restore/backup
Restoring file: /restore/root

Enfin, pour filtrer la restauration il est possible d'utiliser l'option ”-g” avec le chemin relatif, par exemple pour ne restaurer que root :

root@/backup# dar -v -R /restore/ -x full_20120815_040001.1.dar -g root
Warning, full_20120815_040001.1.dar seems more to be a slice name than a base name. Do you want to replace it by full_20120815_040001 ? [return = OK | Esc = cancel]
Continuing...
Extracting contents of the archive...
Restoring file: /restore/root

Automatisation de la sauvegarde

#!/bin/sh

# Dar backup script
# Matthieu Bouthors
# http://www.bouthors.fr
# licence GPLv2

# location of files
config_dir=/home/scripts
# temporary file
run_file=archive_gandalf_running
# dar options (DCF format)
dar_options=gandalf.dcf
# file that save the last full backup
last_backup_file=last_dar
# destination folder
archive_dir=/data/backup


case "$1" in
  full)
        if [ -e "$config_dir/$run_file" ]
        then
                echo archive already running
        exit 1
        fi
        touch "$config_dir/$run_file"

        archive_file="full_`date +%Y%m%d_%H%M%S`"
        echo $archive_file
        /usr/bin/dar -c $archive_dir/$archive_file -B $config_dir/$dar_options
        if [ $? -eq 0 ]
        then
                echo "$archive_dir/$archive_file" > $config_dir/$last_backup_file
                rm -f "$config_dir/$run_file"
                exit 0
        fi
        rm -f "$config_dir/$run_file"
        exit $?
        ;;
  inc)

        if [ ! -e "$config_dir/$last_backup_file" ]
        then
                echo no previous dar
        exit 1
        fi

        old_dar=`cat $config_dir/$last_backup_file`
        echo reference dar : $old_dar

        if [ ! -e "$old_dar.1.dar" ]
        then
                echo previous dar not found
        exit 1
        fi

        if [ -e "$config_dir/$run_file" ]
        then
                echo archive already running
        exit 1
        fi
        touch "$config_dir/$run_file"

        archive_file="inc_`date +%Y%m%d_%H%M%S`"
        echo $archive_file
        /usr/bin/dar -c $archive_dir/$archive_file -A $old_dar -B $config_dir/$dar_options
        if [ $? -eq 0 ]
        then
                rm -f "$config_dir/$run_file"
                exit 0
        fi
        rm -f "$config_dir/$run_file"
        exit $?
        ;;

  kill)
        killall dar
        rm -f "$config_dir/$run_file"
        exit 0
        ;;
  *)
        echo "option : full, inc"
        exit 1
esac
exit 0

Suppression des anciens fichiers

Voici un script permettant de supprimer les sauvegardes trop vielles

#!/bin/sh

# Dar cleanup script
# Matthieu Bouthors
# http://www.bouthors.fr
# licence GPLv2

#folder to watch :
watch_folder=/data/backup/

# delete inc files older than inc_keep days :
inc_keep=60
# delete full files older than full_keep days :
full_keep=180

now=`date +%s`
limit_keep=$(($now-($inc_keep*86400)))

for filename in `ls $watch_folder/inc*.dar`
do
        find_date_text=`expr match $filename '.*/inc_\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\)_'`
        date_file=`date -d $find_date_text +%s`
        if [ $date_file -lt $limit_keep ]
        then
                /bin/rm -vf $filename
        fi
done


limit_keep=$(($now-($full_keep*86400)))


for filename in `ls $watch_folder/full*.dar`
do
        find_date_text=`expr match $filename '.*/full_\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\)_'`
        date_file=`date -d $find_date_text +%s`
        if [ $date_file -lt $limit_keep ]
        then
               /bin/rm -vf $filename
        fi
done

Backup

Links

linux/dar.txt · Dernière modification: 2012/08/27 18:32 par matthieu
Recent changes RSS feed Debian Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki