Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/01/2018, à 13:22

abach

Purger automatiquement mais sélectivement des répertoires

Bonjour à tous et à toutes,

Ca fait un moment que j'y pense et là, mon infrastructure matérielle me le permet : Automatiser et rationaliser ma sauvegarde.

Je sais, il existe des outils comme Luckybackup et autres.

Pour diverses raisons, je suis parti sur une solution basée sur un script en shell s'appuyant directement sur rsync.

Sur le plan matériel, j'ai :

  • Un Raspberry PI2 avec un disque de 1To

  • Un disque USB3 de 500Go et un second de 1To branchés directement sur mon PC

J'ai découpé ma sauvegarde, sur le plan logiciel, de la manière suivante :

  1. Une sauvegarde "miroir" des données de mon home vers le disque de 500Go en excluant les données purement média (images, musiques et vidéos)

  2. Une sauvegarde des données média vers le disque dur de mon Raspberry

  3. Une sauvegarde incrémentielle des données du 500Go vers le 1To

Au niveaux programmes, le "1" est un script séparé des "2" et "3". Ca me permet de reprendre rapidement la main sur mon PC, En effet, j'utilise la commande

rsync --delete -arLt --files-from=svg-l.include --exclude-from=svg-l.exclude $HOME/ $dest_inc/today/

Qui à mon sens est peu chronophage une fois le miroir initial en place.

"2" et "3" sont dans le même script, lancés l'un après l'autre. Les fichiers médias pouvant représenter un volume important, j'ai fait le choix de ne pas encombrer mon 500Go avec et ces fichiers ne bougeant que très peu, là encore, une fois le miroir initial mis en place vers le Raspberry, le "2" s'avère rapide et ce ne sont pas là les données critiques que j'ai.

Là où je suis en train de mettre le paquet, c'est sur le "3". Je pars de la sauvegarde sur mon 500Go pour pouvoir disposer de mon PC pendant que cette partie s'exécute.
J'ai donc "commis" le script suivant :

#!/bin/bash
DATEINCR=`date +%Y%m%d_%H%M%S_%u`
if [ -e $rasp_inc/lastdate ]
then
    echo "Une sauvegarde incrémentielle existe"
    DATEANCIENNE=$(cat $rasp_inc/lastdate)
    echo "L'ancienne sauvegarde est déplacée vers $DATEANCIENNE"
    mv $rasp_inc/today $rasp_inc/$DATEANCIENNE
    echo "création du nouveau fichier lastdate"
    echo $DATEINCR > $rasp_inc/lastdate
    rsync --delete -arvLt --link-dest=$rasp_inc/$DATEANCIENNE  $rasp_src/ $rasp_inc/today/
else
    echo "Aucune sauvegarde incrémentielle"
    echo $DATEINCR > $rasp_inc/lastdate
    rsync --delete -arvLt $rasp_src/ $rasp_inc/today/
fi

qui me crée sur mon disque de 1To un "today" qui est la sauvegarde courante ainsi qu'un ensemble de dossiers dans un format genre "20180116_112523_2" (le "2" de la fin étant bien entendu le jour de semaine).

Tout ça, ça fonctionne parfaitement et se lance sans souci via cron. Là où j'ai un souci, c'est dans la purge sélective des anciennes sauvegardes.

L'idée serait de mettre en place une purge de type "GPF" - Grand-père, Père et Fils.

  • Une fois par semaine, le vendredi par exemple, purger les sauvegardes quotidiennes (lundi, mardi, mercredi, jeudi, samedi et dimanche) ayant plus d'une semaine (ce que j'appelle "les fils")

  • Une fois par mois, genre le premier, purger les "vendredi" (les "pères") datant des mois précédents sauf le dernier vendredi qui va devenir ma sauvegarde mensuelle (le "grand-père").

Je ne cherche pas forcément LA solution mais une piste à creuser pour la trouver et je vous remercie par avance si quelqu'un a une idée.


Les chiens vous regardent tous avec vénération. Les chats vous toisent tous avec dédain. Il n’y a que les cochons qui vous considèrent comme leurs égaux. - Winston Churchill
Je suis parrain Linux

