« Discussion:Les sauvegardes » : différence entre les versions
mAucun résumé des modifications |
|||
(2 versions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
salut ! est-ce que tu comptes parler des outils spécifiques des distributions, comme celui de Mandriva par exemple ? [[Utilisateur:LeaJice|LeaJice]] 5 sep 2006 à 20:40 (CEST) | salut ! est-ce que tu comptes parler des outils spécifiques des distributions, comme celui de Mandriva par exemple ? [[Utilisateur:LeaJice|LeaJice]] 5 sep 2006 à 20:40 (CEST) | ||
Pas du tout dans le sens où les seules distribs que j'ai sous la main sont Arch et Debian. Par contre, je vais regarder un peu ce qui se fait avec des interfaces graphiques. [[Utilisateur:oudoubah|oudoubah]] 7 sep 2006 19h30 | |||
re. Tu pourrais ajouter dans ton § rsync un truc sur les ''sauvegardes incrémentales''. Je m'explique. Je fais un backup régulier sur un serveur sur le net. Dans la crontab de la machine à sauvegarder, vers 22h00, | re. Tu pourrais ajouter dans ton § rsync un truc sur les ''sauvegardes incrémentales''. Je m'explique. Je fais un backup régulier sur un serveur sur le net, et j'ai sur le serveur les n derniers backups. Tu peux copier/coller ça : | ||
Je pense boucler tar ce soir (il ne reste que la restorre). Ensuite, je vais commencer par donner les options de rsync les plus communes (on ne va pas refaire le man), et reprendre ce que tu as écrit. | |||
====Sauvegardes incrémentales avec rsync==== | |||
=====Côté machine à sauvegarder===== | |||
Dans la crontab de la machine à sauvegarder, vers 22h00, je lance le script suivant : | |||
<code>#!/bin/sh | |||
# répertoires à sauvegarder | |||
DIRS="/home/jice /home/fred /etc /root /boot /var/lib/mysql /var/spool/mail" | |||
# fichier contenant les fichiers à exclure de la sauvegarde | |||
# voir EXCLUDE PATTERNS dans rsync(1) | |||
EXCLUDEFILE="/home/jice/bin/excludes" | |||
OPTIONS="-avz -e ssh" | |||
OPTIONS="$OPTIONS --exclude-from $EXCLUDEFILE --bwlimit=50" | |||
OPTIONS="$OPTIONS $*" | |||
rsync $OPTIONS $DIRS jice@mon.serveur.net:backup/current | |||
# copie du fichier "flag" pour dire au serveur que le backup a été fait | |||
scp /home/jice/bin/backup_done jice@mon.serveur.net:~ | |||
</code> | |||
Ce script fait un backup vers le répertoire <code>backup/current</code> du serveur (nommé <code>mon.serveur.net</code>) ; à la fin, il copie un fichier (vide) <code>backup_done</code> à la racine de mon compte sur le serveur, afin de dire au serveur que le backup a bien été fait. | |||
PS : voici un exemple de fichier <code>excludes</code> | |||
<code># excludes pour le backup sur zowie | |||
jice/tmp* | |||
jice/multimedia/video/* | |||
jice/compil/* | |||
fred/compil/* | |||
*/.local/share/Trash/* | |||
*/.kde/share/config/session/konqueror* | |||
*/temp/* | |||
*/tmp/* | |||
*/cache/* | |||
*/Cache/* | |||
*/.thumbnails/* | |||
*/.xvpics/* | |||
*/.kde/tmp-* | |||
*/.mcop/* | |||
*/.ncftp/trace* | |||
*/.nx/* | |||
*.o | |||
*.so | |||
*.mp3 | |||
*.avi | |||
*.rar | |||
*.ace</code> | |||
Notez que ce fichier peut contenir ou bien le nom complet d'un fichier, ou bien un "morceau" de nom de fichier avec des étoiles comme caractère joker. Pour plus d'information, tapez dans une console : <code>man rsync</code> et cherchez EXCLUDE PATTERNS. | |||
=====Côté serveur de sauvegarde===== | |||
Côté serveur, j'ai ce script qui fait une rotation des backups (en cron tous les midi) : | Côté serveur, j'ai ce script qui fait une rotation des backups (en cron tous les midi) : | ||
<code>#!/bin/sh | <code>#!/bin/sh | ||
Ligne 36 : | Ligne 88 : | ||
En utilisant le <code>cp</code> avec les hard links, on ne copie pas réellement les fichiers, mais on crée un deuxième fichier qui pointe vers le contenu du premier (donc on peut avoir autant de hardlink qu'on veut sur le même fichier, la place disque utilisée n'est toujours que de la taille d'un seul fichier).<br> | En utilisant le <code>cp</code> avec les hard links, on ne copie pas réellement les fichiers, mais on crée un deuxième fichier qui pointe vers le contenu du premier (donc on peut avoir autant de hardlink qu'on veut sur le même fichier, la place disque utilisée n'est toujours que de la taille d'un seul fichier).<br> | ||
Rsync lorsqu'il enverra, lors de la prochaine sauvegarde, un fichier modifié, utilisera un nom différent temporaire, avant de le renommer vers son nom normal. Ainsi, il ne va pas écraser le contenu du fichier hardlinké, car à la fin de la copie du fichier, Rsync supprime le fichier, puis renomme le fichier temporaire vers son nom normal.<br> | Rsync lorsqu'il enverra, lors de la prochaine sauvegarde, un fichier modifié, utilisera un nom différent temporaire, avant de le renommer vers son nom normal. Ainsi, il ne va pas écraser le contenu du fichier hardlinké, car à la fin de la copie du fichier, Rsync supprime le fichier, puis renomme le fichier temporaire vers son nom normal.<br> | ||
A ce moment là, on a sur le serveur 2 versions du même fichier : la version courante qui vient d'être sauvegardée dans <code>~/backup/current/repertoire/fichier</code> et la version précédente qui a été copiée par le script ci-dessus dans <code>~/backup/<la date du dernier backup>/repertoire/fichier</code>. | A ce moment là, on a sur le serveur 2 versions du même fichier : la version courante qui vient d'être sauvegardée dans <code>~/backup/current/repertoire/fichier</code> et la version précédente qui a été copiée par le script ci-dessus dans <code>~/backup/<la date du dernier backup>/repertoire/fichier</code>. | ||
Dernière version du 8 septembre 2006 à 19:02
salut ! est-ce que tu comptes parler des outils spécifiques des distributions, comme celui de Mandriva par exemple ? LeaJice 5 sep 2006 à 20:40 (CEST)
Pas du tout dans le sens où les seules distribs que j'ai sous la main sont Arch et Debian. Par contre, je vais regarder un peu ce qui se fait avec des interfaces graphiques. oudoubah 7 sep 2006 19h30
re. Tu pourrais ajouter dans ton § rsync un truc sur les sauvegardes incrémentales. Je m'explique. Je fais un backup régulier sur un serveur sur le net, et j'ai sur le serveur les n derniers backups. Tu peux copier/coller ça :
Je pense boucler tar ce soir (il ne reste que la restorre). Ensuite, je vais commencer par donner les options de rsync les plus communes (on ne va pas refaire le man), et reprendre ce que tu as écrit.
Sauvegardes incrémentales avec rsync
Côté machine à sauvegarder
Dans la crontab de la machine à sauvegarder, vers 22h00, je lance le script suivant :
#!/bin/sh
- répertoires à sauvegarder
DIRS="/home/jice /home/fred /etc /root /boot /var/lib/mysql /var/spool/mail"
- fichier contenant les fichiers à exclure de la sauvegarde
- voir EXCLUDE PATTERNS dans rsync(1)
EXCLUDEFILE="/home/jice/bin/excludes"
OPTIONS="-avz -e ssh"
OPTIONS="$OPTIONS --exclude-from $EXCLUDEFILE --bwlimit=50"
OPTIONS="$OPTIONS $*"
rsync $OPTIONS $DIRS jice@mon.serveur.net:backup/current
- copie du fichier "flag" pour dire au serveur que le backup a été fait
scp /home/jice/bin/backup_done jice@mon.serveur.net:~
Ce script fait un backup vers le répertoire backup/current
du serveur (nommé mon.serveur.net
) ; à la fin, il copie un fichier (vide) backup_done
à la racine de mon compte sur le serveur, afin de dire au serveur que le backup a bien été fait.
PS : voici un exemple de fichier excludes
# excludes pour le backup sur zowie
jice/tmp*
jice/multimedia/video/*
jice/compil/*
fred/compil/*
- /.local/share/Trash/*
- /.kde/share/config/session/konqueror*
- /temp/*
- /tmp/*
- /cache/*
- /Cache/*
- /.thumbnails/*
- /.xvpics/*
- /.kde/tmp-*
- /.mcop/*
- /.ncftp/trace*
- /.nx/*
- .o
- .so
- .mp3
- .avi
- .rar
.ace
Notez que ce fichier peut contenir ou bien le nom complet d'un fichier, ou bien un "morceau" de nom de fichier avec des étoiles comme caractère joker. Pour plus d'information, tapez dans une console : man rsync
et cherchez EXCLUDE PATTERNS.
Côté serveur de sauvegarde
Côté serveur, j'ai ce script qui fait une rotation des backups (en cron tous les midi) :
#!/bin/sh
if [ -f ~/backup_done ]; then
KEEP=8
DIR=~/backup
# arborescence :
# ~/backup/2006-04-03
# ~/backup/2006-04-04
# ~/backup/2006-04-05
# ~/backup/current
# calcule date du jour
DATE=`date --date=yesterday "+%Y-%m-%d"`
# crée le répertoire pour les backups du jour
mkdir $DIR/$DATE
# supprime les vieux directories
ls -d $DIR/2* | sort | head --lines=-$KEEP | xargs rm -rf
# copie (hard links) les données
cp -al $DIR/current/* $DIR/$DATE
# supprime le fichier flag
rm ~/backup_done
# on fait le rsync ensuite
fi
Si le backup a été fait (présence du fichier backup_done
, il effectue une rotation des backups.
En utilisant le cp
avec les hard links, on ne copie pas réellement les fichiers, mais on crée un deuxième fichier qui pointe vers le contenu du premier (donc on peut avoir autant de hardlink qu'on veut sur le même fichier, la place disque utilisée n'est toujours que de la taille d'un seul fichier).
Rsync lorsqu'il enverra, lors de la prochaine sauvegarde, un fichier modifié, utilisera un nom différent temporaire, avant de le renommer vers son nom normal. Ainsi, il ne va pas écraser le contenu du fichier hardlinké, car à la fin de la copie du fichier, Rsync supprime le fichier, puis renomme le fichier temporaire vers son nom normal.
A ce moment là, on a sur le serveur 2 versions du même fichier : la version courante qui vient d'être sauvegardée dans ~/backup/current/repertoire/fichier
et la version précédente qui a été copiée par le script ci-dessus dans ~/backup/<la date du dernier backup>/repertoire/fichier
.
Plus d'explications :
- on a deux fichiers
current/toto
ethier/toto
qui pointent vers le même contenu. Ces 2 fichiers (ou plus) on été obtenus suite au script de rotation, par la copie avec hardlinks. On a donc :
current/toto --> contenu <-- hier/toto
\
'--------- avant-hier/toto
- si le fichier a été modifié, rsync va envoyer le nouveau fichier sous un nom temporaire
toto.tmp
(par exemple). On a donc :
current/toto --> contenu <-- hier/toto
\
'--------- avant-hier/toto
current/toto.tmp --> nouveau contenu
- ensuite, rsync supprime
current/toto
On obtient, par la magie des hardlinks :
contenu <-- hier/toto
\
'--------- avant-hier/toto
current/toto.tmp --> nouveau contenu
- enfin,
toto.tmp
est renommé entoto
:
contenu <-- hier/toto
\
'--------- avant-hier/toto
current/toto --> nouveau contenu
- on obtient bien 2 versions différentes, celle d'hier et d'avant-hier (le fichier n'avait alors pas changé), et celle d'aujourd'hui.
Ainsi j'ai toujours les backup des 8 (réglable par la variable KEEP
ci-dessus) derniers jours disponible. Je peux retrouver les dernières versions d'un fichier en cas de problème.
Si tu veux, tu peux reprendre ça dans ton article. LeaJice 6 sep 2006 à 11:48 (CEST)
en utilisant xdeltas
Sur Léa j'utilise un script du style :
#!/bin/sh
FICHIERS="user@serveur:/path/to/backup-mysql.tar.bz2 user@serveur:/path/to/backup-www.tar.gz"
if [ ! "$1" = "--skip-download" ] ; then
rm -f *bz2 *gz
scp ${FICHIERS} .
DATE=$(date +"%Y%m%d")
mkdir ${DATE}
mv *bz2 *gz ${DATE}/
cd ${DATE}
for file in *bz2 ; do
echo -n "bunziping ${file} "
nice -n 19 bunzip2 ${file}
echo " [ok]"
echo -n "gziping ${file%%.bz2} "
nice -n 19 gzip ${file%%.bz2}
echo " [ok]"
done
cd ..
fi
DSTDIR=$(ls -dp * | grep -E "/\$" | sort | uniq | tail -n 2|head -n 1)
SRCDIR=$(ls -dp * | grep -E "/\$" | sort | uniq | tail -n 1)
echo "SOURCE DIR : ${SRCDIR}"
echo "DESTINATION DIR : ${DSTDIR}"
if [ -f ${DSTDIR}deltas ] ; then
source ${DSTDIR}deltas
DELTAS=$((DELTAS+1))
else
DELTAS=1
fi
if [ $DELTAS -gt 9 ] ; then
echo "Vous avez créé 10 deltas de suite, par sécurité je ne créee pas de deltas cette fois"
exit 0
else
echo "C'est votre delta n°${DELTAS}/10"
fi
echo "DELTAS=${DELTAS}" > ${SRCDIR}deltas
cd ${SRCDIR}
for file in *.gz ; do
if [ -f ../${DSTDIR}${file} ] ; then
echo -n "Création du delta : ../${DSTDIR}${file}.delta "
nice -n 19 xdelta delta ${file} ../${DSTDIR}${file} ../${DSTDIR}${file}.delta
echo "[ok]"
echo -n "J'efface : ../${DSTDIR}${file} "
rm ../${DSTDIR}${file}
echo "[ok]"
fi
done
cd ..
le script doit être lancé dans le répertoire où doivent se retrouver les backups et les backups doivent être en .bz2 ou .gz.
à chaque nouvel appel du script un répertoire est créé, et le dernier contient une version complète, les précédants des xdeltas entre la version n et la n+1
C'est quoi xdeltas ? LeaJice 6 sep 2006 à 20:08 (CEST)
C'est l'équivalent de diff mais fonctionne aussi pour des fichiers binaires (et ça gère nativement le gzip pour faire le xdelta - aka: diff)