Connexion

Besoin d'aide ? Une question ? Un avis ? Rejoignez nous sur notre salon IRC pour clavarder

ARCHIVES

Sauvegarde système & home personnalisée

Cet article est à refaire, son contenu n'est pas très fiable.
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

A) Mise en place de la sauvegarde

1) Créer un répertoire où mettre les sauvegardes dans un filesystem contenant de la place disque

par exemple /BACKUP, /home/Backup ou mieux sur un disque dur USB (/media/<nom_de_volume_du_DD_USB>/Backup)

Pour l'exemple, nous utiliserons /BACKUP

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

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'exemple ici suppose que vous avez 2 filesystem : le système / et le /home

Vous pouvez faire la version incrémentale (backup_inc.sh) en remplaçant level0 par level1

Vous pouvez prévoir par exemple un "full" mensuel du / et /home et un incrémental quotidien du /home uniquement

B) Exécution de la sauvegarde

Lancer la sauvegarde manuellement une première fois

Exécuter tout simplement /BACKUP/backup_full.sh

Vous pouvez ensuite l'automatiser dans un cron par exemple (full hebdomadaire à 12h30)

Code :
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


C) Restauration

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

1) Restauration du tout /home

Tous les utilisateurs doivent être délogger

Code :
cd /home; cat /BACKUP/home.level0.tar.* | tar xvzf -


2) Restaurer un user du /home

L'utilisateur 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


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
Cette page a été vue 4761 fois