Script de double sauvegarde alternée + clonage

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche

Cette page fait suite à la page : Sauvegarde et clonage d'un système que je vous engage à lire.

Dans un premier temps, j'avais fait ce script uniquement pour les sauvegardes alternées.
Je l'ai modifié de façon à y inclure un choix de sauvegarde supplémentaire pour un clone et, séparément, pour la /home dudit clone. Quatre possibilités vous seront donc offertes :

  • sauvegarde complète -1
  • sauvegarde complète -2
  • sauvegarde clone
  • sauvegarde /home du clone.

Pourquoi double sauvegarde ? C'est tout simplement une sécurité supplémentaire.
Ce n'est toutefois pas une obligation et on peut parfaitement ne consacrer qu'une seule partition à notre sauvegarde (voir la partie "AIDE À LA PERSONNALISATION DE CE SCRIPT".

  • Fonctionnement : Selon la périodicité désirée des sauvegardes, vous en aurez toujours une plus ancienne et une plus récente sous la main.

Mon exemple personnel : j'effectue une sauvegarde chaque fin de semaine, avant une mise à jour, elle aussi hebdomadaire. Les semaines impaires, j'utilise la 'sauve', tandis que les semaines paires, je choisis la 'sauve2'.
À vous de juger des périodicités de sauvegarde du clone et/ou de sa /home.

Ainsi, en cas d'accroc, j'ai sous la main une vue de ma machine qui date de moins d'une semaine et, si par manque de chance, cette sauvegarde est, elle aussi, défaillante, il m'en reste une seconde qui n'aura que moins de deux semaines d'ancienneté. En cas d'urgence, sans avoir à remplacer les répertoires, vous aurez en plus un clone "prêt à l'emploi".

Pour utiliser ce script, il convient, bien entendu, d'y entrer vos données en regard des "variables".

Comme pour tout script, une fois vos modifications apportées, vous devrez lui donner un nom (perso, je ne me suis pas fatigué : 'sauvegarde') et rendre le fichier exécutable (# chmod +x /chemin/nom_fichier).

Bien que cela ne soit pas une obligation, vous pouvez le placer dans un répertoire présent dans le PATH, ainsi, vous pourrez envoyer ce script de n'importe quel endroit de votre architecture. Pour connaître ces répertoires, tapez en tant qu' 'user' : echo $PATH. Toutefois, l'habitude la plus fréquente veut qu'on place ses scripts perso dans /usr/local/bin

  • Comme pré-requis, il faut installer, si ce n'est fait 'sudo' (voir les tutos existants).

À installer aussi 'rsync', qui est le moteur même de la sauvegarde (Merci à Loreleil de l'avoir rappelé)
Il faut disposer d'au moins un DDext ou d'un second DD sur sa machine de façon à pouvoir y créer deux partitions de dimension suffisante pour recevoir nos sauvegardes. Si on est encore plus parano, on peut sauvegarder une semaine dans une partition d'un DDext et la suivante dans celle d'un autre.
Pour le clone et sa /home, deux autres partitions distinctes sont à prévoir.

Ce script peut encore être modifié mais il est testé et fonctionne parfaitement.
Si vous avez des questions : un MP à ricardo sur le forum.


AIDE À LA PERSONNALISATION DE CE SCRIPT

En principe, vous ne devriez avoir à intervenir que sur la seule partie ..........Variables .........
Vous ne devez modifier que la partie droite, c'est à dire après le signe '=' en dehors des parenthèses, des guillemets et des apostrophes.
Attention aussi de ne pas modifier les espaces.

mount_rep="/mnt/autre"

--la première donnée, vide, figure le [0], de façon à commencer par [1]

ddext=( '/dev/sdb9' '/dev/sdb10' '/dev/sdb7' '/dev/sdb1')
systeme_fich=( 'ext3' 'ext2' 'ext3' 'ext3')
exclure=( '/root/exclure' '/home/ricardo/exclure' '/root/exclure' '/home/ricardo/exclure')
sauve=( '/mnt/autre/sauve' '/mnt/autre/sauve-ricardo' '/mnt/autre' '/mnt/autre/ricardo')
répertoire_a_sauvegarder=( '/' '/home/ricardo/' '/' '/home/ricardo/')


====================================================
mount_rep="/mnt/autre"

il s'agit du répertoire qui sera monté temporairement et qui recevra votre partition de sauvegarde.
il vous appartient de le créer et de le nommer comme bon vous semble.
'/mnt' étant le répertoire habituel pour les montages temporaires, j'ai préféré créer un sous-répertoire.


ddext=( '/dev/sdb9' '/dev/sdb10' '/dev/sdb7' '/dev/sdb1')

À vous de modifier selon l'emplacement exact de vos partitions. Il est souhaitable que ces partitions soient sur un DD (disque dur) différent de celui qui abrite votre système. Ces partitions peuvent être sur des DDs internes ou externes. Il vous appartiendra, là aussi de créer ces partitions. Elles devront être de capacité suffisante pour recevoir tout votre système, plus une certaine réserve de sécurité.

systeme_fich=( 'ext3' 'ext2' 'ext3' 'ext3')

Là, c'est à vous de voir ce que vous aimez comme système de fichiers. À mon avis, ext2 doit suffire pour les sauvegardes mais pour le clone et sa /home, ext3 ou 4 sont peut-être à préférer.
Bien sûr, chaque système doit être en rapport avec son adresse du dessus, attention de ne pas inverser s'ils sont différents.

exclure=( '/root/exclure' '/home/ricardo/exclure' '/root/exclure' '/home/ricardo/exclure')

Là, il s'agit de créer deux "fichiers texte" dans lesquels vous inscrirez la liste de tous les répertoires/fichiers qui vous semblent devoir être exclus des sauvegardes. Le premier de ces fichiers sera placé dans le répertoire /root, tandis que le second le sera dans le répertoire ~/ c'est à dire /home/"vous". En effet, il est inutile de sauvegarder les répertoires/fichiers temporaires, et certains autres qui sont régénérés à chaque reboute. Si vous voulez un exemple de ces fichiers "exclure", vous le trouverez dans le tuto du forum, à cette URL : http://www.debian-fr.org/sauvegarde-clonage-d-une-sid-t25179.html

sauve=( '/mnt/autre/sauve' '/mnt/autre/sauve-ricardo' '/mnt/autre' '/mnt/autre/ricardo')

Inutile de créer ces fichiers, ils le seront lors de la première sauvegarde. Il vous appartient toutefois de renommer le second, en fonction de votre nom d'utilisateur.

répertoire_a_sauvegarder=( '/' '/home/ricardo/' '/' '/home/ricardo/')

La première donnée '/' n'est pas à modifier, elle concerne l'ensemble du système, sauf les répertoires et fichiers exclus, portés dans le fichier 'exclure'. La seconde concerne votre répertoire personnel ~/ qu'il est préférable d'écrire en entier : /home/"vous".


============ SCRIPT PROPREMENT DIT ===============

 #!/bin/bash
 
 ### BEGIN INIT INFO
 #  Nom du script : sauvegarde
 #  Auteur : Ricardo, aidé de l'équipe de 'debian-fr.org'
 #  Date de création : juillet 2011
 #  Utilité : faciliter les sauvegardes
 #  Version : cette version est écrite pour l'utilisation avec deux partitions de sauvegarde, à alterner dans le temps. 
 #+    Il est souhaitable que ces partitions soient sur un DD différent de celui qui abrite le système.
 #+    Ce script a été écrit de façon à ce qu'il soit le plus générique possible. Les seules données que vous devriez devoir changer,
 #+    se trouvent dans la partie droite des variables. 
 #  Pre-requis : voir tuto = http://www.debian-fr.org/sauvegarde-clonage-d-une-sid-t25179.html
 #+    et page du WIKI = http://www.isalo.org/wiki.debian-fr/index.php?title=Script_de_double_sauvegarde_altern%C3%A9e
 #  Description : script permettant d'effectuer, régulièrement et de façon simple, les sauvegardes de son système
 #  Droits : entièrement libres mais en cas de copie, la citation de "debian-fr.org" nous serait agréable
 #  Modifié le : 12 août 2011, puis le 11 février 2012
 #  Objet de la modification : amélioration du test sur l'existence et la validité des partitions de sauvegarde.
 ### END INIT INFO
 
 #----------------- Fonctions ----------------------------
 function sauvegarde()
 {
 	sudo rsync -av --del --exclude-from="$1" "$2" "$3"
 
 		# Teste si la sauvegarde a abouti ( = 0), sinon, on sort.
 		if (("$?" > 0))
 		then
    				printf "\nErreur lors de la sauvegarde de %s\n" "$3" 
    		else
 				printf '\E[30;45m'"\nSauvegarde de %s : OK\n" "$3"; tput sgr0
 				sleep 5 # juste le temps de pouvoir lire le résultat de la sauvegarde de '/'
 		fi  
 }
 
 function sortie_propre()
 {
 	# Si la partition de sauvegarde n'était pas montée lors de l'appel, on la démonte avant de sortir.
 	if [ "${deja_montee}" = 0 ]
 	then 
 		sudo umount "${mount_rep}"
 	else	
 	# Si la partition de sauvegarde était déjà montée lors de l'appel, on sort sans la démonter mais en s'assurant que les données ont bien été écrites.
 		sync
 	fi
 exit
 }		
 
 #----------------- Variables -------------------
 
 # CETTE PARTIE DOIT RETENIR TOUTE VOTRE ATTENTION, C'EST LÀ QUE VOUS PERSONNALISEREZ CE SCRIPT
 #+ POUR CE FAIRE, JE VOUS CONSEILLE DE VOUS RÉFÉRER AU TUTO ET AU SCRIPT INDIQUÉS DANS LE "PRE-REQUIS" DU "BEGIN INIT INFO"
 
 mount_rep="/mnt/autre"
 # la première donnée, vide, figure le [0], de façon à commencer par [1]
 ddext=('' '/dev/sdb9' '/dev/sdb10' '/dev/sdb7' '/dev/sdb1')
 systeme_fich=('' 'ext3' 'ext2' 'ext3' 'ext3')
 exclure=('' '/root/exclure' '/home/ricardo/exclure' '/root/exclure' 'home/ricardo/exclure')
 sauve=('' '/mnt/autre/sauve' '/mnt/autre/sauve-ricardo' '/mnt/autre/sauve' '/mnt/autre/sauve-ricardo')
 répertoire_a_sauvegarder=('' '/' '/home/ricardo/' '/' '/home/ricardo/')
 
 
 #----------------- Départ du script ----------------------------
 
 # Teste l'existence  du répertoire de montage, sinon, on sort avec erreur 1.
 	mkdir -p "${mount_rep}" 
 
 # Choix, puis test de la partition de sauvegarde. Si le montage ne s'effectue pas, on sort via la fonction sortie_propre() 
 deja_montee=0
 PS3="Entrez le N° de la sauvegarde choisie : "
 select choix_sauvegarde in "sauve" "sauve2" "sauve-clone" "sauve-Home-clone" quitter
 do
 case ${REPLY} in
    	[1,2,3,4]) 	
 index=${REPLY}
 	if [ ! -e "${ddext[$index]}" ] 
  	then 
 		printf "\n Impossible de se connecter à %s \n Vérifiez qu'il s'agit de la bonne partition et recommencez \n" "${ddext[$index]}" >&2; exit 1;
 	else
 		if ! grep -q "^${ddext[$index]} "${mount_rep}" ${systeme_fich[$index]}" /etc/mtab 
 		then
 			sudo mount -t "${systeme_fich[$index]}" "${ddext[$index]}" "${mount_rep}" || { deja_montee=1; sortie_propre; }
 			break 
 		else
 			printf "Info : La partition ${ddext[$index]} est déjà montée\n" 
 			deja_montee=1 
 			break 
 		fi		
 	fi	
 ;;
 	3) echo "On sort du script"; sortie_propre 
 ;;
 	*) echo "Saisie non valide !"
 ;;
 esac
 done
 
 
 # Teste l'emplacement de la corbeille et si elle est pleine (présence de fichier(s) dans ... /files). Si elle l'est, liste les fichiers qu'elle contient
 echo -e "\033[4mCONTENU de la CORBEILLE\033[0m\n"
 
 chemin_trash="${XDG_DATA_HOME:-$HOME/.local/share}/Trash"
 
 corbeille="$chemin_trash/files"	
 
 	if [ -z $(ls -A "$corbeille") &> /dev/null ] 
 	then
 		echo "LA CORBEILLE EST VIDE"		
 	else		 
 		ls -a "$corbeille"	
 		read -p "on peut la vider  ? o/* : " vider	 
 			if [ "$vider" = o ] 
 			then	
 				shopt -s dotglob
 				rm -rf "$chemin_trash"/{files/,info/,metadata}*
 				shopt -u dotglob
 				echo "CORBEILLE VIDÉE"
 			else
 				echo -e "\033[4mCORBEILLE CONSERVÉE PLEINE\033[0m"
 			fi		
 	fi 		
 
 # Ordre de sauvegarde faisant appel à la fonction 'sauvegarde()'
 read -p "prêt pour la sauvegarde ? o/* : " onyva
    	if [ "$onyva" = o ]
    	then
                 case "$index" in
     		1|2)
 			for choix in '1' '2'			
       	   		do
 				sauvegarde "${exclure[$choix]}" "${répertoire_a_sauvegarder[$choix]}" "${sauve[$choix]}"
 	   		done
   		    ;;
     		3|4)
 				sauvegarde "${exclure[$index]}" "${répertoire_a_sauvegarder[$index]}" "${sauve[$index]}"
   		    ;;
  		esac
 	else
 		sortie_propre
       	fi