Besoin d'aide pour debug un script de sauvegarde

Bonjour,
J’ai créé il y a deux ou trois ans un petit script simple pour faire des sauvegardes.
Jusqu’à présent ça fonctionnait sans problème mais là sans rien changé maintenant ça pose un problème.
voici le principe :
J’ai un mini pc qui me sert de media center basique (à base de MPD pour la musique et DLNA pour les films).

Je fais une sauvegarde régulière de tout le contenu sur un DD externe.
Pour cela je monte le DD dans /media puis je fais un rsync des répertoires qui m’intéressent.
Ca a très bien fonctionné pendant 3 ans, et là du jour au lendemain ça me fait une copie dans /media et du coup ça me rempli en 5 minutes ma partition /
(alors que normalement c’est sensé faire une copie dans mon DD)

Pouvez-vous me dire où je me trompe dans mon raisonnement ?
Merci.

Voici le script en question :

#!/bin/bash
Date=$(date "+%d.%m.%Y-%H:%M:%S")
Sortie="/home/matmatiu/Journal_de_sauvegarde" 
echo "Lancement du script de sauvegarde" - $Date > $Sortie
#Verification repertoire et montage si necessaire :
if [ -d /media/securite ]
then 
        echo "Repertoire /media/securite existant" >> $Sortie
else 
        echo "Création répertoire /media/securite" >> $Sortie; mkdir /media/securite
fi
#Verification volume monté :
if [ -d /media/securite/Securite ]
then
        echo "Volume déjà monté" >> $Sortie
else
        echo "Montage du volume /dev/sdb1 en /media/securite" >> $Sortie; mount /dev/sdb1 /media/securite
fi

#Sauvegarde /Documents
echo "Début de la sauvegarde de /Documents" >> $Sortie
rsync -r -t -p -o -g -v --progress -l -D -s /home/matmatiu/Documents /media/securite/Securite &>> $Sortie

#Sauvegarde /Images                          
echo "Début de la sauvegarde de /Images" >> $Sortie
rsync -r -t -p -o -g -v --progress -l -D -s /home/matmatiu/Images /media/securite/Securite &>> $Sortie

#Sauvegarde /Musique
echo "Début de la sauvegarde de /Musique" >> $Sortie
rsync -r -t -p -o -g -v --progress -l -D -s /home/matmatiu/Musique /media/securite/Securite &>> $Sortie
#Sauvegarde /Vidéos
echo "Début de la sauvegarde de /Vidéos" >> $Sortie
rsync -r -t -p -o -g -v --progress -l -D -s /home/matmatiu/Vidéos /media/securite/Securite &>> $Sortie

#test sauvegarde
#echo Début de la sauvegarde de /test" >> $Sortie
#rsync -r -t -p -o -g -v --progress -l -D -s /home/matmatiu/test /media/securite/Securite &>> $Sortie

echo "Fin de la sauvegarde" - $Date >> $Sortie
#On ne démonte pas le DD c'est commenté volontairement
#echo Démontage du volume" >> $Sortie; umount /media/securite
exit

Tu ne vérifies pas que /media/securite est un point de montage.
Tu ne vérifies pas que le montage a réussi.
La partition à monter devrait être spécifiée avec un identifiant persistant (LABEL, UUID) et pas un nom de périphérique qui est variable par nature.

Sur ces deux points, je ne comprends pas ce que je dois faire, et surtout j’ignore ce que ça change :
Quelle est la différence entre appeler le DD dans un rep avec

mount /dev/sdb1 /media/securite

et ce que tu dis ?
Et du coup, quelle serait la bonne syntaxe ?

Personnellement j’ai un test de ce genre dans un script vite fait:

if [ -z `mount | grep -i diskstation` ]; then
                        mount -t cifs -o username=laurent,vers=3.0 ${MEDIA_RSYNC_DEVICE} ${MEDIA_RSYNC_MOUNT}
                        err=$?
                        if [ $err -ne 0 ]; then
                                echo "Erreur au montage de ${MEDIA_RSYNC_DEVICE} vers ${MEDIA_RSYNC_MOUNT}. Arrêt du programme."
                                exit $err
                        fi
                fi

diskstation c’est le point de montage dans /media

Pour « vérification volume monté », il serait plus sûr de vérifier d’abord que /media/securite est un point de montage, par exemple avec la commande mountpoint, que de seulement vérifier l’existence d’un répertoire censé être dans ce volume.

Il faut aussi vérifier le résultat de la commande mount ou bien demander que le script s’arrête en cas d’erreur (set -e) sinon en cas d’échec du montage pour une raison quelconque la sauvegarde se fera dans la racine. C’est probablement ce qui s’est passé une fois. Ensuite, le répertoire /media/securite/Securite existant dans la racine, le volume n’a plus jamais été monté.

Les noms /dev/sd* ne sont pas persistants. Ils sont attribués dans l’ordre de détection des disques. Le disque de sauvegarde pourrait très bien être /dev/sda s’il est présent au démarrage et détecté avant le disque interne, ou /dev/sdc si un autre disque ou clé USB est présent et vu comme sdb… Avec un identifiant persistant, ce n’est pas un problème. La syntaxe est UUID=xxxx ou LABEL=xxxx (infos affichées par blkid) au lieu de /dev/sdb1.

1 J'aime

Merci, j’ai compris que effectivement ça s’est mal passé une fois :
Pour tester, j’ai totalement supprimé securite/Securite et après j’ai rebooté.

Désormais quand je fait df -h j’ai bien un / occupé à 20% et stable, il ne se rempli pas au bout de 5 minutes, donc cette fois-ci mon DD est bien monté et le script n’essaie pas de tout copier dans / pour faire la sauvegarde.
il faut que je cherche de la doc pour le réécrire totalement, maintenant …
Mais j’en conclue que effectivement ma syntaxe est mauvaise car le script est incapable de différencier un répertoire d’un point de montage.

Bonjour,

Pour vérifier de manière fiable si un point de montage est utilisé, l’idéal serait d’utiliser findmnt

if [[ $(findmnt -M /media/truc) ]]; then
    echo "Monté sur truc"
else
    echo "Rien de monté sur truc"
fi

Évidemment il faudrait aussi vérifier que c’est bien le bon disque qui est monté sur /media/truc . Pour cela il faudrait modifier un peu le code d’exemple pour comparer l’UUID de la partition voulue avec celui sorti par findmnt

Et attention à set -e dans les scripts c’est piégeux ! :wink:
Mieux vaut gérer les erreurs dans le code en testant le retour des commandes .

1 J'aime