Script de double sauvegarde alternée + clonage

De Le Wiki de debian-fr.xyz
Aller à : navigation, rechercher

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 ===============

  1  #!/bin/bash
  2  
  3  ### BEGIN INIT INFO
  4  #  Nom du script : sauvegarde
  5  #  Auteur : Ricardo, aidé de l'équipe de 'debian-fr.org'
  6  #  Date de création : juillet 2011
  7  #  Utilité : faciliter les sauvegardes
  8  #  Version : cette version est écrite pour l'utilisation avec deux partitions de sauvegarde, à alterner dans le temps. 
  9  #+    Il est souhaitable que ces partitions soient sur un DD différent de celui qui abrite le système.
 10  #+    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,
 11  #+    se trouvent dans la partie droite des variables. 
 12  #  Pre-requis : voir tuto = http://www.debian-fr.org/sauvegarde-clonage-d-une-sid-t25179.html
 13  #+    et page du WIKI = http://www.isalo.org/wiki.debian-fr/index.php?title=Script_de_double_sauvegarde_altern%C3%A9e
 14  #  Description : script permettant d'effectuer, régulièrement et de façon simple, les sauvegardes de son système
 15  #  Droits : entièrement libres mais en cas de copie, la citation de "debian-fr.org" nous serait agréable
 16  #  Modifié le : 12 août 2011, puis le 11 février 2012
 17  #  Objet de la modification : amélioration du test sur l'existence et la validité des partitions de sauvegarde.
 18  ### END INIT INFO
 19  
 20  #----------------- Fonctions ----------------------------
 21  function sauvegarde()
 22  {
 23  	sudo rsync -av --del --exclude-from="$1" "$2" "$3"
 24  
 25  		# Teste si la sauvegarde a abouti ( = 0), sinon, on sort.
 26  		if (("$?" > 0))
 27  		then
 28     				printf "\nErreur lors de la sauvegarde de %s\n" "$3" 
 29     		else
 30  				printf '\E[30;45m'"\nSauvegarde de %s : OK\n" "$3"; tput sgr0
 31  				sleep 5 # juste le temps de pouvoir lire le résultat de la sauvegarde de '/'
 32  		fi  
 33  }
 34  
 35  function sortie_propre()
 36  {
 37  	# Si la partition de sauvegarde n'était pas montée lors de l'appel, on la démonte avant de sortir.
 38  	if [ "${deja_montee}" = 0 ]
 39  	then 
 40  		sudo umount "${mount_rep}"
 41  	else	
 42  	# 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.
 43  		sync
 44  	fi
 45  exit
 46  }		
 47  
 48  #----------------- Variables -------------------
 49  
 50  # CETTE PARTIE DOIT RETENIR TOUTE VOTRE ATTENTION, C'EST LÀ QUE VOUS PERSONNALISEREZ CE SCRIPT
 51  #+ 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"
 52  
 53  mount_rep="/mnt/autre"
 54  # la première donnée, vide, figure le [0], de façon à commencer par [1]
 55  ddext=('' '/dev/sdb9' '/dev/sdb10' '/dev/sdb7' '/dev/sdb1')
 56  systeme_fich=('' 'ext3' 'ext2' 'ext3' 'ext3')
 57  exclure=('' '/root/exclure' '/home/ricardo/exclure' '/root/exclure' 'home/ricardo/exclure')
 58  sauve=('' '/mnt/autre/sauve' '/mnt/autre/sauve-ricardo' '/mnt/autre/sauve' '/mnt/autre/sauve-ricardo')
 59  répertoire_a_sauvegarder=('' '/' '/home/ricardo/' '/' '/home/ricardo/')
 60  
 61  
 62  #----------------- Départ du script ----------------------------
 63  
 64  # Teste l'existence  du répertoire de montage, sinon, on sort avec erreur 1.
 65  	mkdir -p "${mount_rep}" 
 66  
 67  # Choix, puis test de la partition de sauvegarde. Si le montage ne s'effectue pas, on sort via la fonction sortie_propre() 
 68  deja_montee=0
 69  PS3="Entrez le N° de la sauvegarde choisie : "
 70  select choix_sauvegarde in "sauve" "sauve2" "sauve-clone" "sauve-Home-clone" quitter
 71  do
 72  case ${REPLY} in
 73     	[1,2,3,4]) 	
 74  index=${REPLY}
 75  	if [ ! -e "${ddext[$index]}" ] 
 76   	then 
 77  		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;
 78  	else
 79  		if ! grep -q "^${ddext[$index]} "${mount_rep}" ${systeme_fich[$index]}" /etc/mtab 
 80  		then
 81  			sudo mount -t "${systeme_fich[$index]}" "${ddext[$index]}" "${mount_rep}" || { deja_montee=1; sortie_propre; }
 82  			break 
 83  		else
 84  			printf "Info : La partition ${ddext[$index]} est déjà montée\n" 
 85  			deja_montee=1 
 86  			break 
 87  		fi		
 88  	fi	
 89  ;;
 90  	3) echo "On sort du script"; sortie_propre 
 91  ;;
 92  	*) echo "Saisie non valide !"
 93  ;;
 94  esac
 95  done
 96  
 97  
 98  # 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
 99  echo -e "\033[4mCONTENU de la CORBEILLE\033[0m\n"
100  
101  chemin_trash="${XDG_DATA_HOME:-$HOME/.local/share}/Trash"
102  
103  corbeille="$chemin_trash/files"	
104  
105  	if [ -z $(ls -A "$corbeille") &> /dev/null ] 
106  	then
107  		echo "LA CORBEILLE EST VIDE"		
108  	else		 
109  		ls -a "$corbeille"	
110  		read -p "on peut la vider  ? o/* : " vider	 
111  			if [ "$vider" = o ] 
112  			then	
113  				shopt -s dotglob
114  				rm -rf "$chemin_trash"/{files/,info/,metadata}*
115  				shopt -u dotglob
116  				echo "CORBEILLE VIDÉE"
117  			else
118  				echo -e "\033[4mCORBEILLE CONSERVÉE PLEINE\033[0m"
119  			fi		
120  	fi 		
121  
122  # Ordre de sauvegarde faisant appel à la fonction 'sauvegarde()'
123  read -p "prêt pour la sauvegarde ? o/* : " onyva
124     	if [ "$onyva" = o ]
125     	then
126                  case "$index" in
127      		1|2)
128  			for choix in '1' '2'			
129        	   		do
130  				sauvegarde "${exclure[$choix]}" "${répertoire_a_sauvegarder[$choix]}" "${sauve[$choix]}"
131  	   		done
132    		    ;;
133      		3|4)
134  				sauvegarde "${exclure[$index]}" "${répertoire_a_sauvegarder[$index]}" "${sauve[$index]}"
135    		    ;;
136   		esac
137  	else
138  		sortie_propre
139        	fi