Swisslinux.org

− The GNU/Linux crossroads in Switzerland −

 

Language

 

The Forum

You are not logged in.

#1 29 Oct 2023 09:35:08

oinska
Prêcheu(r|se) du libre
Registered: 18 Dec 2017
Posts: 129

Sauvegarde sur deux disques externes sans interface graphique

Salut à tous!

J'ai transformé une ancienne tour en NAS (Debian 12 Bookworm). Syncthing synchronise les PC de la maison dans /home/user (chacun son dossier).

Je souhaite mettre en place un système de sauvegardes incrémentales de /home/* sur deux disques externes (a priori avec BorgBackup, mais mon choix n'est pas arrêté). Lorsque l'un des disques est sur la machine, l'autre est dans un autre lieu (au travail par exemple). Chaque semaine, j'intervertis les disques. C'est ce dernier point qui me fait turbiner. J'ai peur de corrompre les sauvegardes en intervertissant les disques.

Petite précision avant d'aller plus loin, je suis loin d'être un spécialiste. Un amateur averti tout au plus.

Voici mes interrogations:
Est-on d'accord que lors du branchement d'un périphérique de stockage sur Debian sans interface graphique, il faut monter le volume manuellement dans un point de montage?
Est-on d'accord que ce point de montage doit préalablement être créé (mount -U XXX-XXX /media/save1 ne fonctionne pas si /media/save1/ n'est pas existant)?
Est-on d'accord que rien n'empêche d'écrire dans /media/save1/ même si aucun volume n'est monté (ça reste un dossier comme un autre)?

Donc comment m'assurer que lorsque mon disque 1 est monté, ce soit bien les instructions de sauvegarde 1 qui tournent?
Comment m'assurer que les instructions de sauvegarde 2 ne s'écrivent pas dans un dossier qui sera écrasé au montage du disque 2?

J'ai pensé à faire un script Bash, mais mes compétences en la matière sont proches de zéro. Mais voici à quoi je pensais:

Code:

if
- Vérifier si UUID du disque 1 est présent (pas trouvé comment faire)
then
- Monter le disque dans /media/save1 (mount -U XXX-XXX /media/save1)
- Exécuter le script de sauvegarde 1 (dépendra du logiciel de sauvegarde)
- Démonter le volume (sync && umount /media/save1)
else
- echo "save1 pas présent"
elif
- Vérifier si UUID du disque 2 est présent (pas trouvé comment faire)
then
- Monter le disque dans /media/save2 (mount -U XXX-XXX /media/save2)
- Exécuter le script de sauvegarde 1 (dépendra du logiciel de sauvegarde)
- Démonter le volume (sync && umount /media/save2)
else
- echo "save2 pas présent"
fi

Je suis preneur de tout conseil. Peut-être existe-t-il un système plus simple? Vous les gérez comment vos sauvegardes?

Offline

 

#2 01 Nov 2023 16:30:24

oinska
Prêcheu(r|se) du libre
Registered: 18 Dec 2017
Posts: 129

Re: Sauvegarde sur deux disques externes sans interface graphique

Yop!

Pour ceux que ça intéresse, j'ai trouvé une solution pour mon script que voici:

Code:

#!/bin/bash
# Attibution des UUID aux variables
UUID1=$(lsblk -o UUID /dev/sd?? | sed -n 2p);
UUID2=$(lsblk -o UUID /dev/sd?? | sed -n 2p);
if # Si
   # Vérifier si UUID1 est présent et confirmer
   [ $UUID1 = XXX-XXX-XXX1 ] && echo "UUID1 présent";
then # Aors
   # Monter le disque dans /media/save1 et confirmer
   mount -U XXX-XXX-XXX1 /media/save1 && echo "save1 monté" &&
   # Exécuter le script de sauvegarde 1 et confirmer
   echo "Exécuter le script de sauvegarde 1" && echo "Sauvegarde 1 exécutée" &&
   # Démonter le volume  et confirmer
   sync && umount /media/save1 && echo "save1 démonté";
elif # Sinon
   # Vérifier si UUID2 est présent
   [ $UUID2 = XXX-XXX-XXX2 ] && echo "UUID2 présent";
then # Alors
   # Monter le disque dans /media/save2 et confirmer
   mount -U XXX-XXX-XXX2 /media/save2 && echo "save2 monté" &&
   # Exécuter le script de sauvegarde 2 et confirmer
   echo "Exécuter le script de sauvegarde 2" && echo "Sauvegarde 2 exécutée" &&
   # Démonter le volume et confirmer
   sync && umount /media/save2 && echo "save2 démonté";
else # Sinon
   echo "AUCUN DISQUE DISPONIBLE"
fi

Voyez-vous quelque chose de louche?

J'attaque l'étude de BorgBackup pour la création de mes scripts de sauvegardes et je reviens ici pour partager mes trouvailles.

A+

Offline

 

#3 01 Nov 2023 22:39:22

oinska
Prêcheu(r|se) du libre
Registered: 18 Dec 2017
Posts: 129

Re: Sauvegarde sur deux disques externes sans interface graphique

BorgBackup est vraiment une tuerie! La documentation est d'une clarté!

Récapitulatif
Situation de base
J'ai un NAS (PC tour de récupération) sous Debian 12 Bookworm sans interface graphique.
Les PC de la maison se synchronisent au NAS via Syncthing.
Chaque utilisateur a un dossier sur le NAS dans /home/user.

Désire
Sauvegarder /home/* sur deux disques durs externes.
Une semaine sur un disque, une semaine sur l'autre disque.

Script "Master"
Ce script permet de vérifier quel disque est branché au NAS.
Il monte le disque dans le point de montage.
Il lance le bon script de sauvegarde.
Il démonte le point de montage.

Code:

01 #!/bin/bash
02 UUID=$(lsblk -o UUID /dev/sdj1 | sed -n 2p);                  # Attribution de l'UUID à la variable UUID
03 disque1="XXX-XXX-XXX1"                                        # Définition de l'UUID du disque 1
04 disque2="XXX-XXX-XXX2"                                        # Définition de l'UUID du disque 2
05
06 if                                                            # Si
07    [ "$UUID" = "$disque1" ] && echo "disque 1 présent";           # Le disque 1 est présent
08 then                                                          # Alors
09    mount -U "$disque1" /media/save1 && echo "save1 monté" &&    # Monter le disque dans /media/save1
10    /root/save/save1.sh && echo "Sauvegarde 1 exécutée" &&     # Exécuter le script de sauvegarde 1
11    sync && umount /media/save1 && echo "save1 démonté";       # Démonter le volume
12 elif                                                          # Sinon
13    [ "$UUID" = "$disque2" ] && echo "disque 2 présent";           # Vérifier si le disque 2 est présent
14 then                                                          # Alors
15    mount -U "$disque2" /media/save2 && echo "save2 monté" &&    # Monter le disque dans /media/save2
16    /root/save2.sh && echo "Sauvegarde 2 exécutée" &&          # Exécuter le script de sauvegarde 2
17    sync && umount /media/save2 && echo "save2 démonté";       # Démonter le volume
18 else                                                          # Si aucun disque n'est présent
19    echo "AUCUN DISQUE DISPONIBLE"                             # Afficher AUCUN DISQUE DISPONIBLE 
20 fi

Script de sauvegarde 1
Ce script est lancé par le script "Master" à la ligne 10 uniquement si le disque 1 est branché sur le NAS.
Je n'ai rien inventé, BorgBackup le donne sur son site...

Code:

#!/bin/bash

# Emplacement du dépôt
export BORG_REPO=/media/save1

# Mot de passe de chiffrement
export BORG_PASSPHRASE='XXX'

# Quelques aides et gestion des erreurs
info() { printf "\n%s %s\n\n" "$( date )" "$*" >&2; }
trap 'echo $( date ) SAUVEGARDE INTERROMPUE >&2; exit 2' INT TERM

info "Début de la sauvegarde"

# Sauvegarde
borg create                    \
   --verbose                   \
   --list                      \
   --stats                     \
   --show-rc                   \
   --compression lz4           \
   --exclude-caches            \
                               \
   ::"{now:%Y-%m-%d_%H:%M:%S}" \
   /home

backup_exit=$?

info "Elagage des sauvegarde"

# Elagage des sauvegardes
borg prune                          \
    --list                          \
    --show-rc                       \
    --keep-minimal    7             \
    --keep-weekly   4               \
    --keep-monthly  6

prune_exit=$?

# Compacter le dépôt

info "Compactage du dépôt"

borg compact

compact_exit=$?

# Résultat du script
global_exit=$(( backup_exit > prune_exit ? backup_exit : prune_exit ))
global_exit=$(( compact_exit > global_exit ? compact_exit : global_exit ))

if [ ${global_exit} -eq 0 ]; then
    info "Sauvegarde, Elagage et compactage terminé avec succès"
elif [ ${global_exit} -eq 1 ]; then
    info "Sauvegarde, Elagage et/ou compactage terminé avec des WARNING"
else
    info "Sauvegarde, Elagage et/ou compactage terminé avec des ERREURS"
fi

exit ${global_exit}

Script de sauvegarde 2
Ce script est lancé par le script "Master" à la ligne 16 uniquement si le disque 2 est branché sur le NAS.
Rien de bien différent, si ce n'est l'emplacement du dépôt ainsi que la PassPhrase de chiffrement.

Code:

#!/bin/bash

# Emplacement du dépôt
export BORG_REPO=/media/save2

# Mot de passe de chiffrement
export BORG_PASSPHRASE='XXX'

# Quelques aides et gestion des erreurs
info() { printf "\n%s %s\n\n" "$( date )" "$*" >&2; }
trap 'echo $( date ) SAUVEGARDE INTERROMPUE >&2; exit 2' INT TERM

info "Début de la sauvegarde"

# Sauvegarde
borg create                    \
   --verbose                   \
   --list                      \
   --stats                     \
   --show-rc                   \
   --compression lz4           \
   --exclude-caches            \
                               \
   ::"{now:%Y-%m-%d_%H:%M:%S}" \
   /home

backup_exit=$?

info "Elagage des sauvegarde"

# Elagage des sauvegardes
borg prune                          \
    --list                          \
    --show-rc                       \
    --keep-minimal    7               \
    --keep-weekly   4               \
    --keep-monthly  6

prune_exit=$?

# Compacter le dépôt

info "Compactage du dépôt"

borg compact

compact_exit=$?

# Résultat du script
global_exit=$(( backup_exit > prune_exit ? backup_exit : prune_exit ))
global_exit=$(( compact_exit > global_exit ? compact_exit : global_exit ))

if [ ${global_exit} -eq 0 ]; then
    info "Sauvegarde, Elagage et compactage terminé avec succès"
elif [ ${global_exit} -eq 1 ]; then
    info "Sauvegarde, Elagage et/ou compactage terminé avec des WARNING"
else
    info "Sauvegarde, Elagage et/ou compactage terminé avec des ERREURS"
fi

exit ${global_exit}

En ajoutant "exec 2>&1" au début du script "Master" (juste après le shebang) et en lançant le script comme ceci

Code:

emplacement du script master | tee -a fichier-de-log

toutes les informations affichées à l'écran seront loggées dans le fichier spécifié.
On peut bien entendu ajouter une ligne à Crontab pour exécuter le script "Master" à la fréquence désirée.

Voilà, de mon côté, la première sauvegarde est en cours sur mon disque 1. Ca va prendre du temps.

Si vous avez des commentaires, si vous voyez des erreurs dans mes scripts, n'hésitez pas à vous manifester. J'ai fait ça en tâtonnant...

Allé, salut!

[edit 04.11.2023: légères modifications des scripts pour les rendre conformes. Merci Q!]

Last edited by oinska (04 Nov 2023 14:33:12)

Offline

 

Board footer

Powered by FluxBB