Backup de système sous linux

Cet article date de 2007! Je n'utilise plus cette méthode.

Un virus ou une erreur peuvent effacer nos données, le disque dur peut briser et on peut même se faire voler son ordinateur, donc perdre ses données. C'est pourquoi il faut avoir une bonne méthode de sauvegarde disponible à maîtriser. Personnellement, j'utilise un script que j'ai pêché sur le web et que j'ai légèrement modifié afin de mieux me servir. Les liens conséquents seront disponible à la fin de l'article.

Ce script pour linux (et probablement les autres unix) utilise rsync et des hardlinks pour faire des sauvegardes incrémentales sans utiliser trop d'espaces. Cette méthode sauvegarde que les fichiers modifiés ou créés depuis la dernière sauvegarde en supprimant ceux qui ont été supprimés. Plus de détails sur la méthode utilisée sont disponibles sur le site du créateur.

Initialement, le script était en deux parties et était automatisé. À chaque heure on avait un backup des fichiers et à chaque jour une copie de backup. C'est bien, mais je ne veux pas que mes backups se fassent de manière automatisé; je backup sur un disque dur externe et j'ai un portable, donc il pourrait y avoir des erreurs. J'ai donc utilisé le script qui fait la mise à jour de la sauvegarde à chaque heure et j'ai enlevé les parties ayant rapport avec le montage de disque dur.

Ce script garde quatre sauvegardes en tout. Si on en fait une par semaine, on a un total d'un mois de sauvegardé. Parfait si on supprime par mégarde un fichier qui était présent au courant du dernier mois, sauf si le fichier en question a été créé et supprimé entre deux sauvegardes. Rien ne vous empêche d'utiliser ce script de façon journalière.

Si vous voulez garder plus que quatre étapes de mise à jour, pour l'instant, vous devrez modifier le script. Je vais probablement faire des modifications dans le futur au script pour permettre de mieux choisir un dossier à être sauvegardé et un nombre de sauvegardes à conserver. J'hésite encore à savoir si je vais le garder au format bash ou si je vais le traduire dans un langage que je connais mieux, comme le PHP par exemple.

Utilisation

L'utilisation du script est simple. Vous le sauvegardez dans un endroit où root peut le lire, vous le rendez exécutable et vous l'exécutez avec les privilèges super-utilisateur. Dans la mouture actuelle, le dossier /home est sauvegardé en entier.

Les règles pour les fichiers et dossiers à être ignorés sont à écrire dans le fichier /home/backup_exclude, vous devrez créer ce fichier. Les règles d'exclusions sont les règles de rsync. Personnellement, je n'ai pas réussi à faire fonctionner les exclusions.

Vous devrez modifier /media/disque/dossier-backups/ pour le dossier où vous ferez votre sauvegarde. De préférence, faites les sur un média externe à votre ordinateur, de cette manière, il y aura moins de risque de perdre vos données.

Le script
#!/bin/bash
# ----------------------------------------------------------------------
# mikes handy rotating-filesystem-snapshot utility
# ----------------------------------------------------------------------
# Modded by Samuel Dionne-Riel
# ----------------------------------------------------------------------
# this needs to be a lot more general, but the basic idea is it makes
# rotating backup-snapshots of /home whenever called
# ----------------------------------------------------------------------

unset PATH      # suggestion from H. Milz: avoid accidental use of $PATH

# ------------- system commands used by this script --------------------
ID=/usr/bin/id;
ECHO=/bin/echo;

RM=/bin/rm;
MV=/bin/mv;
CP=/bin/cp;
TOUCH=/bin/touch;

RSYNC=/usr/bin/rsync;


# ------------- file locations -----------------------------------------

SNAPSHOT_RW=/media/disque/dossier-backups/; #À modifier
EXCLUDES=/home/backup_exclude; #À créer


# ------------- the script itself --------------------------------------

# make sure we're running as root
if (( `$ID -u` != 0 )); then { $ECHO "Sorry, must be root.  Exiting..."; exit; } fi

# rotating snapshots of /home (fixme: this should be more general)

# step 1: delete the oldest snapshot, if it exists:
if [ -d $SNAPSHOT_RW/home.3 ] ; then                    \
$RM -rf $SNAPSHOT_RW/home.3 ;                           \
fi ;

# step 2: shift the middle snapshots(s) back by one, if they exist
if [ -d $SNAPSHOT_RW/home.2 ] ; then                    \
$MV $SNAPSHOT_RW/home.2 $SNAPSHOT_RW/home.3 ;   \
fi;
if [ -d $SNAPSHOT_RW/home.1 ] ; then                    \
$MV $SNAPSHOT_RW/home.1 $SNAPSHOT_RW/home.2 ;   \
fi;

# step 3: make a hard-link-only (except for dirs) copy of the latest snapshot,
# if that exists
if [ -d $SNAPSHOT_RW/home.0 ] ; then                    \
$CP -al $SNAPSHOT_RW/home.0 $SNAPSHOT_RW/home.1 ;       \
fi;


# step 4: rsync from the system into the latest snapshot (notice that
# rsync behaves like cp --remove-destination by default, so the destination
# is unlinked first.  If it were not so, this would copy over the other

# snapshot(s) too!
$RSYNC                                                          \
        -va --delete --delete-excluded                          \
        --exclude-from="$EXCLUDES"                              \
               /home/ $SNAPSHOT_RW/home.0 ;
        
# step 5: update the mtime of .0 to reflect the snapshot time
        
$TOUCH $SNAPSHOT_RW/home.0 ;
# and thats it for home.
Sources

En anglais: Site du créateur: http://www.mikerubel.org/​computers/​rsync_snapshots/
Contribution à propos des règles d'exclusions rsync: http://www.mikerubel.org/​computers/​rsync_snapshots/​contributed/​martijn_kruissen