Voila, je suis en train de réfléchir sur un système de sauvegarde de mes données.
Actuellement, chaque soir, je sauvegarde mes données (windows et linux) sur un disque dur externe.
Voici mon script:
En gros, je fais du différentiel dans le but de sauvegarder les documents sur windows (photo, projet créer sous photoshop) et sous linux (document perso + script et projet web).
Seulement, ce type de sauvegarde me semble un peu pauvre! Je m'explique, je n'ai qu'un seul point de sauvegarde.
J'aimerais optimisé ce script dans le but d'avoir au minimum, 5 sauvegardes. En gros mon idée est d'avoir 5 dossiers backup:
Backup 1 .... Backup 2.... .... ..... .... Backup 5.
Je souhaiterais pouvoir synchroniser chaque jour dans un dossier différent. Comme ça, je pourrais récupérer un fichier que j'aurais supprimer, 3 sauvegardes avant par exemple.
Pensez vous que cela soit possible?
Je souhaiterais pouvoir synchroniser chaque jour dans un dossier différent. Comme ça, je pourrais récupérer un fichier que j'aurais supprimer, 3 sauvegardes avant par exemple.
Si c'est juste pour ça, pas besoin de garder 5 sauvegardes complètes. Il te faut juste garder les modifications entre deux sauvegardes.
Pour ça, tu peux regarder du côté de l'option --backup de rsync (d'autres softs, comme rdiff-backup ou cpio te permettent de faire ça bien aussi).
Après, si tu veux juste faire une sauvegarde complète dans un dossier différent à chaque fois, tu peux utiliser date(1) pour nommer tes dossiers :
Oui mais là, sa me fait copier 35go de donnée à chaque sauvegarde. (oui j'ai presque 2 ans de photo)
L'idée théorique est de faire une seule backup complete, la cloner à 5 fois, meme 3, je pense que sa sera suffissant et de basculer chaque jour automatique sur un dossier backup différent, sans devoir chaque fois faire une backup complete.
@kna: en relisant ta réponse: "Si c'est juste pour ça, pas besoin de garder 5 sauvegardes complètes. Il te faut juste garder les modifications entre deux sauvegardes.
Pour ça, tu peux regarder du côté de l'option --backup de rsync."
C'est je pense la meilleure solution, car de cette manière, je ne suis pas oublié de tous resynchroniser. Le seul problème c'est que je ne vois pas quelle option permet de faire ceci.
Je viens de lire ton tutoriel et je le trouve très bien fait, j'ai mieux compris la différence entre différentiel et incrémentiel. Cependant, je ne vois pas comment faire avec la méthode incrémentielle pour récupérer les données à une date D.
Vu que je suis assez nul dans les scripts bash, quelqu'un pourrait-il me donner un petit coup de main SVP.
Le principe est que ton script va créer chaque jour un répertoire qui contiendra les données modifiées ou effacées dans la journée.
Ainsi, si tu as perdu un fichier il te suffira de retourner le jour où tu l'as effacé, et bingo !
Si jamais tu ne connais pas le jour exact, tu pourras faire une recherche par nom.
Le script donné dans le tuto est déjà plus ou moins prêt à être utilisé, nous pouvons t'aider si tu as des questions sur certaines lignes:
#!/bin/sh
# Script de sauvegarde incrementale du repertoire /original sur la machine serveur
# Ce script utilise l'outil de synchronisation rsync pour faire une image
# globale du repertoire /original de la machine serveur dans le repertoire
# /copie/main/ de la machine client.
# Les sauvegardes incrementales journalieres sont dans chacun
# des repertoires identifies par la date dans le repertoire
# /copie/old_data. Par exemple, le repertoire
# 2004-11-25 contiendra les valeurs des fichiers a ce jour qui seront
# recuperables.
# Variable representant le jour de la sauvegarde
JOUR=`date +%Y-%m-%d`
# On cree le repertoire du jour et un fichier timer qui nous donnera
# les heures de debut et de fin du transfert
if [ -d "/copie/old_data/$JOUR" ]
then
echo "Le repertoire /copie/old_data/${JOUR} existe deja !";
else
mkdir /copie/old_data/$JOUR;
fi
touch /copie/old_data/$JOUR/timer
echo "---------------------------------" >> /copie/old_data/$JOUR/timer
echo "Heure de demarrage du transfert:" >> /copie/old_data/$JOUR/timer
date >> /copie/old_data/$JOUR/timer
echo "---------------------------------" >> /copie/old_data/$JOUR/timer
# On lance le script rsync de transfert des fichiers
/usr/local/bin/rsync -e ssh --force --ignore-errors
\ --delete --backup --backup-dir=/copie/old_data/$JOUR -av serveur::original/
\ /copie/main
# On ecrit l'heure de fin dans le timer
echo "Heure de fin du transfert:" >> /copie/old_data/$JOUR/timer
date >> /copie/old_data/$JOUR/timer
echo "---------------------------------" >> /copie/old_data/$JOUR/timer
# On detruit les fichiers vieux de plus de 30 jours
find /mnt/sauvegarde/old_data/ -atime +30 -exec rm -rf {} \;
Merci pour ce script.
Si je comprend bien, je fais une seule copie globale et chaque jour, sa enregistre les fichiers modifier entre le jour de la sauvegarde globale et le jour en cours.
Est ce bien cela car supposons qu'au jour 15, j'ai ajouter 1go, a partir du 16eme jour, je recopie les fichiers plus le meme giga que celui du jour 15 et ainsi de suite.
Merci pour ce script.
Si je comprend bien, je fais une seule copie globale et chaque jour, sa enregistre les fichiers modifier entre le jour de la sauvegarde globale et le jour en cours.
Est ce bien cela car supposons qu'au jour 15, j'ai ajouter 1go, a partir du 16eme jour, je recopie les fichiers plus le meme giga que celui du jour 15 et ainsi de suite.
Exactement.
Si tu ajoutes des trucs, ça va dans le répertoire de copie, si tu en enlèves, ça va dans le répertoire de backup du jour en cours.
Globalement, tu ne copies que très peu d'infos chaque jour une fois que la synchronisation a été faire une fois.
Actuellement je copie chaque soir le dossier /home vers mon disque dur /media/Elements/backup/
Je ne passe pas par ssh car je suis en local et que je ne trouve pas l'utilité de le faire.
Si je comprend bien mon code, je dois remplacé dans ton script
/copie/old_data/ par /media/Elements/backup/old_data
/copie/main/ par /home
et modifier la derniere ligne par /media/Elements/backup/old_data -atime +7 -exec rm -rf {} \;
Il faut donc maintenant modifier la ligne de commande rsync pour la passer de ssh à du normal.
Pour résumer, chaque fichier ajouter et modifier sont ajouté dans /media/Elements/backup/ et les les fichiers supprimer sont enregistré dans /media/Elements/backup/old_data
Désolé de paraitre lourd, mais je préfère tous comprendre que de l'appliquer bêtement.
Actuellement je copie chaque soir le dossier /home vers mon disque dur /media/Elements/backup/
Je ne passe pas par ssh car je suis en local et que je ne trouve pas l'utilité de le faire.
Si je comprend bien mon code, je dois remplacé dans ton script
/copie/old_data/ par /media/Elements/backup/old_data
/copie/main/ par /home
et modifier la derniere ligne par /media/Elements/backup/old_data -atime +7 -exec rm -rf {} \;
En fait non
La source de ce que tu veux copier /home/ c'est mon partage "original/" ici. Dans le tp, c'est le partage qu'on créé dans rsyncd.conf.
Ensuite, l'endroit dans lequel on fait la copie est /copie/main/, ce qui correspond à ton /media/Elements/backup/main/
Puis, je copie tous les fichiers effacés à une date donnée dans un répertoire à la date du jour /copie/old_data/$JOUR, ce qui pourrait correspondre chez toi à /media/Elements/backup/backup/$JOUR
Citation : lemirandais
Désolé de paraitre lourd, mais je préfère tous comprendre que de l'appliquer bêtement.
Au contraire, c'est ce que j'appelle être intelligent moi de toujours chercher à bien comprendre ce que l'on fait
C'est correct.
En fait c'est le nom du partage qui apparaît, c'est normal, mais c'est bien ton répertoire /home qui est partagé, si tu fais une synchro, ce sera avec /home.
Je n'ai pas eu le temps de tester car je suis énormément occupé (festival dans ma ville et je fais tous les soirs des photos).
Si j'ai bien compris, voici le code qui devrait fonctionner chez moi:
#!/bin/sh
# Script de sauvegarde incrementale du repertoire /original sur la machine serveur
# Ce script utilise l'outil de synchronisation rsync pour faire une image
# globale du repertoire /original de la machine serveur dans le repertoire
# /copie/main/ de la machine client.
# Les sauvegardes incrementales journalieres sont dans chacun
# des repertoires identifies par la date dans le repertoire
# /copie/old_data. Par exemple, le repertoire
# 2004-11-25 contiendra les valeurs des fichiers a ce jour qui seront
# recuperables.
# Variable representant le jour de la sauvegarde
JOUR=`date +%Y-%m-%d`
# On cree le repertoire du jour et un fichier timer qui nous donnera
# les heures de debut et de fin du transfert
if [ -d "/media/DISQUEDUR/backup/old_data/$JOUR" ]
then
echo "Le repertoire /media/DISQUEDUR/backup/old_data/${JOUR} existe deja !";
else
mkdir /media/DISQUEDUR/backup/old_data/$JOUR;
fi
touch /media/DISQUEDUR/backup/old_data/$JOUR/timer
echo "---------------------------------" >> /media/DISQUEDUR/backup/old_data/$JOUR/timer
echo "Heure de demarrage du transfert:" >> /media/DISQUEDUR/backup/old_data/$JOUR/timer
date >> /media/DISQUEDUR/backup/old_data/$JOUR/timer
echo "---------------------------------" >> /media/DISQUEDUR/backup/old_data/$JOUR/timer
# On lance le script rsync de transfert des fichiers
/usr/local/bin/rsync -e ssh --force --ignore-errors
\ --delete --backup --backup-dir=/media/DISQUEDUR/backup/old_data/$JOUR -av 127.0.0.1::original/
\ /media/DISQUEDUR/backup/main
# On ecrit l'heure de fin dans le timer
echo "Heure de fin du transfert:" >> /media/DISQUEDUR/backup/old_data/$JOUR/timer
date >> /media/DISQUEDUR/backup/old_data/$JOUR/timer
echo "---------------------------------" >> /media/DISQUEDUR/backup/old_data/$JOUR/timer
# On detruit les fichiers vieux de plus de 30 jours
find /media/DISQUEDUR/backup/old_data/ -atime +30 -exec rm -rf {} \;
Ben je testerais la semaine prochaine, je suis un peu pris ce week end.
Dernière question, pour la récupération des données, par exemple, si mon disque dur principal crame (j'espère pas), comment faire pour récupérer les données "backé"?
Ben je testerais la semaine prochaine, je suis un peu pris ce week end.
Dernière question, pour la récupération des données, par exemple, si mon disque dur principal crame (j'espère pas), comment faire pour récupérer les données "backé"?
Merci pour ton aide elalitte.
lemirandais
Tu n'auras plus qu'à refaire une synchro inverse de ton main vers ton nouveau disque !
Ok, merci pour cette réponse rapide. Le problème est presque résolu.
J'ai un dernier soucis, mais qui concerne mon organisation de travail sous windows.
Dans mon dossier home, j'ai mon dossier des travails, un dossier contenant ma base de donnée mysql, et un dossier symbolique qui correspond au dossier mes documents de windows.
A ce niveau j'ai un petit problème, j'aimerais copier également de contenu du Bureau de windows car il m'arrive que j'enregistre dessus des PJ reçu par mail.
Sous linux, même si j'ai la même organisation que sous windows, je ne suis pas ce problème car le Bureau est présent dans /home/lemirandais/
Comment ferais tu, un autre lien symbolique dans /home?
Quel serait la meilleur solution?
lemirandais
EDIT: pour la synchro inverse, je suppose une ligne de commande comme ceci:
Ok, merci pour cette réponse rapide. Le problème est presque résolu.
J'ai un dernier soucis, mais qui concerne mon organisation de travail sous windows.
Dans mon dossier home, j'ai mon dossier des travails, un dossier contenant ma base de donnée mysql, et un dossier symbolique qui correspond au dossier mes documents de windows.
A ce niveau j'ai un petit problème, j'aimerais copier également de contenu du Bureau de windows car il m'arrive que j'enregistre dessus des PJ reçu par mail.
Sous linux, même si j'ai la même organisation que sous windows, je ne suis pas ce problème car le Bureau est présent dans /home/lemirandais/
Comment ferais tu, un autre lien symbolique dans /home?
Si tu synchronise /home, tu auras aussi /home/lemirandais car rsync est récursif. Donc normalement ça devrait le faire.
Citation : lemirandais
EDIT: pour la synchro inverse, je suppose une ligne de commande comme ceci:
A priori non, il faut que tu créées un nouveau partage dans ton rsyncd.conf qui pointe vers ton main, puis que tu synchronise vers ton nouveau répertoire /home. (pas besoin de backup pour la copie, ensuite tu referas le script habituel pour refaire de nouveaux backups)
Je viens de tester le script et voici le message d'erreur que j'ai en retour:
sh sauvegarde2test.sh
ssh: connect to host 127.0.0.1 port 22: Connection refused
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(601) [Receiver=3.0.7]
Alors comment expliquer cela ?
"ssh: connect to host 127.0.0.1 port 22: Connection refused"
Il faudrait que tu mettes en place une authentification par clef ssh pour que ce soit automatique.
Regarde ce qui ce passe quand je me connecte en ssh
ssh leknoppix@127.0.0.1
leknoppix@127.0.0.1's password:
Linux leknoppix-laptop 2.6.32-22-generic #36-Ubuntu SMP Thu Jun 3 22:02:19 UTC 2010 i686 GNU/Linux
Ubuntu 10.04.1 LTS
Welcome to Ubuntu!
* Documentation: https://help.ubuntu.com/
Your CPU appears to be lacking expected security protections.
Please check your BIOS settings, or for more information, run:
/usr/bin/check-bios-nx --verbose
9 packages can be updated.
0 updates are security updates.
Last login: Sat Jul 24 10:42:37 2010 from localhost