Documentation

DocumentationDeuxzero

Page d'accueil de la documentation

Documentation 2.0

Dépendances

  • Répertoires locaux ou réseaux: bash, rsync (>= 2.6.1 pour le user non root)
  • Serveurs distants: ssh

Fonctionnalités

  • Synchronisation incrémentale de répertoires locaux, réseaux ou distants (via ssh).
  • Supporte une clé privée ssh pour la connexion aux serveurs distants.
  • Nomage des répertoires de backups au format backupAAAAMMJJ_HHMMSS.0, .1, ... .n
  • Internationalisation: Actuellement 2 langues, FR et EN.
  • Options en ligne de commande pour afficher l'aide, la version, les codes de retour et changer la langue d'affichage.
  • Fichiers de configurations des backups propres à SimpleBackup.
  • Fichiers d'exclusion de répertoires et/ou fichiers des backups - uniquement ceux des scripts SimpleBackup.
  • Explorateur de backups et gestion des restores - uniquement ceux des scripts SimpleBackup.
  • Vérifications effectuées:
    • que le 1er argument - le nombre d’incréments - soit un entier positif compris (par configuration) entre 1 et 100.
    • que le répertoire cible (local ou réseau) existe et soit bien un répertoire.
    • que la source soit: soit un répertoire local ou réseau, qui existe et soit bien un répertoire, soit un serveur distant; si il s'agit d'un serveur distant, l'accès ssh est vérifié.
    • si source est distant, qu'il y ait un chemin au bout de source, sinon ajoute :/ (source:/)
    • que les dépendances ssh et rsync sont accessibles.
    • la réussite ou l'échec de la transaction rsync.
    • la cohérence des trail slashes pour le bon fonctionnement de rsync.
Si une vérification échoue, le programme s'arrête, retourne un code d'erreur et laisse les backups précédents inchangés. Si rsync a rencontré des problèmes, et que un backup partiel existe, ce backup sera sauvegardé "en son état" dans backupAAAAMMJJ_HHMMSS.rsync_error_X où X = le code de retour de rsync. Les backups éventuels préxistants demeurent également inchangés.

Usage.

0 1 2 3 4 5 6 7 8
$> ./simplebackup -h
 
 Usage:  ./simplebackup nb_increments source cible [chemin/absolu/cle_privee] 
         ./simplebackup -f fichier_config 
         ./simplebackup [-h] 
         ./simplebackup -v 
         ./simplebackup -i 
         ./simplebackup -c
 
  • nb_increments: entre 1 et 100 (par configuration).
  • source: si source commence par un /, il est considéré comme le chemin absolu vers un répertoire, sinon il est considéré comme un serveur distant. Si pas de chemin (serveur:/[chemin/]), simplebackup tentera alors le backup de l'entièreté du serveur.
  • cible: chemin absolu vers un répertoire local.
  • [chemin/absolu/cle_privee]: pour accès distant. Si la clé privée n'a pas de passphrase, aucun mot de passe ne sera demandé.
Le dernier argument optionnel [chemin/absolu/cle_privee] est le chemin vers une clé privée SSH. Il n’en sera tenu compte que si il existe. Ceci est pratique pour des backups via un cron en évitant un mot de passe de connexion. Plus sur le transfert RSYNC sans mot de passe
  • -f <config_file>: exécute un fichier de configuration qui se trouve dans le répertoire des scripts.
  • [-h]: cette aide.
  • -v: affiche la version et sort du programme.
  • -i: script interactif pour l'explorateur de backups, les restore et la langue de l'affichage.
  • -c: affiche les codes de retour.

Note importante: Les derniers backups effacés dépendent de nb_increments ; ce qui entraîne le comportement suivant : Si, en ligne de commande, nb_increments est augmenté, le nombre de backups augmentera simplement jusqu’au maximum. Si il est diminué, tous les backups supérieurs à nb_increments seront supprimés.

Installation

Mono utilisateur
  • Télécharger l'archive.
  • La décompresser
    0
    $> tar -tvf simplebackup_X.X-revY.gz
    
    Ceci décompressera les fichiers dans le répertoire simplebackup.
  • Ensuite:
    0
    chmod 755 [/chemin/]simplebackup/simplebackup
    
    Voyez ensuite ce point : Les chemins d'exécution
Si vous utilisez cron, attention à la manière dont il traite les variables d'environnement! Voyez ce point

