Script de sauvegarde simple avec 'rsync'

Il y a environ 4 ans, j’avais fait un script de sauvegarde complet mais un peu rebutant à cause du nombre de variables. On le trouve encore dans T&A et dans le wiki.
Aujourd’hui, j’ai refait quelque chose de plus simple, toujours avec “rsync”, qui ne nécessite que peu de personnalisation : les trois variables du haut et les lignes de commande rsync
Pour ces dernières, je pars de mon exemple où j’utilise une partition pour tout le système sauf la “/home” et une autre partition pour la “/home”. C’est à adapter à votre situation.
Les lignes de commande ‘rsync’ tiennent compte de fichiers “exclure” où sont énumérés les fichiers à exclure de la sauvegarde (voir le fil de Josephtux à ce sujet ). Là aussi, il vous faudra accommoder.
Pour les variables des partitions cibles, j’emploie les PARTLABELs, qui ont l’avantage d’être uniques et pérennes, mais vous pouvez les remplacer par les LABELs, les UUIDs ou les PARTUUIDs, ou même par les classique /dev/sdXY. Dans ce dernier cas, prenez bien garde à ce que vous faites.

Voici donc le code à coller dans un fichier que vous rendrez exécutable, comme pour tout script, et que vous placerez selon votre habitude. La mienne, c’est /usr/local/bin

Si besoin explications supplémentaires, n’hésitez pas.

#!/bin/bash

### BEGIN INIT INFO
#  Nom du script : sauve
#  Auteur : Ricardo
#  Date de création : mai 2015 --- amélioré en 01/2016 = utilisation des PARTLABELs
#  Utilité : sauvegarde de ordibureau sur 2sDD
### END INIT INFO

 PtMontage='/mnt'
 cibleR='/dev/disk/by-partlabel/sauve2dDD'
 cibleH='/dev/disk/by-partlabel/sauve-ricardo2dDD'

 if [ ! -e $cibleR ]		# teste l'absence de la partition cible
    	then
        	echo "$cibleR est introuvable"
        	exit 1		# on sort
    	else 			# si la partition est trouvée
    		sudo mount -t ext4 $cibleR $PtMontage	# on monte la partition cible sur le point de montage
		if (("$?" > 0))				# si retour commande précédente = faux
			then
				echo "erreur de montage"
				exit 1			# on sort
			else				# si retour = 0 (bon), on exécute :
				sudo rsync -av --del --exclude-from=/root/exclure / $PtMontage
		fi
 fi
echo
printf '\E[30;45m'" sauve / terminé " ; tput sgr0
echo
echo
 sleep 2
 sudo umount $PtMontage
echo "Point de montage libéré"
 sleep 2
echo
echo "On passe à /home/ricardo"
 sleep 2
echo
 if [ ! -e $cibleH ]            # teste l'absence de la partition cible
        then
                echo "$cibleH est introuvable"
                exit 1          # on sort
        else                    # si la partition est trouvée
                sudo mount -t ext4 $cibleH $PtMontage   # on monte la partition cible sur le point de montage
                if (("$?" > 0))                         # si retour commande précédente = faux
                        then
                                echo "erreur de montage"
                                exit 1                  # on sort
                        else				# # si retour = 0 (bon), on éxécute :
				sudo rsync -av --del --exclude-from=/home/ricardo/exclure /home/ricardo/ $PtMontage
                fi
 fi
 sudo umount $PtMontage
echo
 printf '\E[30;45m'" sauvegarde complète et démontage effectué " ; tput sgr0
echo
 sleep 2
echo
 exit 0
2 J'aime

Merci, ça sera utile :slightly_smiling:

Je me permets une petite correction : pourquoi sortir sur un code 1 (ta dernière ligne), alors que visiblement tout s’est bien passé et que ça mériterait un code de retour 0 ?

Et si je comprends bien, tu rsync d’abord tout /(y compris /home) sur un disque puis une seconde fois uniquement /home sur un autre, c’est ça ?

Pour le dernier exit, tu as raison, “exit” suffit, je pense.
Non, la première passe de concerne que / en excluant /home
Les deux sauvegardes sont sur des partitions différentes :

cibleR= Racine sauve = PARTLABEL=sauve2dDD
cibleH = Home sauve = PARTLABEL=sauve-ricardo2dDD

EDIT :
Ce qui te fait penser ça, c’est que tu ne connais pas le contenu du fichier “exclure”.
le premier exclut /home (+ d’autres bricoles).

EDIT 2:
Je le note dans mes explications :

Les lignes de commande 'rsync' tiennent compte de fichiers "exclure" où sont énumérés les fichiers à exclure de la sauvegarde (voir le fil de Josephtux à ce sujet ). Là aussi, il vous faudra accommoder.

EDIT 3 :
Au sujet de “exit”, j’ai toujours des doutes.
Je ne trouve pas de tuto assez clair pour connaitre la bonne valeur à placer.
Je suis preneur d’explication, en FR, si possible.

Typiquement le code de sortie 0 signale une fin de programme sans erreur à l’exécution. Les codes supérieurs à 0 traduisent une erreur, à la charge du développeur de documenter quel numéro correspond à quelle erreur.

Effectivement, pour les fichiers exclude, je n’avais pas vu que tu en utilisais deux différents, ceci explique cela.

Merci pour les précisions :slightly_smiling:

OK, mis ‘exit 0’ à la fin.
Différence entre ‘exit’ seul et ‘exit 0:question:

À confirmer par quelqu’un de moins nul en sh que moi (c’est pas compliqué), mais je suppose qu’un exit seul est considéré comme une fin d’exécution sans erreur, donc 0 (c’est ce que suggère le
man exit en tout cas).

En effet, c’est EXACTEMENT pareil …
Cela part du principe que 0 == TRUE :wink:

Merci de la confirmation.