ARCHIVES

Sauvegarde système & home personnalisée

Cet article a été mis à jour, vous consultez ici une archive de cet article!
Dernière mise à jour : 24/12/2009 à 13h06
Cette méthode est valable pour tout type de distribution
Elle est basé sur la commande tar avec compression et possibilité de faire de l'incrémentale

Elle doit s'exécuter sous root

[size=150]A) Mise en place de la sauvegarde[/size]

1) Créer un répertoire où mettre les sauvegardes dans un filesystem contenant de la place disque
par example /BACKUP, /home/Backup ou mieux sur un disque dur USB (/media/<nom_de_volume_du_DD_USB>/Backup)

Pour l'example, nous utiliserons /BACKUP
Pour un DD USB, vous pouvez toujours créer un lien symbolique (ex: ln -s /media/disk/Backup /BACKUP)

:idea: Eviter de mettre les sauvegardes dans le même disque (ou filesystem) que le système à sauvegarder
sinon prévoir de copier les sauvegardes sur un disque USB ou graver sur CD/DVD ou par réseau sur un autre ordinateur


2) Copier le scripts ci dessous
/BACKUP/backup.sh
Code :
#!/bin/bash


level0() {

    fsname=$1
    fs=$2

    [ -f $fsname.level0.snapshot ] && rm $fsname.level?.snapshot
    [ -f $fsname.level0.tar.gz-aa ]   && rm $fsname.level?.tar.gz* 
    [ -f $fsname.level0.log.gz ]   && rm $fsname.level?.log.gz 

    (
    tar -cvvf - \
    --directory $fs \
    --sparse \
    --gzip \
    --totals \
    --one-file-system \
    --label="$date $HOSTNAME level0 $fsname $fs" \
    --exclude-from=$fsname.excludelist \
    --listed-incremental=$fsname.level0.snapshot \
    . | split -b 2047m - $fsname.level0.tar.gz-
    ) 2>&1 | gzip -c > $fsname.level0.log.gz

    return ${PIPESTATUS[0]}
}


level1() {

    fsname=$1
    fs=$2

    #level0 not found, make it
    if [ ! \( -s $fsname.level0.snapshot -a -f $fsname.level0.tar.gz-aa \) ] ; then

    echo "WARNING level0 not found on $fsname ($fs), make it !"
    level0 $fsname $fs
    return $?
    fi

    cp $fsname.level0.snapshot $fsname.level1.snapshot || exit 1

    (
    tar -cvvf - \
    --directory $fs \
    --sparse \
    --gzip \
    --totals \
    --one-file-system \
    --label="$date $HOSTNAME level1 $fsname $fs" \
    --exclude-from=$fsname.excludelist \
    --listed-incremental=$fsname.level1.snapshot \
    . | split -b 2047m - $fsname.level1.tar.gz-
    ) 2>&1 | gzip -c > $fsname.level1.log.gz

        return ${PIPESTATUS[0]}
}

pre() {
    return 0
    if ! mount | grep " $mp " ; then
    mount $mp || exit 1
    fi
}

post() {
    return 0
    umount $mp
}

export PATH=/sbin:/usr/sbin:/bin:/usr/bin

date=`date`

if [ $# -ne 4 ] ; then 
    echo "usage $0 level0|level1 fsname path mount_point"
    exit 1
fi

mp=$4

case "$1" in
'level0')
    pre
        level0 $mp/$2 $3 || echo "ERROR level0 $mp/$2 $3 return code <> 0 ==> $?. Check log files, please !"
    post
        ;;
'level1')
    pre
        level1 $mp/$2 $3 || echo "ERROR level1 $mp/$2 $3 return code <> 0 ==> $?. Check log files, please !"
    post
        ;;
    *)
        echo "usage $0 level0|level1 fsname path"
esac

Faire un chmod +x /BACKUP/backup.sh pour le rendre exécutable

3) Créer le fichier d'exclusion pour le / (root)
/BACKUP/root.excludelist
Code :
./tmp/*
./var/tmp/*


4) Créer le fichier d'exclusion pour le /home
/BACKUP/home.excludelist
Code :
./Backup/*
./user/tmp/*


5) Créer le script de sauvegarde Total
/BACKUP/backup_full.sh
Code :
echo "*** Backup Full root / ***"
/home/Backup/backup.sh level0 root / /BACKUP
[ "$?" -eq 0 ] && echo "Done"
echo "*** Backup Full home /home ***"
/home/Backup/backup.sh level0 home /home /BACKUP
[ "$?" -eq 0 ] && echo "Done"

Faire un chmod +x /BACKUP/backup_full.sh pour le rendre exécutable
Important : L'example ici suppose que vous avez 2 filesystem : le système / et le /home

:idea: vous pouvez faire la version incrémentale (backup_inc.sh) en remplaçant level0 par level1
Vous pouvez prévoir par example un "full" mensuel du / et /home et un incrémental quotidien du /home uniquement


[size=150]B) Exécution de la sauvegarde[/size]

Lancer la sauvegarde manuellement une première fois
exécuter tout simplement /BACKUP/backup_full.sh

Vous pouvez ensuie l'automatiser dans un cron par exemple (full hebdomadaire à 12h30)
[list]crontab -l
# min(0-59) hours(0-23) day(1-31) month(1-12) dow(0-7) command
30 12 * * 5 /BACKUP/backup_full.sh >/BACKUP/backup_full.log 2>&1[/list]

[size=150]C) Restauration[/size]

Rappel : Toutes ces commandes sont à exécuter sous root

1) Restauration du tout /home
Tous les utilsateurs doivent être délogger
Code :
cd /home; cat /BACKUP/home.level0.tar.* | tar xvzf -


2) Restaurer un user du /home
L'utilsateur user doit être délogger
Code :
cd /home; cat /BACKUP/home.level0.tar.* | tar xvzf - ./user


3) Restaurer ces vidéos
Code :
cd /home; cat /BACKUP/home.level0.tar.* | tar xvzf - ./user/Vidéo


:idea: Vous pouvez restaurer au fichier près, le fichier home.level0.log contient la liste des fichiers sauvegardés

4) Restauration du tout le système /
Il faut démarrer avec un Live CD et monter le disque contenant le système à restaurer (ex: /mnt)
et brancher le disque USB contenant la sauvegarde (ex: /media/disk)
Code :
cd /mnt; cat /media/disk/root.level0.tar.* | tar xvzf -


4) Restaurer /usr/local
Code :
cd /; cat /BACKUP/root.level0.tar.* | tar xvzf - ./usr/local


Editeur : goupil le 23 Février 2009