Multi utilisateur (root)
En tant que root et judicieusement dans /opt
  • Télécharger l'archive (dans /opt).
  • La décompresser
    0 1
    #> tar -tvf simplebackup_X.X-revY.gz
    #> chmod 755 /opt/simplebackup/simplebackup
    
    Ceci décompressera les fichiers dans le répertoire simplebackup.
  • Ensuite, rendre l'application disponible pour tous; il y a là plusieurs solutions:
    • /opt est dans le chemin des exécutables; plus rien à faire ;)
    • /opt n'est pas dans le chemin des exécutables, mais vous voulez y mettre /opt/simplebackup :
      0 1 2 3
      #> vim /etc/bashrc
      export PATH=$PATH:/opt/simplebackup
      :wq
      #> source /etc/bashrc
      
    • Vous voulez placer la commande dans le chemin par défaut:
      0 1
      #> cd /usr/local/bin
      #> ln -s /opt/simplebackup/simplebackup simplebackup
      
    Enfin, placez le chemin absolu vers le répertoire de simplebackup (sans trail slash) dans la variable d'environnement "SB_ENV_SIMPLEBACKUP" Par exemple:
    0 1 2 3
    $> vim /etc/bashrc
    export SB_ENV_SIMPLEBACKUP="/opt/simplebackup"
    :wq
    $> source /etc/bashrc
    
    Voyez ensuite ce point : Les chemins d'exécution
    Si vous utilisez cron, attention à la manière dont il traite les variables d'environnement! Voyez ce point Voilà ;)

    Les chemins d'exécution

    Malgré une (belle ;)) tentative avec la 1.2, ces chemins ont continué à être instables; pas très très grave, mais pas solide non plus ;(. La 1.3 stabilise et simplifie les choses.
    A partir de 1.3, il ne reste plus que 2 cas de figure:
    1. Vous êtes dans le répertoire de simplebackup, vous entrez ./simplebacup ... et c'est cette instance qui s'exécutera. (même si la variable d'environnement SB_ENV_SIMPLEBACKUP existe).
    2. Le chemin absolu vers le répertoire de simplebackup (sans trail slash) est dans la variable d'environnement "SB_ENV_SIMPLEBACKUP"
    Par exemple:
    0 1 2 3
    $> vim [/chemin/.]bashrc
    export SB_ENV_SIMPLEBACKUP="[/chemin/absolu/vers]/simplebackup"
    :wq
    $> source [/chemin/.]bashrc
    
    Sauf, si vous êtes dans le répertoire racine d'une instance (voir 1. ci-dessus), c'est l'instance dont le chemin est défini dans la variable d'environnement "SB_ENV_SIMPLEBACKUP" qui s'exécutera; chemin relatif, absolu, simplebackup changé en commande; à vous de jouer, là !
    Si vous utilisez cron, attention à la manière dont il traite les variables d'environnement! Voyez ce point

    Fichier de configuration

    Actuellement, permet seulement de définir le nombre d'incréments maximum autorisé. etc/sb-conf-dist est l'exemple que vous récupérez avec la distribution. Pour maintenir votre version personnalisée, copiez sb.conf-dist vers sb.conf-prod.

    - Les fichiers -dist (distribution) sont des fichiers de configuration par défaut (etc/sb.conf-dist) ou des exemples accompagnant la distribution (scripts/exemple-dist)
    - Les fichier -prod (production) ne sont jamais distribués, à vous de les créer, configurations ou scripts

    Comportement:
    - etc/sb.conf-prod: si ce fichier n'existe pas, SimpleBackup cherchera à utiliser etc/sb.conf-dist
    - scripts/: tous les fichiers seront pris en compte, sauf scripts/*-dist

    Utilisation des scripts SimpleBackup

    tous les arguments des commandes du type:
    0 1
    $> /home/moi/bin/simplebackup/simplebackup 30 /home/moi/RepASauvegarder/ /home/moi/DisqueReseau1/backups 
    $> /home/moi/bin/simplebackup/simplebackup 30 user@domain.tld:/home/moi/RepASauvegarder/ /home/moi/Backups/DisqueReseau2/MonRep /home/moi/.ssh_bck/id_dsa
    
    peuvent être avantageusement remplacés par des scripts propres à simplebackup

    Exemple:
    0 1
    $> /home/moi/bin/simplebackup/simplebackup -f DisqueReseau1
    $> /home/moi/bin/simplebackup/simplebackup -f DisqueReseau2
    
    ou /home/moi/bin/simplebackup/simplebackup/scripts/DisqueReseau1 =
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    ### fichier de configuration DisqueReseau1
    # nombre d'incréments (X = nombre entier positif)
    SB_NBINCREMENTS=30
     
    # source du backup (les trails slashes n'ont pas d'importance)
    SB_SOURCE="/home/moi/RepASauvegarder"
     
    # cible du backup (les trails slashes n'ont pas d'importance)
    SB_TARGET="/home/moi/DisqueReseau1/backups"
     
    # cle ssh privée éventuelle (laisser vide si pas utile)
    SB_PRIVKEY=""
     
    # nom du fichier d'exclusion obligatoirement dans ./scripts 
    # Le nom de ce fichier doit obligatoirement se terminer par -exclude
    # Si pas de fichier d'exclusion, laisser vide: SB_FICHIER_EXCLUSION=""
    SB_FICHIER_EXCLUSION=""
    
    et ou /home/moi/bin/simplebackup/simplebackup/scripts/DisqueReseau2 =
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    ### fichier de configuration DisqueReseau2
    # nombre d'incréments (X = nombre entier positif)
    SB_NBINCREMENTS=30
     
    # source du backup (les trails slashes n'ont pas d'importance)
    SB_SOURCE="user@domain.tld:/home/moi/RepASauvegarder"
     
    # cible du backup (les trails slashes n'ont pas d'importance)
    SB_TARGET="/home/moi/Backups/DisqueReseau2/MonRep"
     
    # cle ssh privée éventuelle (laisser vide si pas utile)
    SB_PRIVKEY="/home/moi/.ssh_bck/id_dsa"
     
    # nom du fichier d'exclusion obligatoirement dans ./scripts 
    # Le nom de ce fichier doit obligatoirement se terminer par -exclude
    # Si pas de fichier d'exclusion, laisser vide: SB_FICHIER_EXCLUSION=""
    SB_FICHIER_EXCLUSION=""
    
    Les scripts simplebackups doivent obligatoirement se trouver dans le sous-répertoire ./scripts/ de simplebackup et être appelés ainsi: simplebackup -f <nom_script>
    Cette façon de faire permet d'utiliser les fichiers d'exclusion, d'explorer les backups et de gérer les restore.

    Exclure des fichiers et des répertoires

    Cela se fait via l'ajout d'un fichier d'exclusion propre à un script simplebackup, dans le répertoire ./script. Le nom de ce fichier doit obligatoirement se terminer par -exclude et être défini dans la variable SB_FICHIER_EXCLUSION du script simplebackup correspondant. (voir point précédent)
    0 1 2 3 4
     
    # Le nom de ce fichier doit obligatoirement se terminer par -exclude
    # Si pas de fichier d'exclusion, laisser vide: SB_FICHIER_EXCLUSION=""
    SB_FICHIER_EXCLUSION="[nom_fichier_exclusion]"
     
    
    Pour le reste, toutes les explications sont dans le fichier d'exemple ./scripts/exemple-dist-exclude
    ## Fichier contenant une liste de fichier ou de répertoire à exclure du backup
    ; !!! obligatoirement dans le répertoire ./scripts et son nom doit obligatoirement se terminer par -exclude !!!
    # Suggestion: Si vous avez un script mybackup-prod, nommez son éventuel fichier d'exclusion mybackup-prod-exclude ?
     
    # exclude patterns: one per line. Blank lines in the file and lines starting with ’;’ or ’#’ are ignored.
    # Exclude path is always relative! /dir1/dir2 = dir1/dir2 (from rsync source)
    # Samples:
    # 1. EXCLUDE A SPECIFIC DIRECTORY (including all it’s subdirectories)
    ; dir1
    # 2. EXCLUDE MULTIPLE DIRECTORIES THAT MATCHES A PATTERN (dir)
    ; dir*
    # 3. EXCLUDE A SPECIFIC FILE
    ; dir/somefile.txt
    # 4. EXCLUDE A SPECIFIC FILE TYPE
    ; *.txt
     
    ## Attention au piège des espaces finaux !!!
    ; dir<espace_final> est différent de dir
     
    ## Doc sur --exclude-from: man rsync +
    # http://injustfiveminutes.com/2013/09/09/exclude-multiple-files-and-directories-with-rsync/
    # http://www.thegeekstuff.com/2011/01/rsync-exclude-files-and-folders/
     
    ### Entrez les noms des fichiers ou répertoires à exclure ci-dessous (un par ligne) 
     
     
    
    Voyez aussi le point: Stratégie d'exclusion et espace disque

    Utilisation de cron en général

    Attention à la manière dont cron traite les variables d'environnement! Par exemple, le shell par défaut sera fixé à /bin/sh (et pas /bin/bash). Donc,
    0 1 2 3 4
    $> crontab -e
    # ENV
    SHELL=/bin/bash
    ...
    # m h  dom mon dow   command
    
    et si vous utilisez la variable d'environnement SB_ENV_SIMPLEBACKUP:
    0 1 2 3 4 5
    $> crontab -e
    # ENV
    SHELL=/bin/bash
    SB_ENV_SIMPLEBACKUP=/chemin/absolu/simplebackup
    ...
    # m h  dom mon dow   command
    
    Sans quoi, cron ne reconnaîtra pas la variable SB_ENV_SIMPLEBACKUP, ce qui risque d'entraîner un échec du backup qui sera signalé par le message "simplebackup n'est pas dans PATH, ni dans ENV" (exit 5).

    Utilisation de cron et de send-notify

    Ceci concerne plutôt l'utilisateur local
    Utilisation de cron
    Exemple: Backups d'un répertoire local sur un disque réseau monté sur ma machine et backup d'un répertoire distant sur ma machine locale, tous les jours du lundi au vendredi à 9:30. Créons un petit script de backup:
    0 1 2 3
    $> vim backupsSomeDirs.sh
    #!/bin/bash
    /home/moi/bin/simplebackup/simplebackup -f DisqueReseau1
    /home/moi/bin/simplebackup/simplebackup 30 user@domain.tld:/home/moi/RepASauvegarder/ /home/moi/Backups/DisqueReseau2/MonRep /home/moi/.ssh_bck/id_dsa
    
    et maintenant, le cron:
    0 1
    $> crontab -e
    30 9 * * 1-5 /home/moi/backupsSomeDirs.sh
    
    Utilisation de send-notify (ou notify-send)
    On souhaite recevoir une notification des backups, via send-notify.
    Pour lancer une application graphique (ou un notify dbus, par exemple) avec cron, il faut d’abord s’ajouter à la liste des utilisateurs autorisés à se connecter au serveur X, ceci à l’aide du programme xhost.

    Par exemple sur Debian : /usr/bin/xhost +si:localuser:$(whoami)
    ou sur ma SLES au boulôt : /usr/bin/xhost +local:$(whoami)

    voyez "man xhost" pour avoir la liste adéquate des "family:name" correspondant à votre système.

    Il faut maintenant rendre cela permanent:
    0 1
    $> vim ~/.profile
    /usr/bin/xhost +si:localuser:$(whoami)
    
    Ensuite,
    0
    $> echo $DISPLAY
    
    qui donne en général un résultat tel que :0 ou :0.0 etc. On suppose que c'est :0, et on modifie /home/moi/backupsSomeDirs.sh en conséquence:
    0 1 2 3 4 5
    ~/bin/$> vim backupsSomeDirs.sh
    #!/bin/bash
    DISPLAY=:0 send-notify -t 0 "Backups starting" "`date`"
    /home/moi/bin/simplebackup/simplebackup  -f DisqueReseau1 
    /home/moi/bin/simplebackup/simplebackup 30 user@domain.tld:/home/moi/RepASauvegarder/ /home/moi/Backups/DisqueReseau2/MonRep /home/moi/.ssh_bck/id_dsa
    DISPLAY=:0 send-notify -t 0 "Backups done" "`date`"
    

    Utilisation de cron et de log

    Ceci concerne plutôt l'utilisateur root
    Utilisation de cron et envoi de messages dans des log
    On va supposer qu'on backup le même que dans l'exemple précédent, mais pour root.
    D'abord, créons un petit script de séparation des messages de log par la date et le nom du backup entré en paramètre:
    0 1 2 3
    #> vim displayDate.sh  
    #!/bin/bash
    d="\n+++++++++++++++\n`date` - Backup $1\n+++++++++++++++"
    echo -e $d
    
    Maintenant, voyons le backupsSomeDirs.sh pour root:
    0 1 2 3 4 5
    #> vim backupsSomeDirs.sh
    #!/bin/bash
    /root/displayDate.sh "/root/RepASauvegarder/" >> /var/log/simplebackup/simplebackup.log
    /opt/simplebackup/simplebackup -f DisqueReseau1  >> /var/log/simplebackup/simplebackup.log
    /root/displayDate.sh "user@domain.tld:/var/www/RepASauvegarder/" >> /var/log/simplebackup/simplebackup.log
    /opt/simplebackup/simplebackup 30 user@domain.tld:/var/www/RepASauvegarder/ /root/Backups/DisqueReseau2/MonRep /root/.ssh_bck/id_dsa >> /var/log/simplebackup/simplebackup.log
    
    Le crontab sera identique au précédent. Reste maintenant à éviter l'inflation des log avec logrotate:
    Utilisation de logrotate
    Rotation des log tous les 100k, 500k max. Dans /etc/logrotate.conf:
    0 1 2 3 4 5 6 7 8
    # system-specific logs may be also be configured here.
    "/var/log/simplebackup/simplebackup.log" {
           rotate 5
           errors moi@localhost
           size=100k
           endscript
           nocompress
    }
     
    

    Gestion des droits

    Suivant que vous soyez root ou simple user, vous serez (comme dans la fable de Lafontaine) puissant ou misérable. En effet, un simple user sera propriétaire des fichiers et répertoires de backup; ce qui peut causer des problèmes de droits lors d'un restore. La vérité par l'exemple: Soit ce site web:
    0 1 2 3 4 5
    $ ls -l /var/www/siteweb
    total 20
    -rw-rw-r-- 1 moi      moi      6466 mars  15  2013 index.php
    drwxr-xr-x 4 www-data www-data 4096 sept.  8  2013 jean
    drwxr-xr-x 4 www-data www-data 4096 sept. 22  2013 robert
    drwxrwxr-x 7 moi      moi      4096 sept. 22  2013 system
    
    Si j'utilise SimpleBackup comme simple user (le user "moi" par exemple), voici quels seront les droits résultant d'un backup de siteweb:
    0 1 2 3 4 5
    $ ls -l tguser/backupAAAAMMJJ_HHMMSS.0/
    total 20
    -rw-rw-r-- 1 moi moi 6466 mars  15  2013 index.php
    drwxr-xr-x 4 moi moi 4096 sept.  8  2013 jean
    drwxr-xr-x 4 moi moi 4096 sept. 22  2013 robert
    drwxrwxr-x 7 moi moi 4096 sept. 22  2013 system
    
    Lors d'un restore, il faudra des droits de root pour rendre au serveur web ce qui lui appartient (ici, les répertoires www-data:www-data)
    Si on backup en tant que root, on aura:
    0 1 2 3 4 5
    # ls -l tgroot/backupAAAAMMJJ_HHMMSS.0/
    total 20
    -rw-rw-r-- 1 moi      moi      6466 mars  15  2013 index.php
    drwxr-xr-x 4 www-data www-data 4096 sept.  8  2013 jean
    drwxr-xr-x 4 www-data www-data 4096 sept. 22  2013 robert
    drwxrwxr-x 7 moi      moi      4096 sept. 22  2013 system
    
    Ce qui est nettement plus pratique lors d'un restore. Bref, attention aux droits pour les restores !
    Note importante: La révision 54 de SimpleBackup 2.0 supprime le paramètre --n-o de la synchronisation des backups. SimpleBackup utilisait jusqu'à présent l'option --no-o (ne préserve pas le propriétaire), parce qu'un bug pouvait empêcher —link-dest de fonctionner pour un utilisateur non root si -o était activée (ce qui est implicitement le cas dans SimpleBackup qui emploie -a = -rlptgoD). Mais ceci concerne uniquement les versions de rsync antérieure à 2.6.1; et la dernière est la 3.1.0 3.1.0 released September 28th, 2013. La révision 54 de SimpleBackup 2.0, a supprimé cette option encombrante qui entrainait des problèmes de gestions de droits pour root.

    Restauration

    • Les restaurations ne s'effectuent que à partir des backup dépendant d'un script de backup.
    • La commande utilisée par SimpleBackup pour la restauration est la suivante:
      0
      rsync -av [-e "ssh -i <private_key>] SOURCE/ TARGET
      
      (Les trail slashes sont gérés)
    • Lorsque vous effectuez un restore, il est prudent de vérifier les droits.
    • La restauration s'effectuant en manuel, les diverses vérifications de problèmes éventuels effectuées lors des backups ne sont pas d'application ici. En effet, les problèmes éventuels s'afficheront directement dans la console.
    L'explorateur de backup
    Démarrer l'explorateur: Avec simplebackup -i, l'otion 2) permet d'entrer dans l'explorateur de backup.
    0 1 2 3 4 5 6 7 8 9 10
    # /root/bin/simplebackup/simplebackup -i
    1) Abandon                        3) Choisir la langue d'affichage
    2) Explorer les backups
    Votre choix ?2
    ================================
    FICHIERS -- /root/bin/simplebackup/scripts
    --------------------------------
    1) Abandon
    2) /root/bin/simplebackup/scripts/intranet
    3) /root/bin/simplebackup/scripts/wdev
    Votre choix ?
    
    2) et 3) correspondent à des scripts simplebackup. Avec 2), je pars vers la restauration de fichiers contenus dans les backups du script "intranet", avec 3) vers celle de fichiers contenus dans les backups du script "wdev".

    Structure de l'explorateur de fichiers:
    ================================
    FICHIERS -- /root/backups/intranet/backup20140612_121106.0
    --------------------------------
    /root/backups/intranet/backup20140612_121106.0/.htaccess
    /root/backups/intranet/backup20140612_121106.0/index.php
    /root/backups/intranet/backup20140612_121106.0/rien.gif
    /root/backups/intranet/backup20140612_121106.0/spip.php
    /root/backups/intranet/backup20140612_121106.0/spip.png
    /root/backups/intranet/backup20140612_121106.0/svn.revision
    --------------------------------
    REPERTOIRES -- /root/backups/intranet/backup20140612_121106.0
    Niveau répertoire: 0
    --------------------------------
     1) Abandon
     2) Retour
     3) Restauration
     4) ..
     5) /root/backups/intranet/backup20140612_121106.0/backups_mysql
     6) /root/backups/intranet/backup20140612_121106.0/config
     7) /root/backups/intranet/backup20140612_121106.0/ecrire
     8) /root/backups/intranet/backup20140612_121106.0/IMG
     9) /root/backups/intranet/backup20140612_121106.0/lib
    Votre choix ?
     
    
    Dans la partie supérieure, les fichiers contenus dans le répertoire /root/backups/intranet/backup20140612_121106.0, dans la partie inférieure, des commandes - 1) à 4) -, puis des sous-répertoires de /root/backups/intranet/backup20140612_121106.0.

    Au dessus des commandes, le niveau répertoire. Les restaurations ne seront autorisée que pour des niveaux >= 0. Entrer un nombre - ici 1) à 9) veut dire activer une commande ou entrer dans un sous-répertoire.
    • 1) Abandon: Sortir du script
    • 2) Retour: Retour au choix des scripts simplebackup
    • 3) Restauration: Lancer la restauration du répertoire en cours (si Niveau répertoire >= 0); une confirmation sera demandée.
    • 4) ..: Répertoire parent
    • 5) - 9): Entrée dans le répertoire correspondant
    Comment restaurer?
    A retenir:
    1. Une restauration est toujours un répertoire et ses éventuels sous-réperoires (pas de restauration de fichier individuel, donc).
    2. Le répertoire où vous vous trouvez est celui qui sera restauré, avec tous ses sous répertoires; le répertoire sera re-créé si il n'existe plus.
    3. Les répertoires parents du répertoire à restaurer doivent exister sur la cible de la restauration.
    Soit à restaurer le répertoire IMG/gif (et tous ses sous-répertoires) malencontreusement effacés sur le site, à partir de /root/backups/intranet/backup20140612_121106.0 (c-à-d, le dernier backup (.0) qui a eu lieu le 12/06/2014 à 12h 11m 06 se.
    # /root/bin/simplebackup/simplebackup -i
    1) Abandon                        3) Choisir la langue d'affichage
    2) Explorer les backups
    Votre choix ?2
    ================================
    FICHIERS -- /root/bin/simplebackup/scripts
    --------------------------------
    1) Abandon
    2) /root/bin/simplebackup/scripts/intranet
    3) /root/bin/simplebackup/scripts/wdev
    Votre choix ?2
    ================================
    FICHIERS -- /root/backups/intranet
    --------------------------------
     
    --------------------------------
    REPERTOIRES -- /root/backups/intranet
    Niveau répertoire: -1
    --------------------------------
    1) Abandon
    2) Retour
    3) Restauration
    4) .
    5) /root/backups/intranet/backup20140612_121106.0
    Votre choix ?5
    ================================
    FICHIERS -- /root/backups/intranet/backup20140612_121106.0
    --------------------------------
    /root/backups/intranet/backup20140612_121106.0/.htaccess
    /root/backups/intranet/backup20140612_121106.0/index.php
    /root/backups/intranet/backup20140612_121106.0/rien.gif
    /root/backups/intranet/backup20140612_121106.0/spip.php
    /root/backups/intranet/backup20140612_121106.0/spip.png
    /root/backups/intranet/backup20140612_121106.0/svn.revision
    --------------------------------
    REPERTOIRES -- /root/backups/intranet/backup20140612_121106.0
    Niveau répertoire: 0
    --------------------------------
     1) Abandon
     2) Retour
     3) Restauration
     4) ..
     5) /root/backups/intranet/backup20140612_121106.0/backups_mysql
     6) /root/backups/intranet/backup20140612_121106.0/config
     7) /root/backups/intranet/backup20140612_121106.0/ecrire
     8) /root/backups/intranet/backup20140612_121106.0/IMG
     9) /root/backups/intranet/backup20140612_121106.0/lib
    Votre choix ?8
    ================================
    FICHIERS -- /root/backups/intranet/backup20140612_121106.0/IMG
    --------------------------------
    /root/backups/intranet/backup20140612_121106.0/IMG/remove.txt
    /root/backups/intranet/backup20140612_121106.0/IMG/rubon7.jpg
    /root/backups/intranet/backup20140612_121106.0/IMG/rubon8.png
    /root/backups/intranet/backup20140612_121106.0/IMG/siteon0.gif
    --------------------------------
    REPERTOIRES -- /root/backups/intranet/backup20140612_121106.0/IMG
    Niveau répertoire: 1
    --------------------------------
     1) Abandon
     2) Retour
     3) Restauration
     4) ..
     5) /root/backups/intranet/backup20140612_121106.0/IMG/distant
     6) /root/backups/intranet/backup20140612_121106.0/IMG/doc
     7) /root/backups/intranet/backup20140612_121106.0/IMG/flv
     8) /root/backups/intranet/backup20140612_121106.0/IMG/gif
     9) /root/backups/intranet/backup20140612_121106.0/IMG/jpg
    10) /root/backups/intranet/backup20140612_121106.0/IMG/mp3
    Votre choix ?8
    ================================
    FICHIERS -- /root/backups/intranet/backup20140612_121106.0/IMG/gif
    --------------------------------
    /root/backups/intranet/backup20140612_121106.0/IMG/gif/.ok
    /root/backups/intranet/backup20140612_121106.0/IMG/gif/treehome.gif
    --------------------------------
    REPERTOIRES -- /root/backups/intranet/backup20140612_121106.0/IMG/gif
    Niveau répertoire: 2
    --------------------------------
    1) Abandon
    2) Retour
    3) Restauration
    4) ..
    Votre choix ?3
     
    ================================
    Restauration:
    Source de la restauration: /root/backups/intranet/backup20140612_121106.0/IMG/gif/
    >> Cible de la restauration: root@monserveur.tld:/srv/www/htdocs/monsite/IMG/gif
    Clé privée: /root/.ssh/id_dsa
     
    ================================
    Démarrage de la restauration ???
     
    1) Abandon
    2) Restauration:
    Votre choix ?2
    Vous avez choisi 2) Restauration:
     
    ================================
    Démarrage de la restauration
     __         __
    |oo|>=====>|oo|
     ¨¨         ¨¨
    sending incremental file list
    ./
     
    sent 78 bytes  received 28 bytes  212.00 bytes/sec
    total size is 3,901  speedup is 36.80
     
    ================================
    Fin de la restauration: /root/backups/intranet/backup20140612_121106.0/IMG/gif/ vers root@monserveur.tld:/srv/www/htdocs/monsite/IMG/gif
     
    
    Notez bien:
    • Si le répertoire gif a été affacé, il sera recréé
    • Le répertoire parent IMG DOIT exister
    Un backup n'est pas un snapshot
    Une restauration est une synchronisation à partir d'un backup vers sa source. Il va restaurer des fichiers existants différents entre le backup choisi et sa source ou des fichiers existant dans le backup mais effacés dans sa source, il ne va pas effacer des fichiers existant dans la source et absents dans le backup.
    Par exemple, un repertoire dir avec 2 sous-répertoires dir1 et dir2:
    • Le 1/1, on backup dir et ses sous-répertoires dir1 et dir2
    • Le 2/1, dans le répertoire source dir, on lance la commande mv dir2 dir3. On a donc maintenant un repertoire dir avec 2 sous-répertoires dir1 et dir3
    • Le 3/1 on restaure dir à partir du backup du 1/1. Le résultat sera un repertoire dir avec 3 sous-répertoires dir1, dir2 et dir3<

    Stratégie d'exclusion et espace disque

    Il est utile dans une stratégie d'exclusion de réfléchir à ceci: Les hard links (qui évitent de retélécharger les fichiers non modifiés, ne sont créés que par comparaison avec le backup précédent dans backupAAAAMMJJ_HHMMSS.0 (qui contient déjà ses propres hard links). Quelle est la conséquence? Pour comprendre le mécanisme sans se donner mal à la tête ;), on postule ici qu'aucun fichier n'est modifié.
    1) On ajoute une exclusion. L'espace disque diminue d'autant pour ce backup. L'espace disque de l'ensemble diminuera lorsque le dernier backup ne comprenant pas l'exclusion aura disparu de par la rotation des backups.
    2) On retire une exclusion après qu'un backup concernant cette exclusion ait déjà eu lieu. Les fichiers de l'exclusion supprimée sont à nouveau téléchargés en entier (puisque on peut plus créer de hard links à partir de backupAAAAMMJJ_HHMMSS.0). Et ils seront donc peut-être en double par rapport à un ancien backup qui ne comprenait pas cette exclusion; et ce jusqu'à, à nouveau, le dernier backup ne comprenant pas l'exclusion aura disparu de par la rotation des backups.

    Exemple simple (encore une fois, on postule ici qu'aucun fichier n'est modifié; on met l'incrément à 2):
    Soit le rep dir avec les sous-rep dir1 (5k), dir2 (5k) et dir3 (5k) = 15k pour dir.
    - On backupe 3 fois. on obtient backup..0, backup..1, backup..2, soit 3 backups total = 15k, vu les hard links
    - On introduit l'exclusion de dir2 et dir3. backup suivant: backup..2 = 15k, backup..1 = 15k, backup..0 = 5k, Total = toujours 15k. Ici, 2 cas de figure:
    1. On poursuit l'exclusion: après encore 2 backups supplémentaires, backup..2 = backup..1 = backup..0 = Total = 5k.
    2. On supprime l'exclusion de dir3. Au prochain backup, backup..2 = 15k, backup..1 = 5k, backup..0 = 10k (mais sans hard links pour dir3) et donc total = 15k + 5k (de la réinclusion de dir3) = 20k
    Voilà, autant savoir.
    <joke>Pour la semaine prochaine, vous ferez l'exercice suivant: soit un backup de 1.345G, avec cache1 = 7% espace disque et cache2 = 9.5% espace disque. Le taux moyen de modification des fichiers est de 12% espace disque / backup. Il y 30 incréments. On vous demande d'exclure cache1 et cache2 au 10ème backup et de réintégrer cache2 4 backup plus tard. Calculez:
    1) l'espace disque maximum nécessaire
    2) quand la situation sera revenue à son minimum
    3) l'age du capitaine</joke>

    Traduction

    gettext or not? that's a question!
    Comme il s'agit d'une petite application, en standalone (presque), avec peu de messages à traduire, j'ai préféré éviter une dépendance supplémentaire (gettext). Bon, c'est un choix discutable ;). En attendant, les fichiers de langues sont dans locale/XX/sb.langue.

    Codes de retour

    0 1 2 3 4 5 6 7
    $> ./simplebackup -c
    0 Succès
    1 Problème d'argument sur la ligne de commande
    2 La connexion ssh ne répond pas
    3 Je ne trouve pas une commande nécessaire (ssh ou rsync)
    4 Rsync a échoué ou rencontré un problème
    5 simplebackup n'est pas dans PATH, ni dans ENV
    100 Problème non identifié
    
    Affichage des codes de retour, imédiatemment après exécution du script:
    0
    $> echo $?
    

    A propos des OS GNU/Linux et BSD/Mac OSX

    SimpleBackup est d'abord développé pour GNU/Linux, puis vérifié sur BSD/Mac OSX. En effet, le bash de BSD est moins riche que celui de GNU. Par exemple, la commande "expr": Sous GNU/Linux,
    0 1
    VAR=`expr length $string` # longueur de $string
    VAR=`expr index "$string" X` # position (ou présence) de X dans $string
    
    fonctionneront; mais pas sous BSD/Mac OSX, dont le expr ne comprend pas index ni length
    (Comme heureusement en ce qui concerne simplebackup, je peux ici me passer de la position et seulement avoir besoin de vérifier la présence de X dans $string,) pour adapter à BSD/Mac OSX, je dois transformer en
    0 1
    VAR=${#string} # longueur de $string
    VAR=`expr "$string" : ".*\(X\).*"` # présence de X dans $string
    
    qui eux, fonctionneront sous les 2 systèmes
    Conclusion: Si vous signalez un bug, il est nécessaire de préciser sous lequel des 2 systèmes il se produit.

    Comment ça marche ?

    On joue sur l’option rsync —link-dest, qui fonctionne comme ceci :
    Soit la commande
    rsync --link-dest=rep_ancien rep_source rep_cible :
    Lorsque rsync copie rep_source vers rep_cible, il compare chaque fichier de rep_source à celui de rep_ancien. Si un fichier de rep_source a été modifié, il le copie dans rep_cible. Sinon, il crée un "hard link" dans rep_cible vers la version précédente du fichier dans rep_ancien.

    En déplacant préventivement rep_ancien vers rep_ancien.1 et rep_cible vers rep_ancien, puis en recommançant le processus décrit ci-dessus, on obtient maintenant un backup avec deux incréments, rep_ancien et rep_ancien.1. rep_cible contient toujours la dernière version complète de rep_source. Et on peut continuer ainsi de suite.

    Notre script va automatiser cela :
    rm backupAAAAMMJJ_HHMMSS.n
    mv backupAAAAMMJJ_HHMMSS.n-1 backupAAAAMMJJ_HHMMSS.n
    ...
    mv backupAAAAMMJJ_HHMMSS.1 backupAAAAMMJJ_HHMMSS.2
    mv backupAAAAMMJJ_HHMMSS.0 backupAAAAMMJJ_HHMMSS.1
    On automatise bien sur le travail ci-dessus dans une boucle, puis on lance la synchronisation.
    rsync --link-dest=backupAAAAMMJJ_HHMMSS.1(rep_ancien) rep_source backupAAAAMMJJ_HHMMSS.0(rep_cible)
    Bon, en fait c'est dans la pratique un peu plus compliqué, car on utilise un répertoire temporaire, mais fondamentalement, c'est ça, ouf! ;-)

    Les autres paramètres de rsync utilisés dans le script :
    — av : archive (-rlptgoD), et bavard
    — (no-o : ne préserve pas le propriétaire (Pour les versions de rsync antérieure à 2.6.1. un bug pouvait empêcher —link-dest de fonctionner pour un utilisateur non root si -o était activée (ce qui est implicitement le cas avec -a = -rlptgoD))) <<== NB: La révision 54 de SimpleBackup 2.0, a supprimé cette option encombrante qui entrainait des problèmes de gestions de droits pour root.
    — delete : supprime les fichiers superflus du répertoire de destination
    — safe-links : ignore les liens symboliques qui pointent à l’extérieur de l’arbre de rep_source

    Le nombre de backups maintenu sera égal au backup courant (backupAAAAMMJJ_HHMMSS.0) + un nombre de backups = à nb_increments, donc un nombre total de backup = à nb_increments + 1.

    Schéma de l'application

    Schéma de l'application 2.0
     
    This page feed: RSS or Atom.
    Global feed: RSS or Atom.