Hors ligne

#2 Le 16/01/2018, à 15:57

shoot76

Re : Purger automatiquement mais sélectivement des répertoires

Bonjour à toi !
ce que tu veux faire te reviendra à deux tâches CRON du coup. Donc deux scripts.

Dans les deux cas, c'est une simple opération sur les dates. Je ne manipule pas bien Bash, mais en Python, ça me parait pas trop compliqué. Je te donne ce que je ferais en Python pour que tu vois la faisabilité en Bash.

1. Parser les noms de fichier en date => 20180116 => 16/01/2018
2. Pour tous les fichiers du dossier, récupérer ceux dont le jour possède un reste sur une division "modulo" 7 (tous les autres jours de la semaine excepté le Vendredi => symbole % en Python) exemple pour vendredi prochain : 19-12%7=0 par contre, 19-13%7!=0 (samedi dernier). ça marche aussi avec une division simple. Il suffit de tester si le résultat est un chiffre entier ou non.
3. Supprimer ces fichiers.

A noter qu'en Python, tu n'as pas à te soucier des mois. Les opérations sur les dates se font nativement. Donc rien de compliqué au niveau des années bissextiles, des mois à 29/30/31 jours...

J'adopterais la même pratique pour les "pères" mais au lieu de travailler sur la journée, je regarderai le mois.

Dernière modification par shoot76 (Le 16/01/2018, à 15:59)


~ Data-sientist freelance : https://skulder.fr

Hors ligne

#3 Le 16/01/2018, à 16:41

abach

Re : Purger automatiquement mais sélectivement des répertoires

Merci pour ta réponse,

Ca fait un moment que je me dis que je devrai regarder "aussi" du côté de python. A mon avis, et au vu de ce que je vois un peu partout, bash et python me semblent assez complémentaires et l'un semble pouvoir faciliter les tâches de l'autre.


Les chiens vous regardent tous avec vénération. Les chats vous toisent tous avec dédain. Il n’y a que les cochons qui vous considèrent comme leurs égaux. - Winston Churchill
Je suis parrain Linux

Hors ligne

#4 Le 16/01/2018, à 16:58

shoot76

Re : Purger automatiquement mais sélectivement des répertoires

De mon point de vu,

Bash est très bien pour tout ce qui est "automatisme". Un script pour installer des logiciels ou des plugins, monter/démonter des DD, mettre en production un site web... Par contre, quand il faut manipuler et faire du traitement, je préfère amplement python qui dispose de pas mal de librairies natives qui aident énormément (i.e ... les opérations sur les dates ^^)

Alors c'est juste un point de vu perso. Quelqu'un d'autre te fera surement les deux en python ou alors tout en Bash! C'est libre à chacun. Mais je préfère le côté "propre" de Python dans sa syntaxe. C'est le côté développeur qui revient... un admin sys aimera sûrement plus Bash que moi smile

En tout cas, si tu as l'envie et un peu de temps, je t'invite à l'essayer. Tu pourras me donner ton avis smile


~ Data-sientist freelance : https://skulder.fr

Hors ligne

#5 Le 16/01/2018, à 17:28

bruno

Re : Purger automatiquement mais sélectivement des répertoires

Bonjour,

Tu peux aussi directement détecter la date de modification d'un fichier/dossier avec find, exemple :

find /chemin/dossier/sauvegarde -mtime +7 -type d

trouvera tous les dossiers qui ont été modifiés il y a plus de 7 jours et pour les déplacer du même coup :

find /chemin/dossier/sauvegarde -mtime +7 -type d -exec mv {} /chemin/dossier/sauvegarde/monthly

Et tu peux utiliser le même type de commande pour supprimer des dossier de plus de 30 jours dans le dossier monthly :

find /chemin/dossier/sauvegarde/monthly -mtime +30 -type d -exec rm -v {}

Ça évite les opérations compliquées sur les noms de fichier ou de sortir l'artillerie lourde Python.

Hors ligne