Script de double sauvegarde alternée + clonage

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

SCRIPT ILLISIBLE DANS L'ÉTAT, ATTENDRE QUE CETTE LIGNE AIT DISPARU POUR LE COPIER

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

Pourquoi double sauvegarde ? C'est tout simplement une sécurité supplémentaire.

  • 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'.

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é.

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 dossier présent dans le PATH, ainsi, vous pourrez envoyer ce script de n'importe quel endroit de votre architecture. Pour connaître ces dossiers, tapez en tant qu' 'user' : echo $PATH. Personnellement, j'ai créé un dossier 'bin' qui contient tous mes scripts-maison, je l'ai placé dans /home/ricardo, puis je l'ai ajouté au PATH.

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

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.

Il faudra aussi créer les dossiers de controle /home/controle et /home/controle-vous (expliqué plus bas).

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')

systeme_fich=( 'ext3' 'ext2')

controle=( '/home/controle' '/home/controle-ricardo')

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

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

dossier_a_sauver=( '/' '/home/ricardo') mount_rep="/mnt/autre"

il s'agit du dossier 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 dossier habituel pour les montages temporaires, j'ai préféré créer un sous-dossier.


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

À la place de /dev/sdb9, vous porterez l'adresse de la première partition de sauvegarde et à la place de /dev/sdb10, celle de votre seconde partition de sauvegarde. Il est souhaitable que ces partitions soient sur un DD (disque dur) différent de celui qui abrite votre système. Ces deux 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é. Je pense que si l'ensemble de votre système "pèse" 20 Gio, il est souhaitable que ces partitions supportent une trentaine de Gio. Ces données sont à considérer selon vos habitudes et surtout selon ce que contient votre /home.

systeme_fich=( 'ext3' 'ext2')

Là, c'est à vous de voir ce que vous aimez comme système de fichiers. À mon avis, ext2 doit suffire. Personnellement, j'avais une partition déjà créée en ext3 et je m'en suis servi mais la seconde a été créée pour l'occasion en ext2. 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.

controle=( '/home/controle' '/home/controle-ricardo')

Ce sont les deux dossiers que vous devrez créer. Ils seront placés tous les deux dans /home. À vous de les renommer à votre convenance mais sans modifier le 'controle' de début de ligne, bien sûr.

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 dossiers/fichiers qui vous semblent devoir être exclus des sauvegardes. Le premier de ces fichiers sera placé dans le dossier /root, tandis que le second le sera dans le dossier ~/ c'est à dire /home/"vous". En effet, il est inutile de sauvegarder les dossiers/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')

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.

dossier_a_sauver=( '/' '/home/ricardo')

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


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

  1. !/bin/bash
      1. BEGIN INIT INFO
  1. Nom du script : sauvegarde
  2. Auteur : Ricardo, aidé de l'équipe de 'debian-fr.org'
  3. Date de création : juillet 2011
  4. Utilité : faciliter les sauvegardes
  5. Version : cette version est écrite pour l'utilisation avec deux partitions de sauvegarde, à alterner dans le temps.
  6. + Il est souhaitable que ces partitions soient sur un DD différent de celui qui abrite le système.
  7. + 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,
  8. + se trouvent dans la partie droite des variables.
  9. Pre-requis : voir tuto = http://www.debian-fr.org/sauvegarde-clonage-d-une-sid-t25179.html
  10. + et page du WIKI = http://www.isalo.org/wiki.debian-fr/index.php?title=Script_de_double_sauvegarde_altern%C3%A9e
  11. Description : script permettant d'effectuer, régulièrement et de façon simple, les sauvegardes de son système
  12. Droits : entièrement libres mais en cas de copie, la citation de "debian-fr.org" nous serait agréable
  13. Modifié le : 12 août 2011
  14. Objet de la modification : amélioration du test sur l'existence et la validité des partitions de sauvegarde.
      1. END INIT INFO
  1. ----------------- Fonctions ----------------------------

function sauvegarde() { sudo rsync -av --del --backup --backup-dir="$1" --exclude-from="$2" "$3" "$4"

# 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 "\nSauvegarde de %s : OK\n" "$3" sleep 10 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 }

  1. ----------------- Variables -------------------
  1. CETTE PARTIE DOIT RETENIR TOUTE VOTRE ATTENTION, C'EST LÀ QUE VOUS PERSONNALISEREZ CE SCRIPT
  2. + 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"
                                      1. disk="59ef8983-a8da-47c3-877e-f384309c0551"

mount_rep="/mnt/autre"

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

ddext=( '/dev/sdb9' '/dev/sdb10') systeme_fich=( 'ext3' 'ext2') controle=( '/home/controle' '/home/controle-ricardo') exclure=( '/root/exclure' '/home/ricardo/.exclure') sauve=( '/mnt/autre/sauve' '/mnt/autre/sauve-ricardo') dossier_a_sauver=( '/' '/home/ricardo')


  1. ----------------- Départ du script ----------------------------
  1. Teste l'existence du dossier de montage, sinon, on sort avec erreur 1.

mkdir -p "${mount_rep}" || { echo "Le dossier de montage n'existe pas !" >&2; exit 1; }

  1. 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" quitter do case ${REPLY} in

  	[1-2]) 	

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


  1. 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="$HOME/.local/share/Trash"

if [ ! -z "$XDG_DATA_HOME" ] then chemin_trash="$XDG_DATA_HOME/Trash" fi

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

  1. Ordre de sauvegarde faisant appel à la fonction 'sauvegarde()'

read -p "prêt pour la sauvegarde ? o/* : " onyva

  	if [ "$onyva" = o ]
  	then

for((index=1; index < ${#controle[@]}; index++)) do sauvegarde "${controle[$index]}" "${exclure[$index]}" "${dossier_a_sauver[$index]}" "${sauve[$index]}" done fi sortie_propre