#226 Le 21/06/2025, à 15:26
- iznobe
Re : script d’automatisation sauvegardes
redemarre , et sans rien toucher d ' autre , remontre :
grep sshfs /etc/mtab
si tu obtiens le même retour que précédemment alors tout est ok pour le fstab .
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#227 Le 21/06/2025, à 16:07
- eric63
Re : script d’automatisation sauvegardes
il faut modifier la ligne 214 , car je n' ai pas compris a quoi sert les " on " " off "
dans les lignes 211-214 avec kdialog on peut établir une liste de choix avec des choix prédéterminés qui sont à «on»; les non sélectionnés sont à off ; on peut sélectionner ou désélectionner ces choix suivant l’humeur ou le souhait à la souris. Je trouve cela très pratique.
modifié ligne 213 pour mettre le choix fanou en dernière position
resultats=$(kdialog --separate-output --checklist "Selection liste:" 1 "Sauvegarde Photos" off 2 "Sauvegarde Images" off 4 "Sauvegarde Musiques" off 8 "Sauvegarde DocumentsCommuns" off 16 "Sauvegarde DocumentsEric" on 32 "Sauvegarde DocumentsFanou" on )
et 273-291
16)
log_info "Sauvegarde DocumentsEric sélectionnée"
echo DocumentsEric
user=kubu
ip=$ipVM
src=/home/kubu/Documents
dst=/home/kubu/VMMultimedias/VMSauvegardesDocuments/VMSauvegardesDocumentsEric/
bkp=incremental-DocumentsEric/$date/
backup_name="DocumentsEric"
;;
32)
log_info "Sauvegarde DocumentsFanou sélectionnée"
echo DocumentsFanou
user=Fanou
ip=$ipPortable
src=/home/fanou/Documents
dst=/home/fanou/VMMultimedias/VMSauvegardesDocuments/VMSauvegardesDocumentsFanou/
bkp=incremental-DocumentsFanou/$date/
backup_name="DocumentsFanou"
*)
j’ai pas touché encore au fstab je poste le retour sur ce post ici dès que cela sera fait
tu crees un dossier /home/kubu/VM .
tu crees un dossier /home/kubu/fanou .
Dans le fstab , tu modifies tes 2 lignes :
Multimedias@192.168.1.128:/home/Multimedias /home/kubu/VM ...........
fanou@192.168.1.60:/home/fanou/Documents /home/kubu/fanou ...........
fait
Pour tes sauvegardes ,
soit tu met tout en vrac dans : /media/$USER/JEUX8T/SAUVEGARDESsoit tu recrées la structure des dossiers sauvegardés à l' identique :
/media/$USER/JEUX8T/SAUVEGARDES/incremental-Photos
/media/$USER/JEUX8T/SAUVEGARDES/incremental-Images
/media/$USER/JEUX8T/SAUVEGARDES/incremental-Musiques
/media/$USER/JEUX8T/SAUVEGARDES/incremental-DocumentsPartages
/media/$USER/JEUX8T/SAUVEGARDES/incremental-DocumentsFanou
/media/$USER/JEUX8T/SAUVEGARDES/incremental-DocumentsEric
ça m’oblige à modifier l’emplacement des sauvegardes des documents Eric et Fanou qui ne vont plus être dans la VM mais dans le 8T
là le disque ET le Pc devront être allumé pour sauvegarder des documents.
Ce qui ne serait pas le cas si la sauvegarde des documents était sur la VM ?? Comme je le faisais y‘a pas si longtemps
/media/$USER/VM/DocumentsEric --incremental-DocumentsEric
# ça doit être complètement foireux pour que le dossier /incremental-DocumentsEric soit à coté du dossier /DocumentsEric
Dernière modification par eric63 (Le 21/06/2025, à 16:52)
Kubuntu 25.04 wayland Plasma 6.3.4 KDE Qt 6.12.0 noyau 6.14.0-15 Asus B760+D4 i5-12400F 4.4Ghz DDR4 32Go nvidia RTX 3060 12GB
Utilisez les drivers libres avant d’ installer une brother avec le script de demonipuch
J’utilise le clavier french AFNOR
Hors ligne
#228 Le 21/06/2025, à 17:09
- iznobe
Re : script d’automatisation sauvegardes
je pensais que tu faisais une double sauvegarde des documents , dans la VM et dans le disque 8T .
je n ' ai pas compris pourquoi tu ne centralise pas tes sauvegardes sur le disque sauvegarde .
c ' est ce qui me parait le plus logique .
Mais accorde les chemins selon ce que tu dois faire dans ce cas . le principe reste le meme .
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#229 Le 21/06/2025, à 17:58
- eric63
Re : script d’automatisation sauvegardes
le fstab
Multimedias@192.168.1.128:/home/Multimedias /home/kubu/VM fuse.sshfs port=22,user,noauto,noatime,x-systemd.mount-timeout=3,_netdev,delay_connect,idmap=user,transform_symlinks,identityfile=/home/kubu/.ssh/id_ed25519,default_permissions,uid=1001,gid=1001,allow_other
fanou@192.168.1.60:/home/fanou/Documents /home/kubu/fanou fuse.sshfs port=22,user,noatime,x-systemd.mount-timeout=3,_netdev,delay_connect,idmap=user,transform_symlinks,identityfile=/home/kubu/.ssh/id_ed25519,default_permissions,uid=1001,gid=1001,allow_other
j’ai refait les commandes
kubu@kubu-System-Product-Name:~$ sudo -i
[sudo] password for kubu:
root@kubu-System-Product-Name:~# cp -r /home/kubu/.ssh/ /root
root@kubu-System-Product-Name:~# exit
logout
kubu@kubu-System-Product-Name:~$ sudo mount -a
kubu@kubu-System-Product-Name:~$ grep sshfs /etc/mtab
fanou@192.168.1.60:/home/fanou/Documents /home/kubu/fanou fuse.sshfs rw,nosuid,nodev,noexec,noatime,user_id=0,group_id=0,default_permissions,allow_other 0 0
kubu@kubu-System-Product-Name:~$
[2025-06-21_17:05:39] [INFO] === DÉBUT DE LA SAUVEGARDE ===
[2025-06-21_17:05:39] [INFO] Configuration:
[2025-06-21_17:05:39] [INFO] - Point de montage: /media/kubu/JEUX8T
[2025-06-21_17:05:39] [INFO] - UUID partition: 35bb9ca2-2022-4dfa-a201-1a2dde7ce1aa
[2025-06-21_17:05:39] [INFO] - Date: 2025-06-21_17h05
[2025-06-21_17:05:39] [INFO] Vérification du disque externe...
[2025-06-21_17:05:39] [ERROR] Disque non reconnu ou éteint
[2025-06-21_17:05:39] [ERROR] UUID trouvé: ''
[2025-06-21_17:05:39] [ERROR] UUID attendu: '35bb9ca2-2022-4dfa-a201-1a2dde7ce1aa'
[2025-06-21_17:05:46] [INFO] Attente du montage du disque...
[2025-06-21_17:05:55] [INFO] Disque monté avec succès après 1 tentatives
[2025-06-21_17:05:56] [INFO] Affichage de la boîte de dialogue de sélection...
[2025-06-21_17:06:11] [INFO] Sélections utilisateur: 16
32
[2025-06-21_17:05:39] [DEBUG] Répertoire des logs: /home/kubu/ScriptsVMImportants/log/backup-script
[2025-06-21_17:05:39] [DEBUG] Mode debug: 1
[2025-06-21_17:05:39] [DEBUG] Nettoyage des anciens logs (> 30 jours)
[2025-06-21_17:05:39] [DEBUG] Utilisateur: kubu
[2025-06-21_17:05:39] [DEBUG] UUID trouvé: ''
[2025-06-21_17:05:39] [DEBUG] UUID attendu: '35bb9ca2-2022-4dfa-a201-1a2dde7ce1aa'
[2025-06-21_17:05:51] [DEBUG] Tentative 1 - Vérification du montage...
[2025-06-21_17:05:53] [DEBUG] Ligne 183
[2025-06-21_17:05:53] [DEBUG] UUID vérifié: '35bb9ca2-2022-4dfa-a201-1a2dde7ce1aa'
[2025-06-21_17:05:39] [ERROR] Disque non reconnu ou éteint
[2025-06-21_17:05:39] [ERROR] UUID trouvé: ''
[2025-06-21_17:05:39] [ERROR] UUID attendu: '35bb9ca2-2022-4dfa-a201-1a2dde7ce1aa'
il y a un truc qui cloche
10mn plus tard nouvelle déconnection le disque n’est pas monté ????
le script en manuel - portable allumé et disque allumé (notifié non monté)
kubu@kubu-System-Product-Name:~$ /home/kubu/ScriptsVMImportants/ScriptSauvegardes.sh
[2025-06-21_17:41:14] [INFO] === DÉBUT DE LA SAUVEGARDE ===
[2025-06-21_17:41:14] [DEBUG] Répertoire des logs: /home/kubu/ScriptsVMImportants/log/backup-script
[2025-06-21_17:41:14] [DEBUG] Mode debug: 1
[2025-06-21_17:41:14] [DEBUG] Nettoyage des anciens logs (> 30 jours)
[2025-06-21_17:41:14] [INFO] Configuration:
[2025-06-21_17:41:14] [INFO] - Point de montage: /media/kubu/JEUX8T
[2025-06-21_17:41:14] [INFO] - UUID partition: 35bb9ca2-2022-4dfa-a201-1a2dde7ce1aa
[2025-06-21_17:41:14] [INFO] - Date: 2025-06-21_17h41
[2025-06-21_17:41:14] [DEBUG] Utilisateur: kubu
[2025-06-21_17:41:14] [INFO] Vérification du disque externe...
[2025-06-21_17:41:14] [DEBUG] UUID trouvé: '35bb9ca2-2022-4dfa-a201-1a2dde7ce1aa'
[2025-06-21_17:41:14] [DEBUG] UUID attendu: '35bb9ca2-2022-4dfa-a201-1a2dde7ce1aa'
[2025-06-21_17:41:14] [INFO] Disque correctement monté
réussite
ctrlID: '35bb9ca2-2022-4dfa-a201-1a2dde7ce1aa'
partition: '35bb9ca2-2022-4dfa-a201-1a2dde7ce1aa'
kdialog: Option inconnue "info".
QThreadStorage: entry 4 destroyed before end of thread 0x5e17d6b85f20
QThreadStorage: entry 3 destroyed before end of thread 0x5e17d6b85f20
[2025-06-21_17:41:14] [INFO] Affichage de la boîte de dialogue de sélection...
[2025-06-21_17:41:22] [INFO] Sélections utilisateur: 16
32
[2025-06-21_17:41:22] [INFO] === TRAITEMENT SAUVEGARDE 1 ===
[2025-06-21_17:41:22] [DEBUG] Valeur sélectionnée: 16
[2025-06-21_17:41:22] [INFO] Sauvegarde DocumentsEric sélectionnée
DocumentsEric
[2025-06-21_17:41:22] [INFO] Configuration sauvegarde DocumentsEric:
[2025-06-21_17:41:22] [INFO] - Source: kubu@192.168.1.128:/home/kubu/Documents
[2025-06-21_17:41:22] [INFO] - Destination: /home/kubu/VMMultimedias/VMSauvegardesDocuments/VMSauvegardesDocumentsEric/
[2025-06-21_17:41:22] [INFO] - Répertoire de sauvegarde: incremental-DocumentsEric/2025-06-21_17h41/
[2025-06-21_17:41:23] [DEBUG] Ping vers 192.168.1.128 réussi
[2025-06-21_17:41:23] [DEBUG] Test de connexion SSH vers kubu@192.168.1.128...
[2025-06-21_17:41:23] [ERROR] Connexion SSH vers kubu@192.168.1.128: ÉCHEC
[2025-06-21_17:41:23] [INFO] === TRAITEMENT SAUVEGARDE 2 ===
[2025-06-21_17:41:23] [DEBUG] Valeur sélectionnée: 32
[2025-06-21_17:41:23] [INFO] Sauvegarde DocumentsFanou sélectionnée
DocumentsFanou
[2025-06-21_17:41:23] [INFO] Configuration sauvegarde DocumentsFanou:
[2025-06-21_17:41:23] [INFO] - Source: Multimedias@192.168.1.60:/home/fanou/Documents
[2025-06-21_17:41:23] [INFO] - Destination: /home/fanou/VMMultimedias/VMSauvegardesDocuments/VMSauvegardesDocumentsFanou/
[2025-06-21_17:41:23] [INFO] - Répertoire de sauvegarde: incremental-DocumentsFanou/2025-06-21_17h41/
[2025-06-21_17:41:24] [DEBUG] Ping vers 192.168.1.60 réussi
[2025-06-21_17:41:24] [DEBUG] Test de connexion SSH vers Multimedias@192.168.1.60...
[2025-06-21_17:41:24] [ERROR] Connexion SSH vers Multimedias@192.168.1.60: ÉCHEC
[2025-06-21_17:41:24] [INFO] === RÉSUMÉ FINAL ===
[2025-06-21_17:41:24] [INFO] Sauvegardes traitées: 2
[2025-06-21_17:41:24] [INFO] Réussites: 0
[2025-06-21_17:41:24] [INFO] Échecs: 2
[2025-06-21_17:41:24] [WARNING] Certaines sauvegardes ont échoués. Consultez les logs.
[2025-06-21_17:49:49] [INFO] === FIN DE LA SAUVEGARDE ===
[2025-06-21_17:49:49] [INFO] Logs disponibles dans: /home/kubu/ScriptsVMImportants/log/backup-script
kubu@kubu-System-Product-Name:~$
backup
2025-06-21_17:41:14] [INFO] Configuration:
[2025-06-21_17:41:14] [INFO] - Point de montage: /media/kubu/JEUX8T
[2025-06-21_17:41:14] [INFO] - UUID partition: 35bb9ca2-2022-4dfa-a201-1a2dde7ce1aa
[2025-06-21_17:41:14] [INFO] - Date: 2025-06-21_17h41
[2025-06-21_17:41:14] [INFO] Vérification du disque externe...
[2025-06-21_17:41:14] [INFO] Disque correctement monté
[2025-06-21_17:41:14] [INFO] Affichage de la boîte de dialogue de sélection...
[2025-06-21_17:41:22] [INFO] Sélections utilisateur: 16
32
[2025-06-21_17:41:22] [INFO] === TRAITEMENT SAUVEGARDE 1 ===
[2025-06-21_17:41:22] [INFO] Sauvegarde DocumentsEric sélectionnée
[2025-06-21_17:41:22] [INFO] Configuration sauvegarde DocumentsEric:
[2025-06-21_17:41:22] [INFO] - Source: kubu@192.168.1.128:/home/kubu/Documents
[2025-06-21_17:41:22] [INFO] - Destination: /home/kubu/VMMultimedias/VMSauvegardesDocuments/VMSauvegardesDocumentsEric/
[2025-06-21_17:41:22] [INFO] - Répertoire de sauvegarde: incremental-DocumentsEric/2025-06-21_17h41/
[2025-06-21_17:41:23] [ERROR] Connexion SSH vers kubu@192.168.1.128: ÉCHEC
[2025-06-21_17:41:23] [INFO] === TRAITEMENT SAUVEGARDE 2 ===
[2025-06-21_17:41:23] [INFO] Sauvegarde DocumentsFanou sélectionnée
[2025-06-21_17:41:23] [INFO] Configuration sauvegarde DocumentsFanou:
[2025-06-21_17:41:23] [INFO] - Source: Multimedias@192.168.1.60:/home/fanou/Documents
[2025-06-21_17:41:23] [INFO] - Destination: /home/fanou/VMMultimedias/VMSauvegardesDocuments/VMSauvegardesDocumentsFanou/
[2025-06-21_17:41:23] [INFO] - Répertoire de sauvegarde: incremental-DocumentsFanou/2025-06-21_17h41/
[2025-06-21_17:41:24] [ERROR] Connexion SSH vers Multimedias@192.168.1.60: ÉCHEC
[2025-06-21_17:41:24] [INFO] === RÉSUMÉ FINAL ===
[2025-06-21_17:41:24] [INFO] Sauvegardes traitées: 2
[2025-06-21_17:41:24] [INFO] Réussites: 0
[2025-06-21_17:41:24] [INFO] Échecs: 2
[2025-06-21_17:41:24] [WARNING] Certaines sauvegardes ont échoués. Consultez les logs.
debug
2025-06-21_17:41:14] [DEBUG] Répertoire des logs: /home/kubu/ScriptsVMImportants/log/backup-script
[2025-06-21_17:41:14] [DEBUG] Mode debug: 1
[2025-06-21_17:41:14] [DEBUG] Nettoyage des anciens logs (> 30 jours)
[2025-06-21_17:41:14] [DEBUG] Utilisateur: kubu
[2025-06-21_17:41:14] [DEBUG] UUID trouvé: '35bb9ca2-2022-4dfa-a201-1a2dde7ce1aa'
[2025-06-21_17:41:14] [DEBUG] UUID attendu: '35bb9ca2-2022-4dfa-a201-1a2dde7ce1aa'
[2025-06-21_17:41:22] [DEBUG] Valeur sélectionnée: 16
[2025-06-21_17:41:23] [DEBUG] Ping vers 192.168.1.128 réussi
[2025-06-21_17:41:23] [DEBUG] Test de connexion SSH vers kubu@192.168.1.128...
[2025-06-21_17:41:23] [DEBUG] Valeur sélectionnée: 32
[2025-06-21_17:41:24] [DEBUG] Ping vers 192.168.1.60 réussi
[2025-06-21_17:41:24] [DEBUG] Test de connexion SSH vers Multimedias@192.168.1.60...
error
[2025-06-21_17:41:23] [ERROR] Connexion SSH vers kubu@192.168.1.128: ÉCHEC
[2025-06-21_17:41:24] [ERROR] Connexion SSH vers Multimedias@192.168.1.60: ÉCHEC
je suppose qu’il faut que je change tous les destinations du script ???
Kubuntu 25.04 wayland Plasma 6.3.4 KDE Qt 6.12.0 noyau 6.14.0-15 Asus B760+D4 i5-12400F 4.4Ghz DDR4 32Go nvidia RTX 3060 12GB
Utilisez les drivers libres avant d’ installer une brother avec le script de demonipuch
J’utilise le clavier french AFNOR
Hors ligne
#230 Le 21/06/2025, à 19:39
- steph810
Re : script d’automatisation sauvegardes
j'ai mal au doigts
j'ai une version mais ca risque de piquer les yeux dite moi si tu la veux overhead du script ~30 secondes
compatible ssh et sshfs
plus de problème variable toutes en haut ect... ect ....
Hors ligne
#231 Le 21/06/2025, à 19:48
- iznobe
Re : script d’automatisation sauvegardes
En fait , pour le moment , on a 2 choses distinctes .
le fstab e le montage d' un coté , le script de l' autre .
ces 2 choses sont independantes .
je m' occupe plutot de la partie fstab / montage dans un 1er temps .
ce n' est pas normal que tu obtiennes :
kubu@kubu-System-Product-Name:~$ grep sshfs /etc/mtab
fanou@192.168.1.60:/home/fanou/Documents /home/kubu/fanou fuse.sshfs rw,nosuid,nodev,noexec,noatime,user_id=0,group_id=0,default_permissions,allow_other 0 0
kubu@kubu-System-Product-Name:~$
apres un redemarrage de l' ordi avec les lignes inscrites dans le fstab .
les 2 montages devraient etre operationnel .
comme ce n' est pas le cas , ( pour la VM du moins ) montre :
sudo journalctl | grep Multimedias
sudo mount -av
---------------------------------------
les chemins ( quels qu ils soient ) n ' impacte pas le contrôle de la connexion ssh du script .
je n' ai pas regardé / testé le script .
Dernière modification par iznobe (Le 21/06/2025, à 19:53)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#232 Le 21/06/2025, à 20:03
- steph810
Re : script d’automatisation sauvegardes
En fait , pour le moment , on a 2 choses distinctes .
le fstab e le montage d' un coté , le script de l' autre .
ces 2 choses sont independantes .je m' occupe plutot de la partie fstab / montage [/
les chemins ( quels qu ils soient ) n ' impacte pas le contrôle de la connexion ssh du script .
je n' ai pas regardé / testé le script .
je pense avec ce que l'on as ce devrais ressembler a ceci ?
UUID=35bb9ca2-2022-4dfa-a201-1a2dde7ce1aa /media/kubu/JEUX8T ext4 defaults,nofail,x-systemd.automount 0 0
Le script ben la maintenant s'il y a erreur avec les logs ont passeras plus a coté
!! NE TOUCHE A RIEN DE L.6 à L.28 sera mise a jours automatiquement en fonction de l'execution des logs.
L.29 à 103 : contrôle les chemins je me suis baser sur les précédent post mais j'ai peut zappé quelques uns.
Ajouts:
Mode debogage info comme avant.
Le type de connexion SSHFS par defaut ou SSH rsync.
La journalisation active ou pas très détaillé.
Log:
REPERTOIRE_JOURNAUX="$HOME/log/backup-script"
backup, error, et debug dans backup-script
description précise des erreurs que ce soit dans les logs ou en ligne de commandes
Si un problème se réferer au logs.
exetera ect.....
il semble plus lourd mais n'impacte en rien sa vitesse d'execution si ce n'est la journalisation mais ça reste quelques secondes.
La première sauvegarde est tous plus longues comme vous devez le savoir, ensuite il compare avec les fichiers existants, donc plus rapide.
#!/bin/bash
### Script de base geole largement modifié par iznobe, Watael et steph810 pour la partie debug de remplacement (plus simple). Merci à eux.
### Voir https://forum.kubuntu-fr.org/viewtopic.php?id=2091380&p=5
### Modifier les 2 premières variables des #paramètres (ligne 72) du script suivant vos emplacements disque et UUID.
#===============================================================
# Sauvegarde des données
# Auteur : enRIKO ^^ =)
# Date : 2025-06-21
# Version : 4.6 (Fonctionnalités avancées)
# Description : Script de sauvegarde incrémentale des fichiers
# personnels et de configuration sur un disque externe.
# Gère les sauvegardes locales et distantes via SSH/rsync et SSHFS,
# incluant la gestion des répertoires de sauvegarde incrémentiels.
# Comprend des options pour l'exécution autonome, la journalisation détaillée,
# le verrouillage pour éviter les exécutions multiples, et la gestion robuste des erreurs.
#
# Log :
# 2024-06-01 : Création du script initial
# 2024-06-05 : Ajout des fonctions de vérification de disque et d'espace
# 2024-06-10 : Implémentation du verrouillage pour éviter les exécutions multiples
# 2024-06-15 : Intégration de rsync pour les sauvegardes incrémentales
# 2024-06-20 : Amélioration de la gestion des erreurs et des logs
# 2024-06-21 : Ajout des options de démarrage configurables (DEBUG, SSHFS, Désactivation logs)
# 2025-06-21 : Adaptation pour exécution autonome (suppression kdialog),
# ajout exemple sauvegarde serveur, raffinement description et logs.
# **Implémentation complète des fonctionnalités avancées + Renommage des variables clés en français.**
#===============================================================
# --- Options de Démarrage du Script (pour exécution autonome) ---
# Ces options sont configurées pour une exécution sans interaction utilisateur (pas de kdialog).
# Modifiez-les à '1' (activé) ou '0' (désactivé) selon vos préférences.
# Mode de journalisation détaillé (MODE_DEBOGAGE)
# 0: Désactivé (moins de messages de journal, recommandé pour l'automatisation)
# 1: Activé (plus de messages de journal pour le diagnostic)
MODE_DEBOGAGE=0
# Mode de connexion distante (TYPE_CONNEXION_DISTANTE)
# 0: SSHFS par défaut (montage du répertoire distant) - Recommandé pour des arborescences complexes.
# 1: SSH Direct par défaut (rsync via SSH sans montage préalable) - Plus simple pour des sources directes.
TYPE_CONNEXION_DISTANTE=0
# Désactivation complète de tous les journaux (JOURNAUX_DESACTIVES)
# 0: Journaux activés (recommandé pour le dépannage et le suivi de l'exécution)
# 1: Tous les journaux désactivés (FORTEMENT DÉCONSEILLÉ en production, aucune trace en cas de problème)
JOURNAUX_DESACTIVES=0
# --- Fin des Options de Démarrage ---
# --- Variables de Configuration Globales ---
# IMPORTANT : Adaptez ces variables à votre environnement !
# Informations de connexion pour les machines distantes
ipVM="192.168.1.128" # IP de votre machine virtuelle ou serveur VM
userVM="Multimedias" # Nom d'utilisateur sur la VM
ipPortable="192.168.1.60" # IP de votre ordinateur portable
userPortable="fanou" # Nom d'utilisateur sur le portable
userLocal="kubu" # Votre nom d'utilisateur local sur la machine qui exécute le script
ipServeur="192.168.1.100" # Exemple: IP de votre serveur de projets
userServeur="devUser" # Exemple: Nom d'utilisateur sur le serveur de projets
# Configuration des répertoires de journaux
REPERTOIRE_JOURNAUX="$HOME/log/backup-script"
FICHIER_JOURNAL_PRINCIPAL="$REPERTOIRE_JOURNAUX/backup_$(date +%Y%m%d_%H%M).log"
FICHIER_DEBOGAGE="$REPERTOIRE_JOURNAUX/debug_$(date +%Y%m%d_%H%M).log"
FICHIER_ERREURS="$REPERTOIRE_JOURNAUX/error_$(date +%Y%m%d_%H%M).log"
# Paramètres du disque de sauvegarde externe
PointMontageDisque="/media/$USER/JEUX8T" # Point de montage de votre disque externe
UUID_Partition="35bb9ca2-2022-4dfa-a201-1a2dde7ce1aa" # UUID de la partition de votre disque externe
ESPACE_DISQUE_MIN_GO=50 # Espace disque minimum requis pour la destination (en Go)
# Répertoire de base pour les montages SSHFS temporaires
BASE_MONTAGE_SSHFS="/tmp/sshfs_backups"
# Chemins des sources distantes (sur VM, Portable, Serveur) - CENTRALISÉES
SOURCE_VM_PHOTOS="/home/$userVM/MultimediasCommuns/Photos"
SOURCE_VM_IMAGES="/home/$userVM/MultimediasCommuns/Images"
SOURCE_VM_MUSIQUES="/home/$userVM/MultimediasCommuns/Musiques"
SOURCE_VM_DOCS_COMMUNS="/home/$userVM/DocumentsPartages"
SOURCE_PORTABLE_DOCS="/home/$userPortable/Documents"
SOURCE_LOCAL_DOCS_ERIC="/home/$userLocal/Documents" # Ajout de la source locale pour le cas composite
SOURCE_SERVEUR_PROJETS="/home/$userServeur/MesProjets" # Exemple: Source sur le serveur de projets
# Chemins des points de montage SSHFS locaux - CENTRALISÉES
MONTAGE_SSHFS_PHOTOS="$BASE_MONTAGE_SSHFS/photos_vm"
MONTAGE_SSHFS_IMAGES="$BASE_MONTAGE_SSHFS/images_vm"
MONTAGE_SSHFS_MUSIQUES="$BASE_MONTAGE_SSHFS/musiques_vm"
MONTAGE_SSHFS_DOCS_COMMUNS="$BASE_MONTAGE_SSHFS/docs_communs_vm"
MONTAGE_SSHFS_DOCS_PORTABLE="$BASE_MONTAGE_SSHFS/docs_fanou_portable"
MONTAGE_SSHFS_PROJETS="$BASE_MONTAGE_SSHFS/projets_serveur" # Exemple: Point de montage pour les projets du serveur
# Chemins de destination des sauvegardes - CENTRALISÉES
DEST_BASE_SAUVEGARDES="$PointMontageDisque/SAUVEGARDES/"
DEST_LOCAL_DOCS_ERIC="$PointMontageDisque/SAUVEGARDES/SauvegardesDocumentsEric/"
DEST_LOCAL_DOCS_FANOU="$PointMontageDisque/SAUVEGARDES/SauvegardesDocumentsFanou/"
DEST_BASE_DOCS_COMMUNS="$PointMontageDisque/SAUVEGARDES/SauvegardesDocumentsCommuns/"
DEST_BASE_PROJETS="$PointMontageDisque/SAUVEGARDES/SauvegardesProjetsServeur/" # Exemple: Destination pour les projets du serveur
# Fichier de verrou pour éviter les exécutions multiples
FICHIER_VERROU="/tmp/backup_script.lock"
# --- Fin des Variables de Configuration Globales ---
# --- Fonctions de Journalisation ---
log_info() {
if [ "$JOURNAUX_DESACTIVES" -eq 1 ]; then return; fi # Sortir si les journaux sont désactivés
local message="$1"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$timestamp] [INFO] $message" | tee -a "$FICHIER_JOURNAL_PRINCIPAL"
}
log_error() {
if [ "$JOURNAUX_DESACTIVES" -eq 1 ]; then return; fi # Sortir si les journaux sont désactivés
local message="$1"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$timestamp] [ERREUR] $message" | tee -a "$FICHIER_JOURNAL_PRINCIPAL" | tee -a "$FICHIER_ERREURS"
}
log_debug() {
if [ "$JOURNAUX_DESACTIVES" -eq 1 ]; then return; fi # Sortir si les journaux sont désactivés
local message="$1"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
if [ "$MODE_DEBOGAGE" -eq 1 ]; then
echo "[$timestamp] [DEBOGAGE] $message" | tee -a "$FICHIER_DEBOGAGE"
fi
}
log_warning() {
if [ "$JOURNAUX_DESACTIVES" -eq 1 ]; then return; fi # Sortir si les journaux sont désactivés
local message="$1"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$timestamp] [AVERTISSEMENT] $message" | tee -a "$FICHIER_JOURNAL_PRINCIPAL"
}
# --- Fonctions utilitaires et de vérification ---
# Nettoie les fichiers de journal plus anciens que 30 jours
nettoyer_anciens_journaux() {
log_debug "Nettoyage des anciens journaux (> 30 jours) dans $REPERTOIRE_JOURNAUX"
find "$REPERTOIRE_JOURNAUX" -name "*.log" -type f -mtime +30 -delete 2>/dev/null
if [ $? -ne 0 ]; then
log_warning "Problème lors du nettoyage des anciens journaux. Vérifiez les permissions de $REPERTOIRE_JOURNAUX."
fi
}
# Fonction pour obtenir l'UUID du disque monté
obtenir_uuid_disque() {
local uuid=$(findmnt -n --output UUID "$PointMontageDisque" 2>/dev/null)
echo "$uuid"
}
# Vérifie que les dépendances nécessaires sont installées
verifier_dependances() {
log_info "Vérification des dépendances..."
local dependances_manquantes=()
command -v sshfs >/dev/null || dependances_manquantes+=("sshfs")
command -v flock >/dev/null || dependances_manquantes+=("flock")
command -v rsync >/dev/null || dependances_manquantes+=("rsync")
if [ ${#dependances_manquantes[@]} -gt 0 ]; then
log_error "Dépendances manquantes: ${dependances_manquantes[*]}"
liberer_verrou # S'assurer que le verrou est libéré avant de quitter
exit 1
fi
log_info "Toutes les dépendances requises sont présentes."
}
# Effectue un simple test ping vers une adresse IP
tester_ping() {
local ip="$1"
log_debug "Test de ping vers $ip..."
if ping -c 2 -W 2 "$ip" >/dev/null 2>&1; then
log_debug "Ping vers $ip réussi."
return 0
else
log_warning "Ping vers $ip échoué."
return 1
fi
}
# Teste une connexion SSH
tester_ssh() {
local user="$1"
local ip="$2"
log_debug "Test de connexion SSH vers $user@$ip..."
if timeout 15 ssh -o ConnectTimeout=10 -o BatchMode=yes "$user@$ip" exit 2>/dev/null; then
log_info "Connexion SSH vers $user@$ip: OK."
return 0
else
log_error "Connexion SSH vers $user@$ip: ÉCHEC."
log_error "Vérifiez l'IP, le nom d'utilisateur, le réseau, ou l'état du service SSH sur l'hôte distant."
return 1
fi
}
# Tente une authentification SSH par clé (pour informer, ne bloque pas si échec)
tester_cle_ssh() {
local user="$1"
local ip="$2"
log_debug "Test de validation de la clé SSH pour $user@$ip..."
local cle_ssh_trouvee=0
for key_type in rsa ed25519 ecdsa dsa; do
if [ -f "$HOME/.ssh/id_$key_type" ] || [ -f "$HOME/.ssh/id_$key_type.pub" ]; then
log_debug "Clé SSH $key_type trouvée localement."
cle_ssh_trouvee=1
break
fi
done
if [ $cle_ssh_trouvee -eq 0 ]; then
log_warning "Aucune clé SSH trouvée dans $HOME/.ssh/. L'authentification par clé pourrait échouer."
return 1
else
log_debug "Test de connexion avec clé SSH vers $user@$ip (sans mot de passe)..."
if timeout 10 ssh -o ConnectTimeout=8 -o BatchMode=yes -o PasswordAuthentication=no -o PubkeyAuthentication=yes "$user@$ip" exit 2>/dev/null; then
log_info "Authentification par clé SSH vers $user@$ip: OK."
return 0
else
log_warning "Authentification par clé SSH vers $user@$ip: ÉCHEC."
log_warning "La clé SSH n'est peut-être pas configurée ou acceptée sur le serveur distant."
return 1
fi
fi
}
# Combine ping et test SSH pour une vérification complète de la joignabilité de l'hôte
verifier_joignabilite_hote() {
local user="$1"
local ip="$2"
log_info "Vérification de la joignabilité de l'hôte distant $user@$ip..."
if ! tester_ping "$ip"; then
log_error "Hôte $ip non joignable (ping échoué)."
return 1
fi
if ! tester_ssh "$user" "$ip"; then
log_error "Connexion SSH à $user@$ip impossible."
return 1
fi
log_info "Hôte $user@$ip est joignable et SSH fonctionne."
return 0
}
# Monte un répertoire distant via SSHFS
monter_sshfs() {
local user="$1"
local ip="$2"
local remote_path="$3"
local local_mount_point="$4"
log_info "Tentative de montage SSHFS de $user@$ip:$remote_path vers $local_mount_point"
mkdir -p "$local_mount_point" || { log_error "Impossible de créer le point de montage local: $local_mount_point"; return 1; }
# S'assurer qu'il n'y a pas un montage orphelin avant de monter
fusermount -uz "$local_mount_point" 2>/dev/null
if sshfs -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3 "$user@$ip:$remote_path" "$local_mount_point" >> "$FICHIER_JOURNAL_PRINCIPAL" 2>> "$FICHIER_ERREURS"; then
log_info "Montage SSHFS de $user@$ip:$remote_path réussi sur $local_mount_point."
return 0
else
local sshfs_error_output=$(tail -n 1 "$FICHIER_ERREURS")
local interpreted_sshfs_error=$(interpreter_erreur_sshfs "$sshfs_error_output")
log_error "Échec du montage SSHFS de $user@$ip:$remote_path vers $local_mount_point."
log_error "Détails montage SSHFS: $interpreted_sshfs_error"
return 1
fi
}
# Démonte un point SSHFS
demonter_sshfs() {
local local_mount_point="$1"
if mountpoint -q "$local_mount_point"; then
log_info "Tentative de démontage SSHFS de $local_mount_point..."
if fusermount -uz "$local_mount_point" >> "$FICHIER_JOURNAL_PRINCIPAL" 2>> "$FICHIER_ERREURS"; then
log_info "Démontage SSHFS de $local_mount_point réussi."
rmdir "$local_mount_point" 2>/dev/null || log_debug "Impossible de supprimer le répertoire $local_mount_point (peut-être non vide)."
return 0
else
local umount_error_output=$(tail -n 1 "$FICHIER_ERREURS")
local interpreted_umount_error=$(interpreter_erreur_sshfs "$umount_error_output")
log_error "Échec du démontage SSHFS de $local_mount_point."
log_error "Détails démontage SSHFS: $interpreted_umount_error"
return 1
fi
else
log_debug "Point de montage $local_mount_point n'est pas monté ou n'existe pas, pas de démontage nécessaire."
return 0
fi
}
# Vérifie l'espace disque disponible sur une partition
verifier_espace_disque() {
local path="$1"
local min_gb="$2"
log_debug "Vérification de l'espace disque sur $path. Minimum requis: ${min_gb}GB."
if [ ! -d "$path" ]; then
log_warning "Le chemin $path n'existe pas, impossible de vérifier l'espace disque."
# Tenter de créer le répertoire si c'est une destination de sauvegarde pour pouvoir vérifier l'espace
if mkdir -p "$path" 2>/dev/null; then
log_info "Répertoire '$path' créé. Nouvelle tentative de vérification de l'espace."
else
log_error "Impossible de créer le répertoire '$path' ou de vérifier l'espace. Vérifiez les permissions."
return 1
fi
fi
local available_gb=$(df -BG "$path" | awk 'NR==2 {print $4}' | sed 's/G//')
if [ -z "$available_gb" ]; then
log_error "Impossible de récupérer l'espace disque disponible pour $path."
return 1
fi
log_debug "Espace disponible sur $path: ${available_gb}GB."
if (( available_gb < min_gb )); then
log_error "Espace disque insuffisant sur $path. Disponible: ${available_gb}GB, Requis: ${min_gb}GB."
return 1
fi
log_info "Espace disque suffisant sur $path."
return 0
}
# Vérifie les permissions d'écriture du répertoire de destination
verifier_permissions_ecriture() {
local dest_path="$1"
log_debug "Vérification des permissions d'écriture pour $dest_path..."
if [ ! -d "$dest_path" ]; then
log_warning "Le répertoire de destination '$dest_path' n'existe pas. Tentative de création."
if ! mkdir -p "$dest_path" 2>/dev/null; then
log_error "Impossible de créer le répertoire de destination '$dest_path'. Vérifiez les permissions parentes."
return 1
fi
fi
if [ ! -w "$dest_path" ]; then
log_error "Le script n'a pas les permissions d'écriture dans le répertoire de destination : $dest_path"
return 1
fi
log_debug "Permissions d'écriture OK pour $dest_path."
return 0
}
# Gère l'acquisition d'un verrou pour éviter les exécutions multiples
acquerir_verrou() {
log_debug "Tentative d'acquisition du verrou: $FICHIER_VERROU"
exec 200>"$FICHIER_VERROU"
if ! flock -n 200; then
log_error "Une autre instance du script est déjà en cours d'exécution. Abandon."
exit 1
fi
log_info "Verrou acquis avec succès."
}
# Libère le verrou
liberer_verrou() {
log_debug "Libération du verrou: $FICHIER_VERROU"
# Vérifie si le descripteur de fichier 200 est ouvert avant de le fermer
if command -v lsof >/dev/null && lsof -p $$ -d 200 >/dev/null 2>&1; then
flock -u 200
exec 200>&-
fi
rm -f "$FICHIER_VERROU" 2>/dev/null
log_info "Verrou libéré."
}
# Fonction pour interpréter les codes d'erreur Rsync
interpreter_erreur_rsync() {
local exit_code="$1"
local rsync_output="$2"
local description=""
local suggestion=""
case "$exit_code" in
0) description="Succès"; suggestion="Aucune action requise.";;
1) description="Erreur de syntaxe ou d'utilisation"; suggestion="Vérifiez la commande rsync et ses arguments.";;
2) description="Incompatibilité de protocole"; suggestion="Mettez à jour rsync sur les deux machines.";;
3) description="Erreurs dans la sélection des fichiers/IO"; suggestion="Vérifiez les chemins source/destination et les permissions.";;
4) description="Erreur de système dans l'exécution locale"; suggestion="Problème interne au système, vérifiez les ressources.";;
5) description="Erreur de système dans l'exécution distante (serveur)"; suggestion="Problème sur le serveur distant, vérifiez ses journaux.";;
6) description="Erreur du démon rsync"; suggestion="Problème avec le service rsync sur le serveur distant.";;
10) description="Erreur dans la socket/IO"; suggestion="Problème réseau ou de connexion SSH.";;
11) description="Erreur de la base de données de fichiers"; suggestion="Problème de lecture/écriture de fichiers, vérifiez l'intégrité.";;
12) description="Erreur de démarrage du démon/shell distant"; suggestion="Problème de configuration SSH ou du shell distant.";;
13) description="Erreur lors de la connexion au démon SSH/ distant"; suggestion="Problème de connexion SSH, vérifiez vos clés/passwords.";;
14) description="Code de sortie de la commande ssh/shell distante"; suggestion="Erreur spécifique à SSH ou au shell distant. Vérifiez les journaux SSH.";;
20) description="Erreur de traitement ('daemon died')"; suggestion="Le processus rsync distant s'est terminé inopinément. Problème de ressources ou de configuration.";;
21) description="Erreur d'allocation de mémoire"; suggestion="Le système manque de mémoire. Tentez de libérer des ressources.";;
22) description="Erreur lors de la tentative de correspondance de 'exclude/include'"; suggestion="Vérifiez vos filtres rsync (exclude/include).";;
23) description="Transfert partiel en raison d'une erreur"; suggestion="**Très courant.** Un fichier n'a pas pu être transféré. Vérifiez les permissions, l'espace disque (source/destination) ou si des fichiers sont ouverts.";;
24) description="Transfert partiel en raison de fichiers manquants"; suggestion="**Très courant.** Des fichiers source ont disparu pendant le transfert. Vérifiez l'intégrité de la source.";;
25) description="La classe Rsync a été mise en pause (SIGSTOP)"; suggestion="Processus suspendu puis tué. Rare en automatisation.";;
30) description="Timeout sur la réception de données"; suggestion="La connexion a été trop lente ou interrompue. Vérifiez la stabilité réseau.";;
*) description="Erreur inconnue"; suggestion="Consultez la documentation de rsync pour le code $exit_code ou le fichier d'erreur Rsync.";;
esac
echo "Description: $description (Code $exit_code)"
echo "Suggestion: $suggestion"
if [ -n "$rsync_output" ]; then
echo "Messages Rsync bruts: $rsync_output"
fi
}
# Fonction pour interpréter les erreurs SSHFS
interpreter_erreur_sshfs() {
local error_message="$1"
local description=""
local suggestion=""
if echo "$error_message" | grep -qi "Host key verification failed"; then
description="Échec de vérification de la clé d'hôte SSH."
suggestion="Supprimez l'entrée du serveur dans ~/.ssh/known_hosts ou ajoutez la bonne clé."
elif echo "$error_message" | grep -qi "Permission denied"; then
description="Permissions insuffisantes pour la connexion SSH ou le chemin distant."
suggestion="Vérifiez les permissions de votre clé SSH, le 'authorized_keys' sur le serveur, ou les permissions du dossier distant."
elif echo "$error_message" | grep -qi "Connection timed out" || echo "$error_message" | grep -qi "No route to host" || echo "$error_message" | grep -qi "Network is unreachable"; then
description="Problème de connectivité réseau."
suggestion="Vérifiez que l'hôte distant est allumé et accessible (ping, câbles)."
elif echo "$error_message" | grep -qi "fusermount: failed to unmount"; then
description="Impossible de démonter le point SSHFS. Il peut être utilisé ou bloqué."
suggestion="Fermez les applications utilisant le point de montage ou essayez un démontage manuel ('fusermount -uz <point>')."
elif echo "$error_message" | grep -qi "remote host has disconnected"; then
description="L'hôte distant a déconnecté la session SSH."
suggestion="Problème réseau intermittent ou le serveur distant a fermé la connexion."
elif echo "$error_message" | grep -qi "bad configuration option"; then
description="Option de configuration SSHFS non valide."
suggestion="Vérifiez les options de montage dans le script."
else
description="Erreur SSHFS générique ou inconnue."
suggestion="Consultez les journaux pour plus de détails ou la documentation SSHFS. Message original: '$error_message'"
fi
echo "Description: $description"
echo "Suggestion: $suggestion"
}
# Fonction de nettoyage des montages SSHFS orphelins au démarrage
nettoyer_montages_sshfs_orphelins() {
log_info "Recherche et nettoyage des montages SSHFS orphelins sous $BASE_MONTAGE_SSHFS..."
mkdir -p "$BASE_MONTAGE_SSHFS"
findmnt -n -t fuse.sshfs -o TARGET | grep "^$BASE_MONTAGE_SSHFS/" | while read -r mount_point; do
if mountpoint -q "$mount_point"; then
log_warning "Montage SSHFS orphelin trouvé : $mount_point. Tentative de démontage..."
if fusermount -uz "$mount_point" 2>/dev/null; then
log_info "Démontage orphelin de $mount_point réussi."
rmdir "$mount_point" 2>/dev/null
else
local umount_error=$(tail -n 1 "$FICHIER_ERREURS")
local interpreted_error=$(interpreter_erreur_sshfs "$umount_error")
log_error "Échec du démontage orphelin de $mount_point."
log_error "Détails démontage: $interpreted_error"
fi
else
rmdir "$mount_point" 2>/dev/null || log_debug "Le répertoire $mount_point n'est pas vide ou n'a pas pu être supprimé."
fi
done
log_info "Nettoyage des montages SSHFS orphelins terminé."
}
# Fonction pour démonter tous les SSHFS à la sortie du script (utilisée par trap)
demonter_tous_les_sshfs_a_la_sortie() {
log_debug "Exécution de la fonction de démontage de tous les SSHFS à la sortie."
if [ -d "$BASE_MONTAGE_SSHFS" ]; then
for mount_dir in "$BASE_MONTAGE_SSHFS"/*; do
if [ -d "$mount_dir" ]; then
demonter_sshfs "$mount_dir"
fi
done
rmdir "$BASE_MONTAGE_SSHFS" 2>/dev/null || log_debug "Le répertoire BASE_MONTAGE_SSHFS n'est pas vide ou n'a pas pu être supprimé."
fi
}
# --- Exécution du script ---
# Préparation de l'environnement de journalisation
mkdir -pv "$REPERTOIRE_JOURNAUX"
nettoyer_anciens_journaux
# Nettoyage préventif des montages SSHFS orphelins
nettoyer_montages_sshfs_orphelins
# Gestion des erreurs et interruptions du script
trap 'log_error "Script interrompu par signal ou erreur inattendue. Tentative de nettoyage..."; liberer_verrou; demonter_tous_les_sshfs_a_la_sortie; exit 1' ERR INT TERM
# Vérification des dépendances logicielles
verifier_dependances
# Acquisition du verrou pour éviter les exécutions multiples
acquerir_verrou
log_info "=== DÉBUT DE LA SAUVEGARDE ==="
current_date=$(date +%F_%Hh%M)
log_info "Configuration actuelle:"
log_info " - Point de montage du disque externe: $PointMontageDisque"
log_info " - UUID partition attendu: $UUID_Partition"
log_info " - Date de la sauvegarde: $current_date"
log_debug "Utilisateur local exécutant le script: $USER"
# Contrôle de validité du disque externe (montage et UUID)
log_info "Vérification du disque externe..."
UUID_Actuel=$(obtenir_uuid_disque)
if [[ "$UUID_Actuel" != "$UUID_Partition" ]]; then
log_error "Disque non reconnu ou éteint."
log_error "UUID trouvé: '$UUID_Actuel'"
log_error "UUID attendu: '$UUID_Partition'"
log_info "Attente du montage du disque externe..."
# Boucle de détection du disque avec timeout
attempt=1
while [[ "$UUID_Actuel" != "$UUID_Partition" ]]; do
log_debug "Tentative $attempt - Vérification du montage..."
sleep 3
UUID_Actuel=$(obtenir_uuid_disque)
log_debug "UUID vérifié: '$UUID_Actuel'"
((attempt++))
if [ $attempt -gt 40 ]; then # Environ 2 minutes de tentatives
log_error "Timeout: Disque non monté après $(($attempt-1)) tentatives. Script annulé."
liberer_verrou
exit 1
fi
done
log_info "Disque monté avec succès après $((attempt-1)) tentatives."
else
log_info "Disque correctement monté et reconnu."
fi
# Vérifier l'espace disque global sur la destination principale (disque externe)
if ! verifier_espace_disque "$PointMontageDisque" "$ESPACE_DISQUE_MIN_GO"; then
log_error "Espace disque insuffisant sur le disque de sauvegarde externe. Le script s'arrête."
liberer_verrou
exit 1
fi
# --- Sélection des sauvegardes pour l'exécution autonome ---
# Définissez ici les numéros des sauvegardes que vous voulez exécuter.
# Chaque numéro correspond à une sauvegarde spécifique définie dans le 'case' ci-dessous.
# Ex: "1 2" pour Photos et Images VM
# Ex: "1 2 4 8 16 32" pour toutes les sauvegardes disponibles.
log_info "Sauvegardes pré-sélectionnées pour exécution automatique."
SELECTIONS_SAUVEGARDES="1 2 16" # <-- MODIFIEZ CETTE LIGNE AVEC LES NUMÉROS DES SAUVEGARDES QUE VOUS SOUHAITEZ EXÉCUTER AUTOMATIQUEMENT.
if [ -z "$SELECTIONS_SAUVEGARDES" ]; then
log_warning "Aucune sauvegarde sélectionnée pour l'exécution automatique. Script terminé."
liberer_verrou
exit 0
fi
# --- Fin de la sélection des sauvegardes ---
log_info "Sélections pour exécution: $SELECTIONS_SAUVEGARDES"
nombre_sauvegardes=0
sauvegardes_reussies=0
sauvegardes_echouees=0
declare -A cache_joignabilite_hote
# Créer le répertoire .rsync-partial global si ce n'est pas déjà fait
mkdir -p "$DEST_BASE_SAUVEGARDES/.rsync-partial" || { log_error "Impossible de créer le répertoire .rsync-partial global"; liberer_verrou; exit 1; }
for i in $SELECTIONS_SAUVEGARDES; do
nombre_sauvegardes=$((nombre_sauvegardes + 1))
log_info "=== TRAITEMENT SAUVEGARDE $nombre_sauvegardes ==="
log_debug "Valeur sélectionnée: $i"
local_sshfs_mount_point=""
remote_user=""
remote_ip=""
remote_source_path=""
rsync_source=""
rsync_destination=""
rsync_ssh_option=""
backup_dir_suffix=""
nom_sauvegarde=""
est_sauvegarde_distante=0
case $i in
1) # Photos (VM)
nom_sauvegarde="Photos (VM)"
remote_user="$userVM"
remote_ip="$ipVM"
remote_source_path="$SOURCE_VM_PHOTOS"
local_sshfs_mount_point="$MONTAGE_SSHFS_PHOTOS"
rsync_destination="$DEST_BASE_SAUVEGARDES"
backup_dir_suffix="incremental-Photos/$current_date/"
est_sauvegarde_distante=1
;;
2) # Images (VM)
nom_sauvegarde="Images (VM)"
remote_user="$userVM"
remote_ip="$ipVM"
remote_source_path="$SOURCE_VM_IMAGES"
local_sshfs_mount_point="$MONTAGE_SSHFS_IMAGES"
rsync_destination="$DEST_BASE_SAUVEGARDES"
backup_dir_suffix="incremental-Images/$current_date/"
est_sauvegarde_distante=1
;;
4) # Musiques (VM)
nom_sauvegarde="Musiques (VM)"
remote_user="$userVM"
remote_ip="$ipVM"
remote_source_path="$SOURCE_VM_MUSIQUES"
local_sshfs_mount_point="$MONTAGE_SSHFS_MUSIQUES"
rsync_destination="$DEST_BASE_SAUVEGARDES"
backup_dir_suffix="incremental-Musiques/$current_date/"
est_sauvegarde_distante=1
;;
8) # Documents Communs (VM)
nom_sauvegarde="Documents Communs (VM)"
remote_user="$userVM"
remote_ip="$ipVM"
remote_source_path="$SOURCE_VM_DOCS_COMMUNS"
local_sshfs_mount_point="$MONTAGE_SSHFS_DOCS_COMMUNS"
rsync_destination="$DEST_BASE_DOCS_COMMUNS"
backup_dir_suffix="incremental-DocumentsPartages/$current_date/"
est_sauvegarde_distante=1
;;
16) # Sauvegarde Documents Eric (Local) & Fanou (Distant) - CAS COMPOSITE
# Partie 1 : Sauvegarde locale des Documents de Eric
log_info "Début de la sauvegarde locale des Documents de $userLocal..."
local_eric_source="$SOURCE_LOCAL_DOCS_ERIC"
local_eric_destination="$DEST_LOCAL_DOCS_ERIC"
local_eric_backup_dir="incremental-DocumentsEric/$current_date/"
if ! verifier_espace_disque "$local_eric_destination" "$ESPACE_DISQUE_MIN_GO"; then
log_error "Espace disque insuffisant pour la sauvegarde locale Documents $userLocal. Cette partie est ignorée."
elif ! verifier_permissions_ecriture "$local_eric_destination"; then
log_error "Permissions d'écriture insuffisantes pour la sauvegarde locale Documents $userLocal. Cette partie est ignorée."
else
log_info "Démarrage Rsync pour Documents Eric (Local)..."
local rsync_local_eric_error_output=""
if ! rsync --progress -a -v --delete-after \
--partial --partial-dir="$local_eric_destination/.rsync-partial" \
"$local_eric_source"/ "$local_eric_destination" \
--backup --backup-dir="$local_eric_destination/$local_eric_backup_dir" \
>> "$FICHIER_JOURNAL_PRINCIPAL" 2> >(tee -a "$FICHIER_ERREURS" >&2; rsync_local_eric_error_output=$(cat -))
then
local rsync_eric_exit_code=$?
local interpreted_eric_error=$(interpreter_erreur_rsync "$rsync_eric_exit_code" "$rsync_local_eric_error_output")
log_error "Échec de la sauvegarde locale Documents $userLocal."
log_error "Détails Rsync: $interpreted_eric_error"
sauvegardes_echouees=$((sauvegardes_echouees + 1))
else
log_info "Sauvegarde locale Documents $userLocal réussie."
sauvegardes_reussies=$((sauvegardes_reussies + 1))
fi
fi
# Partie 2 : Sauvegarde distante des Documents de Fanou (sur portable)
nom_sauvegarde="Documents Fanou (Distant)" # Nom pour la partie distante
remote_user="$userPortable"
remote_ip="$ipPortable"
remote_source_path="$SOURCE_PORTABLE_DOCS"
local_sshfs_mount_point="$MONTAGE_SSHFS_DOCS_PORTABLE"
rsync_destination="$DEST_LOCAL_DOCS_FANOU"
backup_dir_suffix="incremental-DocumentsFanou/$current_date/"
est_sauvegarde_distante=1 # Marquer comme distante pour le traitement qui suit
;;
32) # Sauvegarde Projets (Serveur) - Exemple d'ajout
nom_sauvegarde="Projets (Serveur)"
remote_user="$userServeur"
remote_ip="$ipServeur"
remote_source_path="$SOURCE_SERVEUR_PROJETS"
local_sshfs_mount_point="$MONTAGE_SSHFS_PROJETS"
rsync_destination="$DEST_BASE_PROJETS"
backup_dir_suffix="incremental-ProjetsServeur/$current_date/"
est_sauvegarde_distante=1
;;
*)
log_warning "Valeur de sélection inconnue ignorée: $i"
nombre_sauvegardes=$((nombre_sauvegardes - 1))
continue
;;
esac
# Traitement des sauvegardes distantes
if [ "$est_sauvegardes_distante" -eq 1 ]; then
log_info "Préparation de la sauvegarde distante '$nom_sauvegarde':"
log_info " - Utilisateur distant: $remote_user"
log_info " - IP distante: $remote_ip"
log_info " - Chemin source distant: $remote_source_path"
log_info " - Destination Rsync: $rsync_destination"
log_info " - Répertoire de sauvegarde incrémentiel: $backup_dir_suffix"
# Utiliser le cache pour la joignabilité de l'hôte afin d'éviter les vérifications répétées
if [ -z "${cache_joignabilite_hote["$remote_user@$remote_ip"]}" ]; then
log_debug "Cache vide pour $remote_user@$remote_ip, vérification de la joignabilité..."
if verifier_joignabilite_hote "$remote_user" "$remote_ip"; then
cache_joignabilite_hote["$remote_user@$remote_ip"]="success"
else
cache_joignabilite_hote["$remote_user@$remote_ip"]="fail"
log_error "Échec de la joignabilité de l'hôte distant $remote_user@$remote_ip pour '$nom_sauvegarde', sauvegarde annulée."
sauvegardes_echouees=$((sauvegardes_echouees + 1))
continue
fi
elif [ "${cache_joignabilite_hote["$remote_user@$remote_ip"]}" == "fail" ]; then
log_warning "Hôte $remote_user@$remote_ip déjà marqué comme non joignable, saut de la sauvegarde '$nom_sauvegarde'."
sauvegardes_echouees=$((sauvegardes_echouees + 1))
continue
fi
# Test de la clé SSH, mais ne bloque pas la sauvegarde si échec (peut utiliser mot de passe)
tester_cle_ssh "$remote_user" "$remote_ip"
if ! verifier_espace_disque "$rsync_destination" "$ESPACE_DISQUE_MIN_GO"; then
log_error "Espace disque insuffisant pour la sauvegarde '$nom_sauvegarde'. Sauvegarde annulée."
sauvegardes_echouees=$((sauvegardes_echouees + 1))
continue
fi
if ! verifier_permissions_ecriture "$rsync_destination"; then
log_error "Permissions d'écriture insuffisantes pour la sauvegarde '$nom_sauvegarde'. Sauvegarde annulée."
sauvegardes_echouees=$((sauvegardes_echouees + 1))
continue
fi
# Logique de connexion à distance : SSHFS ou SSH Direct
if [ "$TYPE_CONNEXION_DISTANTE" -eq 0 ]; then
log_info "Utilisation du mode SSHFS pour '$nom_sauvegarde'."
if monter_sshfs "$remote_user" "$remote_ip" "$remote_source_path" "$local_sshfs_mount_point"; then
rsync_source="$local_sshfs_mount_point/"
rsync_ssh_option="" # Pas d'option SSH car SSHFS gère la connexion sous-jacente
log_info "Démarrage Rsync pour '$nom_sauvegarde' (via SSHFS)..."
local rsync_output=""
if ! rsync --progress -a -v --delete-after \
--partial --partial-dir="$rsync_destination/.rsync-partial" \
"$rsync_source" "$rsync_destination" \
--backup --backup-dir="$rsync_destination/$backup_dir_suffix" \
>> "$FICHIER_JOURNAL_PRINCIPAL" 2> >(tee -a "$FICHIER_ERREURS" >&2; rsync_output=$(cat -))
then
local rsync_exit_code=$?
local interpreted_error=$(interpreter_erreur_rsync "$rsync_exit_code" "$rsync_output")
log_error "Échec de la sauvegarde '$nom_sauvegarde' (via SSHFS)."
log_error "Détails Rsync: $interpreted_error"
sauvegardes_echouees=$((sauvegardes_echouees + 1))
else
log_info "Sauvegarde '$nom_sauvegarde' (via SSHFS) réussie."
sauvegardes_reussies=$((sauvegardes_reussies + 1))
fi
demonter_sshfs "$local_sshfs_mount_point" # Démontage après chaque sauvegarde SSHFS
else
log_error "Impossible de monter le SSHFS pour '$nom_sauvegarde', sauvegarde annulée."
sauvegardes_echouees=$((sauvegardes_echouees + 1))
fi
elif [ "$TYPE_CONNEXION_DISTANTE" -eq 1 ]; then
log_info "Utilisation du mode SSH Direct (rsync via SSH) pour '$nom_sauvegarde'."
rsync_source="$remote_user@$remote_ip:$remote_source_path/"
rsync_ssh_option="-e ssh" # Option SSH pour rsync en mode direct
log_info "Démarrage Rsync pour '$nom_sauvegarde' (via SSH Direct)..."
local rsync_output=""
if ! rsync --progress -a -v --delete-after $rsync_ssh_option \
--partial --partial-dir="$rsync_destination/.rsync-partial" \
"$rsync_source" "$rsync_destination" \
--backup --backup-dir="$rsync_destination/$backup_dir_suffix" \
>> "$FICHIER_JOURNAL_PRINCIPAL" 2> >(tee -a "$FICHIER_ERREURS" >&2; rsync_output=$(cat -))
then
local rsync_exit_code=$?
local interpreted_error=$(interpreter_erreur_rsync "$rsync_exit_code" "$rsync_output")
log_error "Échec de la sauvegarde '$nom_sauvegarde' (via SSH Direct)."
log_error "Détails Rsync: $interpreted_error"
sauvegardes_echouees=$((sauvegardes_echouees + 1))
else
log_info "Sauvegarde '$nom_sauvegarde' (via SSH Direct) réussie."
sauvegardes_reussies=$((sauvegardes_reussies + 1))
fi
fi
fi
done
# Résumé des sauvegardes
log_info "=== FIN DES SAUVEGARDES ==="
log_info "Résumé :"
log_info " - Nombre total de sauvegardes tentées: $nombre_sauvegardes"
log_info " - Sauvegardes réussies: $sauvegardes_reussies"
log_info " - Sauvegardes échouées: $sauvegardes_echouees"
if [ "$sauvegardes_echouees" -eq 0 ] && [ "$sauvegardes_reussies" -gt 0 ]; then
log_info "Toutes les sauvegardes sélectionnées ont été effectuées avec succès ! ($sauvegardes_reussies sur $nombre_sauvegardes)"
elif [ "$sauvegardes_reussies" -gt 0 ]; then
log_warning "Sauvegardes terminées avec des erreurs. $sauvegardes_reussies réussies, $sauvegardes_echouees échouées. Veuillez consulter le fichier de journal pour plus de détails: $FICHIER_JOURNAL_PRINCIPAL"
else
log_error "Aucune sauvegarde n'a été effectuée avec succès. Veuillez consulter le fichier de journal pour plus de détails: $FICHIER_JOURNAL_PRINCIPAL"
fi
# Démontage final de tous les montages SSHFS résiduels et libération du verrou
demonter_tous_les_sshfs_a_la_sortie
liberer_verrou
log_info "Script de sauvegarde terminé."
exit 0
Dernière modification par steph810 (Le 21/06/2025, à 20:19)
Hors ligne
#233 Le 21/06/2025, à 20:19
- steph810
Re : script d’automatisation sauvegardes
up mod dessus
Hors ligne
#234 Le 21/06/2025, à 21:02
- eric63
Re : script d’automatisation sauvegardes
sudo journalctl | grep Multimedias
j’ai un gloubi boulga infâme qui ne s’arrête jamais
le fstab qu‘est revenu en arrière
Multimedias@192.168.1.128:/home/Multimedias /home/kubu/VMMultimedias fuse.sshfs port=22,user,noauto,noatime,x-systemd.mount-timeout=3,_netdev,delay_connect,idmap=user,transform_symlinks,identityfile=/home/kubu/.ssh/id_ed25519,default_permissions,uid=1001,gid=1001,allow_other
fanou@192.168.1.60:/home/fanou/Documents /home/kubu/VMMultimedias/VMSauvegardesDocuments/VMSauvegardesDocumentsFanou fuse.sshfs port=22,user,noatime,x-systemd.mount-timeout=3,_netdev,delay_connect,idmap=user,transform_symlinks,identityfile=/home/kubu/.ssh/id_ed25519,default_permissions,uid=1001,gid=1001,allow_other
Disque éteint ; je passe au script 4.6 en manuel ; aucune indication graphique kdialog mais c‘est peut être normal
kubu@kubu-System-Product-Name:~$ /home/kubu/ScriptsVMImportants/ScriptSauvegardes.sh
[2025-06-21 20:44:10] [INFO] Recherche et nettoyage des montages SSHFS orphelins sous /tmp/sshfs_backups...
[2025-06-21 20:44:10] [INFO] Nettoyage des montages SSHFS orphelins terminé.
[2025-06-21 20:44:10] [INFO] Vérification des dépendances...
[2025-06-21 20:44:10] [INFO] Toutes les dépendances requises sont présentes.
[2025-06-21 20:44:10] [INFO] Verrou acquis avec succès.
[2025-06-21 20:44:10] [INFO] === DÉBUT DE LA SAUVEGARDE ===
[2025-06-21 20:44:10] [INFO] Configuration actuelle:
[2025-06-21 20:44:10] [INFO] - Point de montage du disque externe: /media/kubu/JEUX8T
[2025-06-21 20:44:10] [INFO] - UUID partition attendu: 35bb9ca2-2022-4dfa-a201-1a2dde7ce1aa
[2025-06-21 20:44:10] [INFO] - Date de la sauvegarde: 2025-06-21_20h44
[2025-06-21 20:44:10] [INFO] Vérification du disque externe...
[2025-06-21 20:44:10] [ERREUR] Disque non reconnu ou éteint.
[2025-06-21 20:44:10] [ERREUR] UUID trouvé: ''
[2025-06-21 20:44:10] [ERREUR] UUID attendu: '35bb9ca2-2022-4dfa-a201-1a2dde7ce1aa'
[2025-06-21 20:44:10] [INFO] Attente du montage du disque externe...
pas de fenêtre kdialog ; allumage du disque ; le disque indique qu’il doit être monté (normalement il doit se monter automatiquement ??)
[2025-06-21 20:45:35] [INFO] Disque monté avec succès après 28 tentatives.
[2025-06-21 20:45:35] [INFO] Espace disque suffisant sur /media/kubu/JEUX8T.
[2025-06-21 20:45:35] [INFO] Sauvegardes pré-sélectionnées pour exécution automatique.
[2025-06-21 20:45:35] [INFO] Sélections pour exécution: 1 2 16
pas de fenêtre kdialog pour choix
[2025-06-21 20:45:35] [INFO] === TRAITEMENT SAUVEGARDE 1 ===
/home/kubu/ScriptsVMImportants/ScriptSauvegardes.sh: line 684: [: : integer expression expected
[2025-06-21 20:45:35] [INFO] === TRAITEMENT SAUVEGARDE 2 ===
/home/kubu/ScriptsVMImportants/ScriptSauvegardes.sh: line 684: [: : integer expression expected
[2025-06-21 20:45:35] [INFO] === TRAITEMENT SAUVEGARDE 3 ===
[2025-06-21 20:45:35] [INFO] Début de la sauvegarde locale des Documents de kubu...
[2025-06-21 20:45:35] [AVERTISSEMENT] Le chemin /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsEric/ n'existe pas, impossible de vérifier l'espace disque.
[2025-06-21 20:45:35] [INFO] Répertoire '/media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsEric/' créé. Nouvelle tentative de vérification de l'espace.
[2025-06-21 20:45:35] [INFO] Espace disque suffisant sur /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsEric/.
[2025-06-21 20:45:35] [INFO] Démarrage Rsync pour Documents Eric (Local)...
/home/kubu/ScriptsVMImportants/ScriptSauvegardes.sh: line 638: local: can only be used in a function
[2025-06-21 20:45:35] [ERREUR] Script interrompu par signal ou erreur inattendue. Tentative de nettoyage...
[2025-06-21 20:45:35] [INFO] Verrou libéré.
kubu@kubu-System-Product-Name:~$
extinction du disque et je recommence le script: pas de montage montage manuel
kubu@kubu-System-Product-Name:~$ /home/kubu/ScriptsVMImportants/ScriptSauvegardes.sh
[2025-06-21 21:01:21] [INFO] Recherche et nettoyage des montages SSHFS orphelins sous /tmp/sshfs_backups...
[2025-06-21 21:01:21] [INFO] Nettoyage des montages SSHFS orphelins terminé.
[2025-06-21 21:01:21] [INFO] Vérification des dépendances...
[2025-06-21 21:01:21] [INFO] Toutes les dépendances requises sont présentes.
[2025-06-21 21:01:22] [INFO] Verrou acquis avec succès.
[2025-06-21 21:01:22] [INFO] === DÉBUT DE LA SAUVEGARDE ===
[2025-06-21 21:01:22] [INFO] Configuration actuelle:
[2025-06-21 21:01:22] [INFO] - Point de montage du disque externe: /media/kubu/JEUX8T
[2025-06-21 21:01:22] [INFO] - UUID partition attendu: 35bb9ca2-2022-4dfa-a201-1a2dde7ce1aa
[2025-06-21 21:01:22] [INFO] - Date de la sauvegarde: 2025-06-21_21h01
[2025-06-21 21:01:22] [INFO] Vérification du disque externe...
[2025-06-21 21:01:22] [INFO] Disque correctement monté et reconnu.
[2025-06-21 21:01:22] [INFO] Espace disque suffisant sur /media/kubu/JEUX8T.
[2025-06-21 21:01:22] [INFO] Sauvegardes pré-sélectionnées pour exécution automatique.
[2025-06-21 21:01:22] [INFO] Sélections pour exécution: 1 2 16
[2025-06-21 21:01:22] [INFO] === TRAITEMENT SAUVEGARDE 1 ===
/home/kubu/ScriptsVMImportants/ScriptSauvegardes.sh: line 684: [: : integer expression expected
[2025-06-21 21:01:22] [INFO] === TRAITEMENT SAUVEGARDE 2 ===
/home/kubu/ScriptsVMImportants/ScriptSauvegardes.sh: line 684: [: : integer expression expected
[2025-06-21 21:01:22] [INFO] === TRAITEMENT SAUVEGARDE 3 ===
[2025-06-21 21:01:22] [INFO] Début de la sauvegarde locale des Documents de kubu...
[2025-06-21 21:01:22] [INFO] Espace disque suffisant sur /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsEric/.
[2025-06-21 21:01:22] [INFO] Démarrage Rsync pour Documents Eric (Local)...
/home/kubu/ScriptsVMImportants/ScriptSauvegardes.sh: line 638: local: can only be used in a function
[2025-06-21 21:01:22] [ERREUR] Script interrompu par signal ou erreur inattendue. Tentative de nettoyage...
[2025-06-21 21:01:22] [INFO] Verrou libéré.
kubu@kubu-System-Product-Name:~$
Kubuntu 25.04 wayland Plasma 6.3.4 KDE Qt 6.12.0 noyau 6.14.0-15 Asus B760+D4 i5-12400F 4.4Ghz DDR4 32Go nvidia RTX 3060 12GB
Utilisez les drivers libres avant d’ installer une brother avec le script de demonipuch
J’utilise le clavier french AFNOR
Hors ligne
#235 Le 21/06/2025, à 21:23
- steph810
Re : script d’automatisation sauvegardes
re,
si c'est mon dernier script alors je vois essayer de supprimer le mot local ligne 638
désolé local normalement appeler dans une fonction,
local rsync_local_eric_error_output=""
en
rsync_local_eric_error_output=""
pour erreur 684.
Voit avec les variables :
ipVM="192.168.1.128"
userVM="Multimedias"
##############################################################################################
Normalement rien a faire mai controle si ca correspond avec uuid 35bb9ca2-2022-4dfa-a201-1a2dde7ce1aa
Chemins des points de montage SSHFS locaux pas touché !!
Ceux-ci sont généralement corrects si BASE_MONTAGE_SSHFS est bien monté ca va dans un le dossier temporaire prepare et envoi
Ils seront créés automatiquement par SSHFS
C'est juste un controle de securité faut pas les toucher.
MONTAGE_SSHFS_PHOTOS="$BASE_MONTAGE_SSHFS/photos_vm"
MONTAGE_SSHFS_IMAGES="$BASE_MONTAGE_SSHFS/images_vm"
MONTAGE_SSHFS_MUSIQUES="$BASE_MONTAGE_SSHFS/musiques_vm"
MONTAGE_SSHFS_DOCS_COMMUNS="$BASE_MONTAGE_SSHFS/docs_communs_vm"
MONTAGE_SSHFS_DOCS_PORTABLE="$BASE_MONTAGE_SSHFS/docs_fanou_portable"
MONTAGE_SSHFS_PROJETS="$BASE_MONTAGE_SSHFS/projets_serveur"
################################################################################################
et toutes les autres. variables....
Regarde que tu ais bien mis les guillemet si tu as modifié, pas comme les post précédent.
ipVM="ADRESSE_IP_VM"
userVM="NOM_UTILISATEUR_VM"
ipPortable="ADRESSE_IP_PORTABLE"
userPortable="NOM_UTILISATEUR_PORTABLE"
ipServeur="ADRESSE_IP_SERVEUR"
userServeur="NOM_UTILISATEUR_SERVEUR"
userLocal="NOM_UTILISATEUR_LOCAL"
Pas de majuscule je met juste en évidence
Dernière modification par steph810 (Le 21/06/2025, à 21:40)
Hors ligne
#236 Le 21/06/2025, à 21:51
- steph810
Re : script d’automatisation sauvegardes
donner moi le script modifié vais ajouter un bonus pour l'aide
Hors ligne
#237 Le 21/06/2025, à 22:06
- eric63
Re : script d’automatisation sauvegardes
il me semble que tout est correct dans les variables j’ai rien modifié
ça c’est moins bien
kubu@kubu-System-Product-Name:~$ sudo mount -av
/ : ignored
/boot/efi : already mounted
/home : already mounted
/home/kubu/VMMultimedias : ignored
/home/kubu/VMMultimedias/VMSauvegardesDocuments/VMSauvegardesDocumentsFanou: already mounted
kubu@kubu-System-Product-Name:~$
Dernière modification par eric63 (Le 21/06/2025, à 22:27)
Kubuntu 25.04 wayland Plasma 6.3.4 KDE Qt 6.12.0 noyau 6.14.0-15 Asus B760+D4 i5-12400F 4.4Ghz DDR4 32Go nvidia RTX 3060 12GB
Utilisez les drivers libres avant d’ installer une brother avec le script de demonipuch
J’utilise le clavier french AFNOR
Hors ligne
#238 Le 21/06/2025, à 22:14
- steph810
Re : script d’automatisation sauvegardes
il me semble que tout est correct dans les variables j’ai rien modifié
je vais vous envoyé les fichier il y en as 2 maintenant ce qui va alléger le script, repris un des mien pour les erreurs. si ca fonctionne dite je posterer en deux partis ici. d'ici 10 minutes, je finalise.
Hors ligne
#239 Le 21/06/2025, à 22:39
- steph810
Re : script d’automatisation sauvegardes
Ajout de la descriptions des différents mode DEBUG, Type de connexion ,Journalisations
J'attend vos avis
et je croise les doigts.
presque tous revu je preparer dans mon coin
Particulatité 2 fichiers je fais simple pour vous.
Voir L.27 du fichier sauvegarde vous indique l'emplacement copier le chemin où vous devez copier le fichier si existant, écraser ou déplacer l'ancien
normalement ici:
/home/kubu/ScriptsVMImportants/fonctions_erreur.sh
le code sauvegarde.sh
#!/bin/bash
### Script de base geole largement modifié par iznobe, Watael et steph810 pour la partie debug de remplacement (plus simple). Merci à eux.
### Voir https://forum.kubuntu-fr.org/viewtopic.php?id=2091380&p=5
#===============================================================
# Sauvegarde des données
# Auteur : enRIKO ^^ =)
# Date : 2025-06-21
# Version : 5.0 (Refactorisée avec fonctions)
# Description : Script de sauvegarde incrémentale des fichiers
# personnels et de configuration sur un disque externe.
# Log :
# 2025-06-21 : Version 5.0 - Refactorisation majeure.
# - Intégration d'un fichier de diagnostic externe.
# - Création de fonctions dédiées pour les sauvegardes locales et distantes.
# - Correction de bugs critiques (pipefail). GRRRRR
#===============================================================
# AMÉLIORATION : Assure que les erreurs dans un pipeline sont capturées.
set -o pipefail
# --- INTÉGRATION DU FICHIER DE DIAGNOSTIC ---
if [ -f "/home/kubu/ScriptsVMImportants/fonctions_erreur.sh" ]; then
source "/home/kubu/ScriptsVMImportants/fonctions_erreur.sh"
else
echo "ERREUR CRITIQUE: Le fichier /home/kubu/ScriptsVMImportants/fonctions_erreur.sh est introuvable." >&2
exit 1
fi
# ---------------------------------------------
# --- Options de Démarrage du Script ---
MODE_DEBOGAGE=0 # 0: Désactivé (ne loggue pas les messages de DEBOGAGE), 1: Activé (loggue les messages de DEBOGAGE)
TYPE_CONNEXION_DISTANTE=0 # 0: Utilise SSHFS pour les connexions distantes, 1: Utilise SSH Direct (rsync via SSH)
JOURNAUX_DESACTIVES=0 # 0: Journaux activés (écrit dans les fichiers de log), 1: Journaux désactivés (supprime toutes les sorties de log)
# --- Variables de Configuration Globales ---
# IMPORTANT : Adaptez ces variables à votre environnement !
ipVM="192.168.1.128"
userVM="Multimedias"
ipPortable="192.168.1.60"
userPortable="fanou"
userLocal="kubu"
ipServeur="192.168.1.100"
userServeur="devUser"
REPERTOIRE_JOURNAUX="$HOME/log/backup-script"
FICHIER_JOURNAL_PRINCIPAL="$REPERTOIRE_JOURNAUX/backup_$(date +%Y%m%d_%H%M).log"
FICHIER_DEBOGAGE="$REPERTOIRE_JOURNAUX/debug_$(date +%Y%m%d_%H%M).log"
FICHIER_ERREURS="$REPERTOIRE_JOURNAUX/error_$(date +%Y%m%d_%H%M).log"
PointMontageDisque="/media/$USER/JEUX8T"
UUID_Partition="35bb9ca2-2022-4dfa-a201-1a2dde7ce1aa"
ESPACE_DISQUE_MIN_GO=50
BASE_MONTAGE_SSHFS="/tmp/sshfs_backups"
SOURCE_VM_PHOTOS="/home/$userVM/MultimediasCommuns/Photos"
SOURCE_VM_IMAGES="/home/$userVM/MultimediasCommuns/Images"
SOURCE_VM_MUSIQUES="/home/$userVM/MultimediasCommuns/Musiques"
SOURCE_VM_DOCS_COMMUNS="/home/$userVM/DocumentsPartages"
SOURCE_PORTABLE_DOCS="/home/$userPortable/Documents"
SOURCE_LOCAL_DOCS_ERIC="/home/$userLocal/Documents"
SOURCE_SERVEUR_PROJETS="/home/$userServeur/MesProjets"
MONTAGE_SSHFS_PHOTOS="$BASE_MONTAGE_SSHFS/photos_vm"
MONTAGE_SSHFS_IMAGES="$BASE_MONTAGE_SSHFS/images_vm"
MONTAGE_SSHFS_MUSIQUES="$BASE_MONTAGE_SSHFS/musiques_vm"
MONTAGE_SSHFS_DOCS_COMMUNS="$BASE_MONTAGE_SSHFS/docs_communs_vm"
MONTAGE_SSHFS_DOCS_PORTABLE="$BASE_MONTAGE_SSHFS/docs_fanou_portable"
MONTAGE_SSHFS_PROJETS="$BASE_MONTAGE_SSHFS/projets_serveur"
DEST_BASE_SAUVEGARDES="$PointMontageDisque/SAUVEGARDES/"
DEST_LOCAL_DOCS_ERIC="$PointMontageDisque/SAUVEGARDES/SauvegardesDocumentsEric/"
DEST_LOCAL_DOCS_FANOU="$PointMontageDisque/SAUVEGARDES/SauvegardesDocumentsFanou/"
DEST_BASE_DOCS_COMMUNS="$PointMontageDisque/SAUVEGARDES/SauvegardesDocumentsCommuns/"
DEST_BASE_PROJETS="$PointMontageDisque/SAUVEGARDES/SauvegardesProjetsServeur/"
FICHIER_VERROU="/tmp/backup_script.lock"
# --- Fonctions de Journalisation ---
log_info() { if [ "$JOURNAUX_DESACTIVES" -eq 1 ]; then return; fi; local message="$1"; local timestamp; timestamp=$(date '+%Y-%m-%d %H:%M:%S'); echo "[$timestamp] [INFO] $message" | tee -a "$FICHIER_JOURNAL_PRINCIPAL"; }
log_error() { if [ "$JOURNAUX_DESACTIVES" -eq 1 ]; then return; fi; local message="$1"; local timestamp; timestamp=$(date '+%Y-%m-%d %H:%M:%S'); echo "[$timestamp] [ERREUR] $message" | tee -a "$FICHIER_JOURNAL_PRINCIPAL" | tee -a "$FICHIER_ERREURS"; }
log_debug() { if [ "$MODE_DEBOGAGE" -eq 1 ] && [ "$JOURNAUX_DESACTIVES" -eq 0 ]; then local message="$1"; local timestamp; timestamp=$(date '+%Y-%m-%d %H:%M:%S'); echo "[$timestamp] [DEBOGAGE] $message" | tee -a "$FICHIER_DEBOGAGE"; fi; }
log_warning() { if [ "$JOURNAUX_DESACTIVES" -eq 1 ]; then return; fi; local message="$1"; local timestamp; timestamp=$(date '+%Y-%m-%d %H:%M:%S'); echo "[$timestamp] [AVERTISSEMENT] $message" | tee -a "$FICHIER_JOURNAL_PRINCIPAL"; }
# --- Fonctions Utilitaires ---
nettoyer_anciens_journaux() { log_debug "Nettoyage des anciens journaux..." && find "$REPERTOIRE_JOURNAUX" -name "*.log" -type f -mtime +30 -delete 2>/dev/null || log_warning "Nettoyage des anciens journaux a échoué."; }
obtenir_uuid_disque() { findmnt -n --output UUID "$PointMontageDisque" 2>/dev/null; }
verifier_dependances() { log_info "Vérification des dépendances..."; for dep in rsync sshfs flock; do command -v $dep >/dev/null || gerer_erreur_fatale "Dépendance manquante: $dep" 104; done; log_info "Dépendances OK."; }
tester_ping() { ping -c 2 -W 2 "$1" >/dev/null 2>&1; }
tester_ssh() { timeout 15 ssh -o ConnectTimeout=10 -o BatchMode=yes "$1@$2" exit 2>/dev/null; }
verifier_joignabilite_hote() { local user="$1"; local ip="$2"; log_info "Vérification joignabilité de $user@$ip..."; if ! tester_ping "$ip"; then log_error "Ping échoué vers $ip."; return 1; fi; if ! tester_ssh "$user" "$ip"; then log_error "Connexion SSH échouée vers $user@$ip."; return 1; fi; log_info "Hôte $user@$ip joignable."; return 0; }
monter_sshfs() { local user="$1"; local ip="$2"; local remote_path="$3"; local local_mount_point="$4"; log_info "Montage SSHFS de $user@$ip:$remote_path..."; mkdir -p "$local_mount_point"; fusermount -uz "$local_mount_point" 2>/dev/null; if ! sshfs -o reconnect,ServerAliveInterval=15 "$user@$ip:$remote_path" "$local_mount_point"; then log_error "Échec du montage SSHFS."; return 1; fi; log_info "Montage SSHFS réussi."; return 0; }
demonter_sshfs() { local mount_point="$1"; if mountpoint -q "$mount_point"; then log_info "Démontage de $mount_point..."; if ! fusermount -uz "$mount_point"; then log_error "Échec du démontage de $mount_point."; return 1; fi; rmdir "$mount_point" 2>/dev/null; fi; return 0; }
verifier_permissions_ecriture() { local dest_path="$1"; if [ ! -d "$dest_path" ]; then mkdir -p "$dest_path" || { log_error "Impossible de créer le répertoire de destination '$dest_path'."; return 1; }; fi; if [ ! -w "$dest_path" ]; then log_error "Pas de permission d'écriture dans '$dest_path'."; return 1; fi; return 0; }
verifier_espace_disque() { local path="$1"; local min_gb="$2"; local available_gb; available_gb=$(df -BG "$path" | awk 'NR==2 {print $4}' | sed 's/G//'); if (( available_gb < min_gb )); then log_error "Espace disque insuffisant sur $path (${available_gb}GB disponibles, ${min_gb}GB requis)."; return 1; fi; return 0; }
acquerir_verrou() { exec 200>"$FICHIER_VERROU"; if ! flock -n 200; then gerer_erreur_fatale "Une autre instance du script est déjà en cours." 103; fi; log_info "Verrou acquis."; }
liberer_verrou() { flock -u 200; exec 200>&-; rm -f "$FICHIER_VERROU" 2>/dev/null; log_info "Verrou libéré."; }
demonter_tous_les_sshfs_a_la_sortie() { log_debug "Nettoyage final des montages SSHFS..."; findmnt -n -t fuse.sshfs -o TARGET | grep "^$BASE_MONTAGE_SSHFS/" | while read -r mount_point; do demonter_sshfs "$mount_point"; done; }
# --- FONCTIONS DE SAUVEGARDE (REFACTORISÉES) ---
# Fonction pour exécuter une sauvegarde Rsync (utilisée par les autres fonctions)
executer_rsync() {
local nom_sauvegarde="$1"
local rsync_source="$2"
local rsync_destination="$3"
local backup_dir_suffix="$4"
local rsync_ssh_option="$5" # Optionnel, pour SSH direct
local rsync_output=""
log_info "Démarrage Rsync pour '$nom_sauvegarde'..."
log_debug " Source: $rsync_source"
log_debug " Destination: $rsync_destination"
# Création du répertoire de destination et du dossier pour les fichiers partiels
mkdir -p "$rsync_destination/.rsync-partial" || { log_error "Impossible de créer le répertoire .rsync-partial"; return 1; }
# Exécution de la commande rsync
if ! rsync --progress -a -v --delete-after ${rsync_ssh_option} \
--partial --partial-dir="$rsync_destination/.rsync-partial" \
"$rsync_source" "$rsync_destination" \
--backup --backup-dir="$rsync_destination/$backup_dir_suffix" \
>> "$FICHIER_JOURNAL_PRINCIPAL" 2> >(rsync_output=$(cat); tee -a "$FICHIER_ERREURS" >&2)
then
local rsync_exit_code=$?
diagnostiquer_et_logger_erreur "Échec de la sauvegarde Rsync pour '$nom_sauvegarde'" "$rsync_exit_code" "$rsync_output"
return 1
else
log_info "Sauvegarde '$nom_sauvegarde' réussie."
return 0
fi
}
# Fonction pour une sauvegarde locale
executer_sauvegarde_locale() {
local nom_sauvegarde="$1"
local source_path="$2"
local dest_path="$3"
local backup_dir="$4"
log_info "--- Début Sauvegarde Locale : $nom_sauvegarde ---"
if ! verifier_espace_disque "$dest_path" "$ESPACE_DISQUE_MIN_GO" || ! verifier_permissions_ecriture "$dest_path"; then
log_error "Pré-requis non satisfaits pour '$nom_sauvegarde'. Sauvegarde ignorée."
return 1
fi
if executer_rsync "$nom_sauvegarde" "$source_path/" "$dest_path" "$backup_dir"; then
sauvegardes_reussies=$((sauvegardes_reussies + 1))
else
sauvegardes_echouees=$((sauvegardes_echouees + 1))
fi
log_info "--- Fin Sauvegarde Locale : $nom_sauvegarde ---"
}
# Fonction pour une sauvegarde distante
executer_sauvegarde_distante() {
local nom_sauvegarde="$1"
local remote_user="$2"
local remote_ip="$3"
local remote_source_path="$4"
local local_sshfs_mount_point="$5"
local rsync_destination="$6"
local backup_dir_suffix="$7"
log_info "--- Début Sauvegarde Distante : $nom_sauvegarde ---"
# Vérification des pré-requis
if ! verifier_joignabilite_hote "$remote_user" "$remote_ip" || \
! verifier_espace_disque "$rsync_destination" "$ESPACE_DISQUE_MIN_GO" || \
! verifier_permissions_ecriture "$rsync_destination"; then
log_error "Pré-requis non satisfaits pour '$nom_sauvegarde'. Sauvegarde ignorée."
sauvegardes_echouees=$((sauvegardes_echouees + 1))
return
fi
# Logique de connexion et exécution
local rsync_source=""
local rsync_ssh_option=""
local success=0
if [ "$TYPE_CONNEXION_DISTANTE" -eq 0 ]; then # Mode SSHFS
log_info "Utilisation du mode SSHFS pour '$nom_sauvegarde'."
if monter_sshfs "$remote_user" "$remote_ip" "$remote_source_path" "$local_sshfs_mount_point"; then
rsync_source="$local_sshfs_mount_point/"
if executer_rsync "$nom_sauvegarde" "$rsync_source" "$rsync_destination" "$backup_dir_suffix"; then
success=1
fi
demonter_sshfs "$local_sshfs_mount_point" # Démontage systématique
else
log_error "Impossible de monter le SSHFS pour '$nom_sauvegarde'."
fi
else # Mode SSH Direct
log_info "Utilisation du mode SSH Direct pour '$nom_sauvegarde'."
rsync_source="$remote_user@$remote_ip:$remote_source_path/"
rsync_ssh_option="-e ssh"
if executer_rsync "$nom_sauvegarde" "$rsync_source" "$rsync_destination" "$backup_dir_suffix" "$rsync_ssh_option"; then
success=1
fi
fi
if [ "$success" -eq 1 ]; then
sauvegardes_reussies=$((sauvegardes_reussies + 1))
else
sauvegardes_echouees=$((sauvegardes_echouees + 1))
fi
log_info "--- Fin Sauvegarde Distante : $nom_sauvegarde ---"
}
# --- SCRIPT PRINCIPAL ---
main() {
# Préparation de l'environnement et des logs
mkdir -p "$REPERTOIRE_JOURNAUX"
nettoyer_anciens_journaux
trap 'log_error "Script interrompu par signal ou erreur inattendue. Nettoyage..."; demonter_tous_les_sshfs_a_la_sortie; liberer_verrou; exit 1' ERR INT TERM
verifier_dependances
acquerir_verrou
log_info "=== DÉBUT DE LA SAUVEGARDE ==="
current_date=$(date +%F_%Hh%M)
# Contrôle de validité du disque externe (montage et UUID)
log_info "Vérification du disque externe..."
if [[ "$(obtenir_uuid_disque)" != "$UUID_Partition" ]]; then
gerer_erreur_fatale "Disque de sauvegarde non reconnu (UUID attendu: $UUID_Partition). Branchez-le et attendez le montage automatique." 105
fi
log_info "Disque correctement monté et reconnu."
if ! verifier_espace_disque "$PointMontageDisque" "$ESPACE_DISQUE_MIN_GO"; then
gerer_erreur_fatale "Espace disque insuffisant sur le disque de sauvegarde." 100
fi
# --- Sélection des sauvegardes ---
log_info "Sauvegardes pré-sélectionnées pour exécution automatique."
SELECTIONS_SAUVEGARDES="1 2 4 8 16 32" # <-- MODIFIEZ CETTE LIGNE
if [ -z "$SELECTIONS_SAUVEGARDES" ]; then
log_warning "Aucune sauvegarde sélectionnée."
liberer_verrou
exit 0
fi
nombre_sauvegardes_selectionnees=$(echo "$SELECTIONS_SAUVEGARDES" | wc -w)
log_info "Sélections pour exécution ($nombre_sauvegardes_selectionnees) : $SELECTIONS_SAUVEGARDES"
# Initialisation des compteurs
sauvegardes_reussies=0
sauvegardes_echouees=0
for i in $SELECTIONS_SAUVEGARDES; do
log_info "=== Traitement de la sélection $i ==="
case $i in
1) # Photos (VM)
executer_sauvegarde_distante "Photos (VM)" "$userVM" "$ipVM" \
"$SOURCE_VM_PHOTOS" "$MONTAGE_SSHFS_PHOTOS" \
"$DEST_BASE_SAUVEGARDES" "incremental-Photos/$current_date/"
;;
2) # Images (VM)
executer_sauvegarde_distante "Images (VM)" "$userVM" "$ipVM" \
"$SOURCE_VM_IMAGES" "$MONTAGE_SSHFS_IMAGES" \
"$DEST_BASE_SAUVEGARDES" "incremental-Images/$current_date/"
;;
4) # Musiques (VM)
executer_sauvegarde_distante "Musiques (VM)" "$userVM" "$ipVM" \
"$SOURCE_VM_MUSIQUES" "$MONTAGE_SSHFS_MUSIQUES" \
"$DEST_BASE_SAUVEGARDES" "incremental-Musiques/$current_date/"
;;
8) # Documents Communs (VM)
executer_sauvegarde_distante "Documents Communs (VM)" "$userVM" "$ipVM" \
"$SOURCE_VM_DOCS_COMMUNS" "$MONTAGE_SSHFS_DOCS_COMMUNS" \
"$DEST_BASE_DOCS_COMMUNS" "incremental-DocumentsPartages/$current_date/"
;;
16) # CAS COMPOSITE: Documents Eric (Local) & Fanou (Distant)
# Partie 1 : Locale
executer_sauvegarde_locale "Documents Eric (Local)" "$SOURCE_LOCAL_DOCS_ERIC" \
"$DEST_LOCAL_DOCS_ERIC" "incremental-DocumentsEric/$current_date/"
# Partie 2 : Distante
executer_sauvegarde_distante "Documents Fanou (Portable)" "$userPortable" "$ipPortable" \
"$SOURCE_PORTABLE_DOCS" "$MONTAGE_SSHFS_DOCS_PORTABLE" \
"$DEST_LOCAL_DOCS_FANOU" "incremental-DocumentsFanou/$current_date/"
;;
32) # Projets (Serveur)
executer_sauvegarde_distante "Projets (Serveur)" "$userServeur" "$ipServeur" \
"$SOURCE_SERVEUR_PROJETS" "$MONTAGE_SSHFS_PROJETS" \
"$DEST_BASE_PROJETS" "incremental-ProjetsServeur/$current_date/"
;;
*)
log_warning "Valeur de sélection inconnue ignorée: $i"
;;
esac
done
# --- Résumé Final ---
log_info "=== FIN DES SAUVEGARDES ==="
log_info "Résumé :"
log_info " - Sauvegardes réussies: $sauvegardes_reussies"
log_info " - Sauvegardes échouées: $sauvegardes_echouees"
if [ "$sauvegardes_echouees" -gt 0 ]; then
log_warning "Sauvegardes terminées avec des erreurs."
else
log_info "Toutes les sauvegardes se sont terminées sans erreur."
fi
demonter_tous_les_sshfs_a_la_sortie
liberer_verrou
log_info "Script de sauvegarde terminé."
exit 0
}
# Point d'entrée du script
main
.
pour les erreurs repris et adapter un des miens
Le code fonctions_erreur.sh
#!/bin/bash
# --- Fonction de diagnostic d'erreur (NON-FATALE) ---
# Révision Ubuntu-fr :) hi! ha!
# Affiche un diagnostic détaillé pour une erreur donnée, mais ne quitte pas le script.
# Permet de logger une erreur et de continuer l'exécution (ex: passer à la sauvegarde suivante).
# Arguments : $1 = message de contexte, $2 = code de retour, $3 = sortie brute de la commande (optionnel)
diagnostiquer_et_logger_erreur() {
local message_contexte="$1"
local code_retour="$2"
local sortie_brute="$3"
local timestamp
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
# Utilise la fonction de log du script principal si elle existe
if type -t log_error &> /dev/null; then
log_error "$message_contexte (Code: $code_retour)"
else
# Fallback si la fonction de log n'est pas disponible
echo "[$timestamp] [ERREUR] $message_contexte (Code: $code_retour)" >> "/tmp/backup_fallback_errors.log"
fi
echo "" >&2
echo "------------------- Diagnostic d'Erreur (Non-Fatale) -------------------" >&2
echo "Message : $message_contexte" >&2
echo "Code d'erreur : $code_retour" >&2
echo "" >&2
local piste=""
local action=""
# Le même bloc 'case' ultra-détaillé pour le diagnostic
case "$code_retour" in
# Codes de retour Rsync (standards, du manuel rsync)
1) piste="Erreur de syntaxe Rsync ou problème général."; action="Vérifiez la syntaxe de la commande rsync et les chemins source/destination." ;;
3) piste="Erreurs sur la sélection de fichiers (permissions, chemin introuvable)."; action="Vérifiez les permissions de lecture/écriture et l'existence des chemins." ;;
11) piste="Erreur d'E/S (Input/Output). Problème de lecture/écriture sur le disque."; action="Vérifiez l'intégrité et l'espace des disques (source et destination)." ;;
12) piste="Erreur de protocole Rsync, souvent lié à SSH."; action="Assurez-vous que rsync est bien installé sur la machine distante et accessible par l'utilisateur SSH." ;;
23) piste="Transfert partiel (espace disque insuffisant, permissions, connexion instable)."; action="C'est une erreur fréquente. Vérifiez l'espace disque destination et la stabilité du réseau." ;;
24) piste="Fichier source disparu pendant le transfert."; action="Des fichiers ont été modifiés/supprimés à la source pendant la sauvegarde." ;;
255) # Erreur SSH
piste="Erreur de connexion SSH/SSHFS (hôte non joignable, authentification refusée)."
action="Vérifiez IP, utilisateur, état du service SSH, clés SSH et pare-feux." ;;
*)
piste="L'erreur avec le code '$code_retour' n'est pas spécifiquement listée."
action="Activez le MODE_DEBOGAGE=1 dans le script principal pour une analyse détaillée." ;;
esac
echo "? Piste : $piste" >&2
echo "? Action : $action" >&2
if [[ -n "$sortie_brute" ]]; then
echo "" >&2
echo "--- Sortie d'erreur brute de la commande ---" >&2
echo "$sortie_brute" >&2
echo "-------------------------------------------" >&2
fi
echo "----------------------------------------------------------------------" >&2
echo "" >&2
}
# --- Fonction de gestion des erreurs FATALES ---
# Affiche un diagnostic puis quitte le script.
# À utiliser pour les erreurs qui rendent la poursuite de l'exécution impossible.
# Arguments : $1 = message d'erreur, $2 = code de retour (optionnel)
gerer_erreur_fatale() {
local message_erreur="$1"
local code_retour="${2:-$?}"
# Appel à la fonction de diagnostic pour afficher les détails
diagnostiquer_et_logger_erreur "$message_erreur" "$code_retour"
echo "" >&2
echo "╔═══════════════════════════════════════════════════════════╗" >&2
echo "║ ? ERREUR FATALE - ARRÊT DU SCRIPT ? ║" >&2
echo "╚═══════════════════════════════════════════════════════════╝" >&2
echo "" >&2
echo "Le script ne peut pas continuer en raison de cette erreur." >&2
# Le nettoyage (démontage, libération du verrou) est géré par le 'trap' du script principal.
exit "$code_retour"
}
Dernière modification par steph810 (Le 21/06/2025, à 23:07)
Hors ligne
#240 Le 21/06/2025, à 22:44
- steph810
Re : script d’automatisation sauvegardes
il me semble que tout est correct dans les variables j’ai rien modifié
ça c’est moins bien
kubu@kubu-System-Product-Name:~$ sudo mount -av / : ignored /boot/efi : already mounted /home : already mounted /home/kubu/VMMultimedias : ignored /home/kubu/VMMultimedias/VMSauvegardesDocuments/VMSauvegardesDocumentsFanou: already mounted kubu@kubu-System-Product-Name:~$
Normalement le script a une detection d'erreur a savoir si le disque est monté ou non.
Vous avez une version simplifié maintenant et tout aussi éfficaces.
Avec le nouveau script ""NORMALEMENT"" ca ne devrais plus arriver, le script utilise des emplacements dédiés et temporaires pour ses montages SSHFS, qui sont distincts de vos répertoires de destination finale des sauvegardes.
J'oublier, les nouveaux répertoire sont içi:
/tmp/sshfs_backups
A la fin de l'execution """ démontage des points SSHFS, suppression des répertoires vides il restera sshfs_backups mais vide. je n'ai pas ajouter sa suppression mais vue qu'il est vide et dans les fichiers temporaires sera normalement vider a que redémarrage.
J'ai dû également factoriser le script, il devenait trop long, s'il le faut je peux revenir à une version plus claire ?
Dernière modification par steph810 (Le 21/06/2025, à 22:57)
Hors ligne
#241 Le 21/06/2025, à 23:18
- eric63
Re : script d’automatisation sauvegardes
essai 1
kubu@kubu-System-Product-Name:~$ /home/kubu/ScriptsVMImportants/ScriptSauvegardes.sh
[2025-06-21 22:53:15] [INFO] Vérification des dépendances...
[2025-06-21 22:53:15] [INFO] Dépendances OK.
[2025-06-21 22:53:15] [INFO] Verrou acquis.
[2025-06-21 22:53:15] [INFO] === DÉBUT DE LA SAUVEGARDE ===
[2025-06-21 22:53:15] [INFO] Vérification du disque externe...
[2025-06-21 22:53:15] [INFO] Disque correctement monté et reconnu.
[2025-06-21 22:53:15] [INFO] Sauvegardes pré-sélectionnées pour exécution automatique.
[2025-06-21 22:53:15] [INFO] Sélections pour exécution (6) : 1 2 4 8 16 32
[2025-06-21 22:53:15] [INFO] === Traitement de la sélection 1 ===
[2025-06-21 22:53:15] [INFO] --- Début Sauvegarde Distante : Photos (VM) ---
[2025-06-21 22:53:15] [INFO] Vérification joignabilité de Multimedias@192.168.1.128...
[2025-06-21 22:53:17] [INFO] Hôte Multimedias@192.168.1.128 joignable.
[2025-06-21 22:53:17] [INFO] Utilisation du mode SSHFS pour 'Photos (VM)'.
[2025-06-21 22:53:17] [INFO] Montage SSHFS de Multimedias@192.168.1.128:/home/Multimedias/MultimediasCommuns/Photos...
[2025-06-21 22:53:18] [INFO] Montage SSHFS réussi.
[2025-06-21 22:53:18] [INFO] Démarrage Rsync pour 'Photos (VM)'...
[2025-06-21 23:00:24] [INFO] Sauvegarde 'Photos (VM)' réussie.
[2025-06-21 23:00:24] [INFO] Démontage de /tmp/sshfs_backups/photos_vm...
[2025-06-21 23:00:24] [INFO] --- Fin Sauvegarde Distante : Photos (VM) ---
[2025-06-21 23:00:24] [INFO] === Traitement de la sélection 2 ===
[2025-06-21 23:00:24] [INFO] --- Début Sauvegarde Distante : Images (VM) ---
[2025-06-21 23:00:24] [INFO] Vérification joignabilité de Multimedias@192.168.1.128...
[2025-06-21 23:00:27] [INFO] Hôte Multimedias@192.168.1.128 joignable.
[2025-06-21 23:00:27] [INFO] Utilisation du mode SSHFS pour 'Images (VM)'.
[2025-06-21 23:00:27] [INFO] Montage SSHFS de Multimedias@192.168.1.128:/home/Multimedias/MultimediasCommuns/Images...
[2025-06-21 23:00:27] [INFO] Montage SSHFS réussi.
[2025-06-21 23:00:27] [INFO] Démarrage Rsync pour 'Images (VM)'...
[2025-06-21 23:00:27] [INFO] Sauvegarde 'Images (VM)' réussie.
[2025-06-21 23:00:27] [INFO] Démontage de /tmp/sshfs_backups/images_vm...
[2025-06-21 23:00:27] [INFO] --- Fin Sauvegarde Distante : Images (VM) ---
[2025-06-21 23:00:27] [INFO] === Traitement de la sélection 4 ===
[2025-06-21 23:00:27] [INFO] --- Début Sauvegarde Distante : Musiques (VM) ---
[2025-06-21 23:00:27] [INFO] Vérification joignabilité de Multimedias@192.168.1.128...
[2025-06-21 23:00:29] [INFO] Hôte Multimedias@192.168.1.128 joignable.
[2025-06-21 23:00:29] [INFO] Utilisation du mode SSHFS pour 'Musiques (VM)'.
[2025-06-21 23:00:29] [INFO] Montage SSHFS de Multimedias@192.168.1.128:/home/Multimedias/MultimediasCommuns/Musiques...
[2025-06-21 23:00:29] [INFO] Montage SSHFS réussi.
[2025-06-21 23:00:29] [INFO] Démarrage Rsync pour 'Musiques (VM)'...
[2025-06-21 23:00:31] [INFO] Sauvegarde 'Musiques (VM)' réussie.
[2025-06-21 23:00:31] [INFO] Démontage de /tmp/sshfs_backups/musiques_vm...
[2025-06-21 23:00:31] [INFO] --- Fin Sauvegarde Distante : Musiques (VM) ---
[2025-06-21 23:00:31] [INFO] === Traitement de la sélection 8 ===
[2025-06-21 23:00:31] [INFO] --- Début Sauvegarde Distante : Documents Communs (VM) ---
[2025-06-21 23:00:31] [INFO] Vérification joignabilité de Multimedias@192.168.1.128...
[2025-06-21 23:00:32] [INFO] Hôte Multimedias@192.168.1.128 joignable.
df: /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsCommuns/: No such file or directory
[2025-06-21 23:00:32] [ERREUR] Espace disque insuffisant sur /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsCommuns/ (GB disponibles, 50GB requis).
[2025-06-21 23:00:32] [ERREUR] Pré-requis non satisfaits pour 'Documents Communs (VM)'. Sauvegarde ignorée.
[2025-06-21 23:00:32] [INFO] === Traitement de la sélection 16 ===
[2025-06-21 23:00:32] [INFO] --- Début Sauvegarde Locale : Documents Eric (Local) ---
df: /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsEric/: No such file or directory
[2025-06-21 23:00:32] [ERREUR] Espace disque insuffisant sur /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsEric/ (GB disponibles, 50GB requis).
[2025-06-21 23:00:32] [ERREUR] Pré-requis non satisfaits pour 'Documents Eric (Local)'. Sauvegarde ignorée.
[2025-06-21 23:00:32] [ERREUR] Script interrompu par signal ou erreur inattendue. Nettoyage...
[2025-06-21 23:00:32] [INFO] Verrou libéré.
kubu@kubu-System-Product-Name:~$
impressions:
1 - 22:53:15] [INFO] Sauvegardes pré-sélectionnées pour exécution automatique.
[2025-06-21 22:53:15] [INFO] Sélections pour exécution (6) : 1 2 4 8 16 32
pas de choix ; j’aurais préféré mais c’est ma faute pas examiné ton script sinon je l’aurais vu
2 - 22:51:18 blocage ? non la sauvegarde se fait et attente 6 mn un petit signal pour indiquer que c’est en cours ?
3 - 23:00:24 tout le reste va très vite
4 - 23:00:32] [ERREUR] Espace disque insuffisant sur /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsCommuns/ (GB disponibles, 50GB requis).
il y a de la place pourtant sur le 8T
mais c’est en train de me remplir le /home/kubu/ a 91% et 73 Go libres
erreur de chemin ??? vers le 8T
Dernière modification par eric63 (Le 21/06/2025, à 23:22)
Kubuntu 25.04 wayland Plasma 6.3.4 KDE Qt 6.12.0 noyau 6.14.0-15 Asus B760+D4 i5-12400F 4.4Ghz DDR4 32Go nvidia RTX 3060 12GB
Utilisez les drivers libres avant d’ installer une brother avec le script de demonipuch
J’utilise le clavier french AFNOR
Hors ligne
#242 Le 21/06/2025, à 23:38
- steph810
Re : script d’automatisation sauvegardes
Ces repertoires existe bien ?
/media/kubu/JEUX8T/SAUVEGARDES/
/media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsCommuns/
SauvegardesDocumentsEric/
CAUSE 1:
il faut qu'il soit creer avant avant que le script n'essaie d'y écrire
rsync ecrie la dernieres partie du chemin mais les répertoire parentes doivent existe et être accessibles.
CAUSE 2:
Le disque 8To non monté même s'il indique que monté et reconnue. voir permission répertoire et sou répertoire avec df
CAUSE 3:
Problème de permission: kubu a bien tous les droits en ecriture sur /media/kubu/JEUX8T/SAUVEGARDES/ lui et sous répertoire.
Diag immédiat:
ls -l /media/kubu/JEUX8T/SAUVEGARDES/
ls -l /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsCommuns/
ls -l /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsEric/
Si il n'existe pas:
mkdir -p /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsCommuns/
mkdir -p /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsEric/
Assure toi que tu est bien proprietaire:
sudo chown -R kubu:kubu /media/kubu/JEUX8T/SAUVEGARDES/
Hors ligne
#243 Le 21/06/2025, à 23:56
- steph810
Re : script d’automatisation sauvegardes
Résolutions des problèmes d'espace disque et de remplissage inattendu
Localiser L.138 # Fonction pour une sauvegarde locale
executer_sauvegarde_locale() {
modifier la fonction pour faire appel verifier permission en ecriture, la fonction corriger ci-dessous:
executer_sauvegarde_locale() {
local nom_sauvegarde="$1"
local source_path="$2"
local dest_path="$3"
local backup_dir="$4"
log_info "--- Début Sauvegarde Locale : $nom_sauvegarde ---"
# MODIFICATION ICI : Créer le répertoire et vérifier les permissions AVANT de vérifier l'espace
if ! verifier_permissions_ecriture "$dest_path"; then
log_error "Pré-requis (permissions/création répertoire) non satisfaits pour '$nom_sauvegarde'. Sauvegarde ignorée."
sauvegardes_echouees=$((sauvegardes_echouees + 1)) # On incrémente le compteur d'échecs ici
return 1
fi
if ! verifier_espace_disque "$dest_path" "$ESPACE_DISQUE_MIN_GO"; then
log_error "Pré-requis (espace disque) non satisfaits pour '$nom_sauvegarde'. Sauvegarde ignorée."
sauvegardes_echouees=$((sauvegardes_echouees + 1)) # On incrémente le compteur d'échecs ici
return 1
fi
# Le reste de la fonction reste inchangé
if executer_rsync "$nom_sauvegarde" "$source_path/" "$dest_path" "$backup_dir"; then
sauvegardes_reussies=$((sauvegardes_reussies + 1))
else
sauvegardes_echouees=$((sauvegardes_echouees + 1))
fi
log_info "--- Fin Sauvegarde Locale : $nom_sauvegarde ---"
}
Ligne.161 Localiser: # Fonction pour une sauvegarde distante
executer_sauvegarde_distante() {
Idem remplacer la fonction par celle ci dessous j'ai ajouter commentaire aux deux.
executer_sauvegarde_distante() {
local nom_sauvegarde="$1"
local remote_user="$2"
local remote_ip="$3"
local remote_source_path="$4"
local local_sshfs_mount_point="$5"
local rsync_destination="$6"
local backup_dir_suffix="$7"
log_info "--- Début Sauvegarde Distante : $nom_sauvegarde ---" #
# Vérification des pré-requis
if ! verifier_joignabilite_hote "$remote_user" "$remote_ip"; then #
log_error "Pré-requis non satisfaits pour '$nom_sauvegarde'. Sauvegarde ignorée."
sauvegardes_echouees=$((sauvegardes_echouees + 1))
return
fi
# AJOUT ICI : Créer le répertoire et vérifier les permissions AVANT de vérifier l'espace pour la destination finale
if ! verifier_permissions_ecriture "$rsync_destination"; then #
log_error "Pré-requis (permissions/création répertoire) non satisfaits pour '$nom_sauvegarde'. Sauvegarde ignorée."
sauvegardes_echouees=$((sauvegardes_echouees + 1))
return
fi
if ! verifier_espace_disque "$rsync_destination" "$ESPACE_DISQUE_MIN_GO"; then #
log_error "Pré-requis (espace disque) non satisfaits pour '$nom_sauvegarde'. Sauvegarde ignorée."
sauvegardes_echouees=$((sauvegardes_echouees + 1))
return
fi
# Logique de connexion et exécution
local rsync_source=""
local rsync_ssh_option=""
local success=0
if [ "$TYPE_CONNEXION_DISTANTE" -eq 0 ]; then # Mode SSHFS
log_info "Utilisation du mode SSHFS pour '$nom_sauvegarde'."
if monter_sshfs "$remote_user" "$remote_ip" "$remote_source_path" "$local_sshfs_mount_point"; then #
rsync_source="$local_sshfs_mount_point/" #
if executer_rsync "$nom_sauvegarde" "$rsync_source" "$rsync_destination" "$backup_dir_suffix"; then #
success=1
fi
demonter_sshfs "$local_sshfs_mount_point" # Démontage systématique
else
log_error "Impossible de monter le SSHFS pour '$nom_sauvegarde'."
fi
else # Mode SSH Direct
log_info "Utilisation du mode SSH Direct pour '$nom_sauvegarde'."
rsync_source="$remote_user@$remote_ip:$remote_source_path/"
rsync_ssh_option="-e ssh"
if executer_rsync "$nom_sauvegarde" "$rsync_source" "$rsync_destination" "$backup_dir_suffix" "$rsync_ssh_option"; then #
success=1
fi
fi
if [ "$success" -eq 1 ]; then
sauvegardes_reussies=$((sauvegardes_reussies + 1))
else
sauvegardes_echouees=$((sauvegardes_echouees + 1))
fi
log_info "--- Fin Sauvegarde Distante : $nom_sauvegarde ---"
}
Nettoyer les fichiers idésirables dans /home/kubu/ pour résoudres les problèmes d'espace disque
Dernière modification par steph810 (Le 21/06/2025, à 23:57)
Hors ligne
#244 Hier à 00:00
- eric63
Re : script d’automatisation sauvegardes
kubu@kubu-System-Product-Name:~$ ls -l /media/kubu/JEUX8T/SAUVEGARDES/
total 8
drwxrwxr-x 3 kubu kubu 4096 juin 21 23:00 incremental-Musiques
drwxrwxr-x 2 kubu kubu 4096 mai 26 2024 'Quo (Remaster)'
kubu@kubu-System-Product-Name:~$ ls -l /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsCommuns/
ls: cannot access '/media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsCommuns/': No such file or directory
kubu@kubu-System-Product-Name:~$ ls -l /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsEric/
ls: cannot access '/media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsEric/': No such file or directory
kubu@kubu-System-Product-Name:~$ mkdir -p /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsCommuns/
kubu@kubu-System-Product-Name:~$ mkdir -p /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsEric/
kubu@kubu-System-Product-Name:~$ sudo chown -R kubu:kubu /media/kubu/JEUX8T/SAUVEGARDES/
[sudo] password for kubu:
kubu@kubu-System-Product-Name:~$ ls -l /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsCommuns/
total 0
kubu@kubu-System-Product-Name:~$ ls -l /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsEric/
total 0
kubu@kubu-System-Product-Name:~$
ok pour les lignes a modifier 161 et 138
Dernière modification par eric63 (Hier à 00:16)
Kubuntu 25.04 wayland Plasma 6.3.4 KDE Qt 6.12.0 noyau 6.14.0-15 Asus B760+D4 i5-12400F 4.4Ghz DDR4 32Go nvidia RTX 3060 12GB
Utilisez les drivers libres avant d’ installer une brother avec le script de demonipuch
J’utilise le clavier french AFNOR
Hors ligne
#245 Hier à 00:11
- steph810
Re : script d’automatisation sauvegardes
Pour la maintenance possible de creer un fichier de configuration externe ????
Plus facile a maintenir "comme les fonctions" juste y ajouter userVM, ipVM les sources et destinations et la selection auto 1 2 4 8 16
Pour allez +loin.
Notif mail, retention sauvegarde incrémental (snapshot), nettoyage, exclusion (les fichier ont ne veut pas pas JAMAIS sauvegader), permissions source.
Mais ca va alourdir déjà s'il fonctionne sans erreur ca sera top
Hors ligne
#246 Hier à 00:13
- steph810
Re : script d’automatisation sauvegardes
kubu@kubu-System-Product-Name:~$ ls -l /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsCommuns/ ls: cannot access '/media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsCommuns/': No such file or directory kubu@kubu-System-Product-Name:~$ ls -l /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsEric/ ls: cannot access '/media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsEric/': No such file or directory
Erreur etais déjà présente dans le terminal pendant l'execution:
[2025-06-21 23:00:31] [INFO] Vérification joignabilité de Multimedias@192.168.1.128...
[2025-06-21 23:00:32] [INFO] Hôte Multimedias@192.168.1.128 joignable.
df: /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsCommuns/: No such file or directory
[2025-06-21 23:00:32] [ERREUR] Espace disque insuffisant sur /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsCommuns/ (GB disponibles, 50GB requis).
[2025-06-21 23:00:32] [ERREUR] Pré-requis non satisfaits pour 'Documents Communs (VM)'. Sauvegarde ignorée.
[2025-06-21 23:00:32] [INFO] === Traitement de la sélection 16 ===
[2025-06-21 23:00:32] [INFO] --- Début Sauvegarde Locale : Documents Eric (Local) ---
df: /media/kubu/JEUX8T/SAUVEGARDES/SauvegardesDocumentsEric/: No such file or directory
Tu as rajouter a la main après c'est ca ?
Tu a executer les commandes de résolutions ? pendant la sauvegarde si oui c'est normal c'étais trop tard
si non dit le moi.
Avec les modifications lorsque le script s'exécutera, il vérifiera l'existence de ces répertoires et les créera si nécessaire avant de tenter la sauvegarde, ce qui devrait éliminer cette erreur "No such file or directory"
Dernière modification par steph810 (Hier à 00:39)
Hors ligne
#247 Hier à 02:01
- steph810
Re : script d’automatisation sauvegardes
Dernière chose qui pourra être utile je vien de le générer:
Un MAN je conseille VIVEMENTd'installer et de le consulter, surtout la section DIAGNOSTICS et scénarios.
Installation:
Le man en question:
Copier et enregistrer-sous:
sauvegarde_automatique.man
.TH SAUVEGARDE_AUTOMATIQUE 1 "22 June 2025" "5.2" "Script de Sauvegarde Personnelle"
.SH NAME
sauvegarde_automatique - un script Bash refactorisé pour la sauvegarde incrémentale de fichiers locaux et distants
.SH SYNOPSIS
\fBsauvegarde_automatique\fR [\fIvariable_interne\fR=\fIvaleur\fR]...
.SH DESCRIPTION
Le script \fBsauvegarde_automatique\fR, version 5.2, est un outil puissant et flexible conçu
pour automatiser la sauvegarde de vos données importantes, qu'elles soient stockées localement
sur votre machine ou sur des hôtes distants (VM, portable, serveur). Il utilise \fBrsync\fR(1)
pour effectuer des sauvegardes incrémentales, optimisant ainsi l'espace disque et le temps
nécessaire à chaque exécution.
Cette version a été profondément refactorisée pour améliorer sa modularité, sa robustesse,
et sa capacité de diagnostic. Elle intègre des fonctions dédiées pour la journalisation,
la vérification des dépendances, la gestion des connexions SSH/SSHFS, et la détection
des erreurs.
Les principales fonctionnalités incluent :
.IP \(bu 4
**Sauvegardes Incrémentales :** Utilise \fBrsync\fR(1) avec l'option \fB--backup\fR et
\fB--backup-dir\fR pour créer des sauvegardes delta. Seuls les fichiers modifiés ou
nouveaux sont copiés, et les anciennes versions des fichiers modifiés sont déplacées
vers un répertoire horodaté, permettant de retrouver des versions antérieures.
.IP \(bu 4
**Gestion des Connexions Distantes :** Supporte deux modes pour les sources distantes :
.IP \(bu 4
\fBSSHFS :\fR Monte le répertoire distant localement avant l'exécution de \fBrsync\fR.
Ceci est souvent plus fiable pour des chemins complexes ou des problèmes de permissions
sur le serveur distant.
.IP \(bu 4
\fBSSH Direct :\fR Utilise \fBrsync\fR directement via SSH pour transférer les fichiers.
Plus direct mais peut nécessiter une configuration SSH sans mot de passe.
.IP \(bu 4
**Vérifications Préalables Robustes :** Avant chaque sauvegarde, le script vérifie la
joignabilité des hôtes distants (\fBping\fR(8), \fBssh\fR(1)), la présence de l'espace
disque suffisant sur la destination, et les permissions d'écriture.
.IP \(bu 4
**Journalisation Détaillée :** Toutes les opérations sont enregistrées dans des fichiers
journaux dédiés (\fIinfo\fR, \fIdebug\fR, \fIerror\fR) pour un suivi et un diagnostic faciles.
.IP \(bu 4
**Gestion des Erreurs Avancée :** Intègre un fichier de fonctions d'erreur externe
(\fI[chemin_vers_fonctions_erreur.sh]\fR) pour une gestion cohérente et des diagnostics précis des
problèmes rencontrés.
.IP \(bu 4
**Verrouillage d'Instance :** Utilise un fichier de verrouillage (\fI/tmp/backup_script.lock\fR)
pour s'assurer qu'une seule instance du script s'exécute à la fois, évitant ainsi les conflits.
.IP \(bu 4
**Nettoyage Automatique :** Supprime les anciens fichiers journaux pour maintenir l'ordre
et économiser de l'espace.
.IP \(bu 4
**Personnalisation Facile :** Les sources, destinations, utilisateurs et modes de connexion
sont définis via des variables claires en début de script, facilitant l'adaptation à
votre environnement.
.SH OPTIONS
Le script \fBsauvegarde_automatique\fR est configuré principalement via des **variables internes**
situées en début de fichier. Pour modifier le comportement du script, vous devrez éditer
le fichier \fIsauvegarde.sh\fR lui-même.
.TP
\fBMODE_DEBOGAGE\fR (0 ou 1)
Contrôle l'activation des journaux de débogage. Si mis à \fB1\fR, des informations
détaillées sur l'exécution interne du script sont écrites dans \fIdebug_*.log\fR.
Par défaut : \fB0\fR (désactivé).
.TP
\fBTYPE_CONNEXION_DISTANTE\fR (0 ou 1)
Définit le mode de connexion utilisé pour les sauvegardes distantes.
.IP \(bu 4
\fB0 :\fR Utilise \fBSSHFS\fR (nécessite le montage SSHFS et le démontage après la sauvegarde).
.IP \(bu 4
\fB1 :\fR Utilise \fBSSH Direct\fR (\fBrsync\fR communique directement via SSH).
Par défaut : \fB0\fR (SSHFS).
.TP
\fBJOURNAUX_DESACTIVES\fR (0 ou 1)
Permet de désactiver complètement toute journalisation si mis à \fB1\fR.
Utile pour des tests très rapides sans encombrer les logs.
Par défaut : \fB0\fR (activé).
.TP
\fBSELECTIONS_SAUVEGARDES\fR (liste de chiffres séparés par des espaces)
C'est la variable clé pour contrôler quelles sauvegardes sont exécutées. Chaque chiffre
correspond à un type de sauvegarde défini dans la section \fBSCRIPT PRINCIPAL\fR
(par exemple, \fB1\fR pour Photos VM, \fB2\fR pour Images VM, etc.).
Modifiez cette liste pour inclure ou exclure des types de sauvegardes spécifiques.
Par défaut : \fB"1 2 4 8 16 32"\fR (valeur tirée du script fourni).
.TP
\fBVariables de chemin et d'utilisateur (ex : ipVM, userVM, PointMontageDisque, DEST_BASE_SAUVEGARDES)\fR
Ces variables définissent les adresses IP, les noms d'utilisateur, les chemins source
et destination, et les points de montage SSHFS. Elles doivent être adaptées à votre
environnement spécifique pour que le script fonctionne correctement.
\fBIMPORTANT :\fR Il est impératif de vérifier et de personnaliser ces variables
au début du script \fIsauvegarde.sh\fR selon votre configuration.
.SH EXAMPLES
Voici des exemples concrets d'utilisation et de configuration de \fBsauvegarde_automatique\fR.
.IP \(bu 4
**Exécution de base (avec la configuration interne actuelle) :**
.nf
\fBsauvegarde_automatique\fR
.fi
Lance toutes les sauvegardes définies dans la variable \fBSELECTIONS_SAUVEGARDES\fR
du script, en utilisant les paramètres de connexion, de chemins et de journalisation
spécifiés en début de fichier.
.IP \(bu 4
**Modification du script pour un mode de débogage activé :**
1. Ouvrez le script :
.nf
nano /chemin/vers/votre/script/sauvegarde.sh
.fi
2. Changez la ligne :
.nf
MODE_DEBOGAGE=0
.fi
en :
.nf
MODE_DEBOGAGE=1
.fi
3. Enregistrez et quittez. Lors de la prochaine exécution, des journaux détaillés
seront créés dans \fI$HOME/log/backup-script/debug_*.log\fR.
.IP \(bu 4
**Exécution d'une seule sauvegarde spécifique (par exemple, la sélection "32") :**
1. Ouvrez le script :
.nf
nano /chemin/vers/votre/script/sauvegarde.sh
.fi
2. Changez la ligne :
.nf
SELECTIONS_SAUVEGARDES="1 2 4 8 16 32"
.fi
en :
.nf
SELECTIONS_SAUVEGARDES="32"
.fi
3. Enregistrez et quittez. Le script n'exécutera alors que la sauvegarde des Projets Serveur
(si la sélection 32 correspond à cela dans votre script).
N'oubliez pas de remettre les sélections par défaut après cette exécution ponctuelle si nécessaire.
.SH FILES
Le script \fBsauvegarde_automatique\fR interagit avec les fichiers et répertoires suivants :
.TP
\fI/chemin/vers/votre/script/sauvegarde.sh\fR
Le fichier exécutable principal du script \fBsauvegarde_automatique\fR.
.TP
\fI[chemin_vers_fonctions_erreur.sh]\fR
Un fichier externe critique dont le chemin est défini dans le script (ex: \fB/home/votre_utilisateur/ScriptsImportants/fonctions_erreur.sh\fR).
Il contient les fonctions \fBgerer_erreur_fatale\fR et \fBdiagnostiquer_et_logger_erreur\fR
utilisées pour la gestion avancée des erreurs. Si ce fichier est introuvable, le script affichera une erreur critique et s'arrêtera.
.TP
\fI/tmp/backup_script.lock\fR
Fichier de verrouillage utilisé par la fonction \fBacquerir_verrou\fR pour empêcher
plusieurs instances du script de s'exécuter simultanément. Ce fichier est
automatiquement créé au début du script et supprimé à la fin. Si le script
s'arrête anormalement, il peut persister et nécessiter une suppression manuelle.
.TP
\fI$HOME/log/backup-script/\fR
Répertoire où tous les fichiers journaux sont stockés. La variable
\fBREPERTOIRE_JOURNAUX\fR (définie dans le script) spécifie son chemin complet.
Les anciens journaux (\fBplus de 30 jours\fR) sont automatiquement nettoyés.
.TP
\fI$HOME/log/backup-script/backup_YYYYMMDD_HHMM.log\fR
Le fichier journal principal qui enregistre toutes les informations
d'exécution (\fIINFO\fR, \fIWARNING\fR, \fIERREUR\fR). C'est le premier endroit
à consulter pour comprendre le déroulement des sauvegardes.
.TP
\fI$HOME/log/backup-script/debug_YYYYMMDD_HHMM.log\fR
Fichier journal de débogage, activé via \fBMODE_DEBOGAGE=1\fR. Contient des
informations très détaillées sur chaque étape du script, utile pour
diagnostiquer des problèmes complexes.
.TP
\fI$HOME/log/backup-script/error_YYYYMMDD_HHMM.log\fR
Ce fichier capture spécifiquement tous les messages d'erreur et de sortie
d'erreurs (\fIstderr\fR) des commandes exécutées par le script, comme \fBrsync\fR.
Il est essentiel pour comprendre la nature exacte d'un échec de commande.
.TP
\fI[Point_de_montage_disque_externe]/\fR
Le chemin vers le point de montage de la partition de destination de la sauvegarde.
L'UUID de cette partition est vérifié pour s'assurer que le bon disque est connecté.
(Définie par la variable \fBPointMontageDisque\fR).
.TP
\fI/tmp/sshfs_backups/\fR
Répertoire de base pour les points de montage temporaires SSHFS. Le script
crée des sous-répertoires spécifiques pour chaque source distante montée.
(Définie par la variable \fBBASE_MONTAGE_SSHFS\fR).
.SH DIAGNOSTICS
Cette section fournit des informations détaillées sur la résolution des problèmes et la
compréhension des messages d'erreur générés par \fBsauvegarde_automatique\fR.
.SS Comprendre les Codes de Retour (Exit Codes)
Lorsqu'un script Bash se termine, il renvoie un code numérique. Ce code est crucial pour
déterminer si l'exécution a été un succès ou un échec. Vous pouvez toujours voir le
code de retour de la dernière commande exécutée en tapant \fBecho $?\fR dans le terminal.
.TP
\fB0\fR (Zéro)
Indique un \fBsuccès total\fR. Le script s'est exécuté jusqu'à la fin sans
rencontrer d'erreurs critiques. Les sauvegardes sélectionnées ont été
tentées et leurs résultats individuels sont consignés dans le journal.
.TP
\fB1\fR (ou autre valeur non-zéro générale)
Indique une \fBerreur générale\fR non classifiée spécifiquement, ou un
problème interne du script. Souvent, cela signifie qu'une commande a échoué.
.TP
\fB100\fR
\fBEspace disque insuffisant\fR sur le disque de destination de la sauvegarde.
(Code de sortie spécifique utilisé par la fonction \fBgerer_erreur_fatale\fR du script).
.TP
\fB103\fR
\fBVerrou d'instance\fR : Une autre instance du script \fBsauvegarde_automatique\fR
est déjà en cours d'exécution.
(Code de sortie spécifique utilisé par la fonction \fBgerer_erreur_fatale\fR du script).
.TP
\fB104\fR
\fBDépendance manquante\fR : Une commande essentielle (\fBrg. rsync, sshfs, flock\fR)
n'est pas installée sur le système.
(Code de sortie spécifique utilisé par la fonction \fBgerer_erreur_fatale\fR du script).
.TP
\fB105\fR
\fBDisque de sauvegarde non reconnu\fR : L'UUID de la partition de destination
ne correspond pas à celui attendu, ou le disque n'est pas monté.
(Code de sortie spécifique utilisé par la fonction \fBgerer_erreur_fatale\fR du script).
.TP
\fB127\fR
\fBCommande introuvable\fR : Indique qu'une commande appelée par le script n'a
pas été trouvée dans le \fB$PATH\fR. Peut être liée à une dépendance manquante.
.SS Scénarios d'Erreurs Fréquents et Solutions Détaillées
Lorsque des problèmes surviennent, la première étape est de consulter les fichiers journaux
(en particulier \fIbackup_*.log\fR et \fIerror_*.log\fR) dans \fI$HOME/log/backup-script/\fR.
.TP
\fI"ERREUR CRITIQUE: Le fichier [chemin_vers_fonctions_erreur.sh] est introuvable."\fR
\fIContexte :\fR Erreur affichée au démarrage, avant même la journalisation.
\fICause :\fR Le script ne peut pas trouver le fichier externe des fonctions d'erreur,
dont il dépend pour son bon fonctionnement.
\fISolution :\fR
1. Assurez-vous que le fichier \fI[chemin_vers_fonctions_erreur.sh]\fR existe à l'emplacement spécifié.
2. Vérifiez les permissions de lecture pour ce fichier :
.nf
ls -l [chemin_vers_fonctions_erreur.sh]
# Ex: ls -l /home/votre_utilisateur/ScriptsImportants/fonctions_erreur.sh
.fi
Si les permissions ne sont pas suffisantes (pas de 'r' pour l'utilisateur qui exécute le script), ajustez-les :
.nf
chmod +r [chemin_vers_fonctions_erreur.sh]
# Ou chmod 644 [chemin_vers_fonctions_erreur.sh]
.fi
3. Si le chemin est différent, modifiez la ligne \fBsource\fR en début de \fIsauvegarde.sh\fR pour pointer vers le bon emplacement.
.TP
\fI"[ERREUR] Dépendance manquante: [nom_dépendance]"\fR (Code de sortie : 104)
\fIContexte :\fR Le script s'arrête car une commande essentielle n'est pas installée sur votre système.
\fICause :\fR Une ou plusieurs des commandes \fBrsync\fR, \fBsshfs\fR ou \fBflock\fR (fournie par \fButil-linux\fR) sont absentes.
\fISolution :\fR Installez la dépendance manquante en utilisant le gestionnaire de paquets de votre distribution (ex: pour Debian/Ubuntu) :
.nf
sudo apt update
sudo apt install rsync sshfs util-linux # util-linux fournit flock
.fi
.TP
\fI"[ERREUR] Une autre instance du script est déjà en cours."\fR (Code de sortie : 103)
\fIContexte :\fR Le script se termine immédiatement après le démarrage.
\fICause :\fR Un fichier de verrouillage (\fI/tmp/backup_script.lock\fR) existe. Cela peut signifier qu'une autre instance est active, ou que la dernière exécution s'est terminée anormalement sans libérer le verrou.
\fISolution :\fR
1. Vérifiez s'il y a une autre instance en cours d'exécution de votre script :
.nf
ps aux | grep [nom_de_votre_script].sh | grep -v grep
.fi
2. Si aucune autre instance n'est active, supprimez manuellement le fichier de verrouillage :
.nf
sudo rm /tmp/backup_script.lock
.fi
3. Relancez le script.
.TP
\fI"[ERREUR] Disque de sauvegarde non reconnu (UUID attendu: [...])"\fR (Code de sortie : 105)
\fIContexte :\fR Le script ne parvient pas à vérifier l'UUID de votre disque de sauvegarde à son point de montage configuré.
\fICause :\fR
.IP \(bu 4
Le disque externe n'est pas branché ou allumé.
.IP \(bu 4
Le disque est branché mais n'est pas monté automatiquement au point de montage défini dans le script (\fBPointMontageDisque\fR).
.IP \(bu 4
L'UUID défini dans la variable \fBUUID_Partition\fR du script ne correspond pas à celui de la partition de votre disque de sauvegarde actuel.
\fISolution :\fR
1. Branchez le disque externe et assurez-vous qu'il est correctement monté. Vérifiez le point de montage :
.nf
df -h | grep "[Point_de_montage_disque_externe]"
# Ex: df -h | grep "/media/votre_utilisateur/MON_DISQUE"
.fi
2. Vérifiez le point de montage défini par la variable \fBPointMontageDisque\fR dans le script.
3. Trouvez l'UUID correct de votre partition de sauvegarde si vous avez des doutes :
.nf
sudo blkid | grep "[Point_de_montage_disque_externe]"
# Ou pour lister tous les UUIDs :
ls -l /dev/disk/by-uuid/
.fi
Et mettez à jour la variable \fBUUID_Partition\fR dans le script \fIsauvegarde.sh\fR.
.TP
\fI"[ERREUR] Espace disque insuffisant sur [chemin]" \fR (Code de sortie : 100)
\fIContexte :\fR Le script détecte que l'espace libre sur la destination de sauvegarde est inférieur à la valeur minimale requise (\fBESPACE_DISQUE_MIN_GO\fR, par défaut 50 Go).
\fICause :\fR La destination de sauvegarde est presque pleine ou ne dispose pas de l'espace jugé suffisant par le script pour continuer.
\fISolution :\fR
1. Libérez de l'espace sur le disque de destination. Vous pouvez lister les plus gros fichiers ou dossiers pour identifier les cibles :
.nf
sudo du -sh /chemin/vers/votre/destination/* | sort -rh | head -n 10
.fi
2. Si vous êtes certain que moins d'espace est suffisant pour vos besoins, vous pouvez ajuster la variable \fBESPACE_DISQUE_MIN_GO\fR dans le script \fIsauvegarde.sh\fR.
.TP
\fI"[ERREUR] Ping échoué vers [IP]" \fR ou \fI"Connexion SSH échouée vers [utilisateur]@[IP]"\fR
\fIContexte :\fR Le script ne parvient pas à établir une connexion réseau ou SSH avec un hôte distant avant de tenter une sauvegarde distante.
\fICause :\fR
.IP \(bu 4
L'hôte distant est éteint, non connecté au réseau, ou n'est pas joignable depuis la machine exécutant le script.
.IP \(bu 4
Problème réseau (câble débranché, Wi-Fi désactivé, routeur défectueux).
.IP \(bu 4
Un pare-feu (\fBufw\fR, \fBiptables\fR) bloque le ping ou la connexion SSH sur l'hôte distant ou sur la machine locale.
.IP \(bu 4
Adresse IP ou nom d'utilisateur incorrect dans les variables du script (\fBipVM\fR, \fBuserVM\fR, etc.).
.IP \(bu 4
Clé SSH manquante, incorrecte ou non autorisée pour la connexion sans mot de passe.
\fISolution :\fR
1. Assurez-vous que l'hôte distant est allumé, connecté au réseau, et accessible.
2. Vérifiez les adresses IP et les noms d'utilisateur dans les variables de configuration du script \fIsauvegarde.sh\fR.
3. Testez manuellement la connectivité depuis votre terminal :
.nf
ping -c 3 [IP_de_l_hote_distant]
ssh [utilisateur_distant]@[IP_de_l_hote_distant]
.fi
4. Vérifiez les configurations de pare-feu sur les deux machines (locale et distante).
5. Assurez-vous que les clés SSH sont correctement configurées pour l'authentification sans mot de passe (consultez \fBssh-keygen\fR(1) et \fBssh-agent\fR(1)).
.TP
\fI"[ERREUR] Échec du montage SSHFS."\fR
\fIContexte :\fR Lorsque \fBTYPE_CONNEXION_DISTANTE\fR est réglé sur 0, le script n'arrive pas à monter le répertoire distant via SSHFS.
\fICause :\fR Problèmes similaires aux échecs de connexion SSH, ou permissions sur le point de montage local (\fB/tmp/sshfs_backups\fR), ou chemin distant SSHFS incorrect.
\fISolution :\fR
1. Vérifiez la connectivité SSH (`ssh [utilisateur]@[IP]`).
2. Assurez-vous que le répertoire local pour SSHFS (\fBBASE_MONTAGE_SSHFS\fR et ses sous-dossiers) existe et que le script a les permissions d'y écrire/créer des dossiers :
.nf
ls -ld [Point_de_montage_SSHFS_local_temporaire]
# Ex: ls -ld /tmp/sshfs_backups/photos_vm
.fi
Si les permissions sont incorrectes, utilisez `chmod` ou `chown`.
3. Tentez le montage SSHFS manuellement pour voir les messages d'erreur détaillés :
.nf
sshfs [utilisateur]@[IP]:/chemin/distant/sur/serveur [Point_de_montage_SSHFS_local_temporaire] -o reconnect,ServerAliveInterval=15
.fi
.TP
\fI"[ERREUR] Impossible de créer le répertoire .rsync-partial"\fR ou \fI"Pas de permission d'écriture dans [chemin]"\fR
\fIContexte :\fR La commande \fBrsync\fR ne peut pas écrire dans le répertoire de destination de la sauvegarde.
\fICause :\fR L'utilisateur exécutant le script n'a pas les droits d'écriture sur le dossier de destination spécifié (par exemple, \fBDEST_BASE_SAUVEGARDES\fR).
\fISolution :\fR
1. Vérifiez les permissions du répertoire de destination. Le script doit avoir la permission d'écriture (w) sur ce dossier :
.nf
ls -ld [Chemin_vers_votre_destination_de_sauvegarde]
# Ex: ls -ld /media/votre_utilisateur/MON_DISQUE/SAUVEGARDES/
.fi
2. Donnez les permissions d'écriture nécessaires à l'utilisateur exécutant le script (remplacez `votre_utilisateur` par votre nom d'utilisateur Linux et `votre_groupe` par votre groupe principal si nécessaire) :
.nf
sudo chown votre_utilisateur:votre_groupe [Chemin_vers_votre_destination_de_sauvegarde]
sudo chmod u+w [Chemin_vers_votre_destination_de_sauvegarde] # Ajoute le droit d'écriture à l'utilisateur propriétaire
# Ou pour un accès plus large si nécessaire (attention aux risques de sécurité) :
# sudo chmod a+w [Chemin_vers_votre_destination_de_sauvegarde] # Ajoute le droit d'écriture à tous
.fi
3. Assurez-vous également que la source est lisible par l'utilisateur du script.
.TP
\fI"[ERREUR] Échec de la sauvegarde Rsync pour '[nom_sauvegarde]'"\fR
\fIContexte :\fR La commande \fBrsync\fR a retourné une erreur (code de sortie non-zéro), ce qui signifie que la copie n'a pas été effectuée correctement pour cette source.
\fICause :\fR Problèmes variés, incluant : problème de lecture depuis la source, problème d'écriture vers la destination, problème réseau (si distante), ou des arguments `rsync` incorrects (peu probable avec ce script). La cause exacte est souvent détaillée dans le fichier \fIerror_*.log\fR.
\fISolution :\fR
1. \fBVérifiez immédiatement le fichier \fI$HOME/log/backup-script/error_*.log\fR correspondant à l'heure de l'échec.\fR Ce fichier contient la sortie exacte de \fBrsync\fR, qui est cruciale pour le diagnostic précis (ex: "Permission denied", "No such file or directory", "Host key verification failed").
2. Vérifiez que la source (\fBSOURCE_VM_PHOTOS\fR, etc., définie dans le script) existe et est lisible par l'utilisateur du script. Pour vérifier un chemin source :
.nf
ls -ld [Chemin_vers_la_source]
# Ex: ls -ld /home/votre_utilisateur/Documents/PhotosVM/
.fi
3. Vérifiez que la destination (\fBDEST_BASE_SAUVEGARDES\fR, etc.) est accessible et inscriptible, comme détaillé dans le point de diagnostic précédent.
4. Si la sauvegarde est distante, assurez-vous que la connexion SSH/SSHFS est stable et que les chemins distants sont corrects. Vous pouvez essayer un `ls` distant via SSH pour vérifier l'accès à la source distante :
.nf
ssh [utilisateur_distant]@[IP_de_l_hote_distant] "ls -ld /chemin/distant/sur/serveur/source/"
.fi
5. Si les informations dans \fIerror_*.log\fR ne suffisent pas, activez \fBMODE_DEBOGAGE=1\fR et réexécutez pour obtenir un log encore plus détaillé.
.SS Conseils Généraux de Dépannage
.IP \(bu 4
\fBConsultez les journaux en temps réel :\fR Ouvrez un terminal et utilisez \fBtail -f\fR sur le fichier de log principal (\fIbackup_*.log\fR), le fichier de log d'erreurs (\fIerror_*.log\fR) et le fichier de debug (si \fBMODE_DEBOGAGE=1\fR) pendant que le script s'exécute dans un autre terminal. Cela vous donnera des informations précieuses en direct.
.nf
tail -f $HOME/log/backup-script/backup_$(date +%Y%m%d)*.log
tail -f $HOME/log/backup-script/error_$(date +%Y%m%d)*.log
tail -f $HOME/log/backup-script/debug_$(date +%Y%m%d)*.log # Si MODE_DEBOGAGE=1
.fi
.IP \(bu 4
\fBVérifiez les variables de configuration :\fR La plupart des problèmes viennent d'un chemin, d'un utilisateur, d'une IP ou d'une UUID mal configurée au début du script. Relisez-les attentivement dans \fIsauvegarde.sh\fR.
.IP \(bu 4
\fBTestez les composants isolément :\fR Si la sauvegarde distante échoue, testez \fBping\fR, \fBssh\fR et \fBsshfs\fR (si utilisé) séparément dans le terminal pour isoler le problème réseau ou de connexion.
.IP \(bu 4
\fBRecherchez en ligne :\fR Copiez-collez les messages d'erreur exacts (surtout ceux de `rsync`, `sshfs`, `ssh`) dans un moteur de recherche. La vaste communauté Linux a souvent déjà documenté des solutions pour des problèmes similaires.
.IP \(bu 4
\fBActivez le Mode Débogage :\fR Activez toujours \fBMODE_DEBOGAGE=1\fR pour obtenir le maximum d'informations lorsque vous résolvez un problème complexe.
.SH SEE ALSO
Les pages de manuel suivantes fournissent des informations complémentaires essentielles :
.TP
\fBrsync\fR(1)
L'utilitaire de synchronisation de fichiers au cœur de ce script. Indispensable pour comprendre comment les sauvegardes sont effectuées.
.TP
\fBsshfs\fR(1)
Le client de système de fichiers SSH qui permet de monter des répertoires distants via SSH.
.TP
\fBfstab\fR(5)
Fichier de configuration système (\fI/etc/fstab\fR) utilisé pour définir les systèmes de fichiers à monter automatiquement au démarrage, y compris les montages SSHFS persistants.
.TP
\fBssh\fR(1), \fBssh-keygen\fR(1), \fBssh-agent\fR(1)
Les outils SSH de base pour la connectivité sécurisée aux hôtes distants.
.TP
\fBflock\fR(1)
Pour la gestion des verrous de fichiers, utilisée pour éviter les exécutions concurrentes du script.
.TP
\fBping\fR(8)
Utilitaire pour tester la connectivité réseau à un hôte.
.TP
\fBawk\fR(1), \fBsed\fR(1)
Outils de traitement de texte puissants, utilisés dans les fonctions utilitaires du script.
.TP
\fBfindmnt\fR(8)
Utilitaire pour localiser les systèmes de fichiers montés, utilisé pour vérifier l'UUID du disque.
.TP
\fBfusermount\fR(1)
Outil pour démonter les systèmes de fichiers FUSE, comme SSHFS.
.TP
\fBcron\fR(8), \fBcrontab\fR(1)
Pour automatiser l'exécution de \fBsauvegarde_automatique\fR à des intervalles réguliers.
.SH BUGS
Pour signaler tout bogue, comportement inattendu ou pour proposer des
améliorations pour \fBsauvegarde_automatique\fR, consulter l'adresse suivante :
https://forum.ubuntu-fr.org/viewtopic.php?id=2091380.
.SH AUTHOR
eric63 (Basé sur des contributions de geole, iznobe, Watael, steph810 sans oublier le forum Ubuntu-fr)
Date de refactorisation majeure : 2025-06-21
(C) 2025 - Tous droits réservés.
# Ajout man
echo $MANPATH
man --path
sudo cp ./sauvegarde_automatique.man /usr/local/man/man1/sauvegarde_automatique.1
ls -l /usr/local/man/man1/sauvegarde_automatique.1
sudo gzip -f /usr/local/man/man1/sauvegarde_automatique.1
ls -l /usr/local/man/man1/sauvegarde_automatique.1.gz
sudo mandb
man sauvegarde_automatique
Le consulter une fois installé:
man sauvegarde_automatique
# Suppression man
sudo rm /usr/local/man/man1/sauvegarde_automatique.1.gz
sudo mandb
Dernière modification par steph810 (Hier à 02:27)
Hors ligne
#248 Hier à 07:58
- eric63
Re : script d’automatisation sauvegardes
je dois pas savoir comment m’y prendre correctement
kubu@kubu-System-Product-Name:~$ echo $MANPATH
kubu@kubu-System-Product-Name:~$ man --path
/usr/local/man:/usr/local/share/man:/usr/share/man
kubu@kubu-System-Product-Name:~$ sudo cp ./sauvegarde_automatique.man /usr/local/man/man1/sauvegarde_automatique.1
[sudo] password for kubu:
cp: cannot stat './sauvegarde_automatique.man': No such file or directory
kubu@kubu-System-Product-Name:~$ ls -l /usr/local/man/man1/sauvegarde_automatique.1
ls: cannot access '/usr/local/man/man1/sauvegarde_automatique.1': No such file or directory
kubu@kubu-System-Product-Name:~$ sudo cp ./sauvegarde_automatique.man /usr/local/share/man/man1/sauvegarde_automatique.1
cp: cannot stat './sauvegarde_automatique.man': No such file or directory
kubu@kubu-System-Product-Name:~$ sudo cp home/kubu/ScriptVMImportants/sauvegarde_automatique.man /usr/local/man/man1/sauvegarde_automatique.1
cp: cannot stat 'home/kubu/ScriptVMImportants/sauvegarde_automatique.man': No such file or directory
kubu@kubu-System-Product-Name:
j’ai un autre problème dolphin rame à mort pour ouvrir n’importe quel dossier ??? depuis hier
la faute au fstab ???? parce que cela arrive dès le début de la session pas de script en cours pas de disque
Kubuntu 25.04 wayland Plasma 6.3.4 KDE Qt 6.12.0 noyau 6.14.0-15 Asus B760+D4 i5-12400F 4.4Ghz DDR4 32Go nvidia RTX 3060 12GB
Utilisez les drivers libres avant d’ installer une brother avec le script de demonipuch
J’utilise le clavier french AFNOR
Hors ligne
#249 Hier à 08:03
- iznobe
Re : script d’automatisation sauvegardes
ça c’est moins bien
kubu@kubu-System-Product-Name:~$ sudo mount -av / : ignored /boot/efi : already mounted /home : already mounted /home/kubu/VMMultimedias : ignored /home/kubu/VMMultimedias/VMSauvegardesDocuments/VMSauvegardesDocumentsFanou: already mounted kubu@kubu-System-Product-Name:~$
Salut , au contraire , c ' est que c' est bon
il suffit d' enlever l ' option " noauto " que je t ' avais fais ajouter pour faire un test avec le gestionnaire de fichiers .
tu as :
Multimedias@192.168.1.128:/home/Multimedias /home/kubu/VMMultimedias fuse.sshfs port=22,user,noauto,noatime,x-systemd.mount-timeout=3,_netdev,delay_connect,idmap=user,transform_symlinks,identityfile=/home/kubu/.ssh/id_ed25519,default_permissions,uid=1001,gid=1001,allow_other
il faut :
Multimedias@192.168.1.128:/home/Multimedias /home/kubu/VMMultimedias fuse.sshfs port=22,user,noatime,x-systemd.mount-timeout=3,_netdev,delay_connect,idmap=user,transform_symlinks,identityfile=/home/kubu/.ssh/id_ed25519,default_permissions,uid=1001,gid=1001,allow_other
puis verifie que pas d' erreur :
sudo mount -a
si ok , redemarre , puis montre
grep sshfs /etc/mtab
qui doit montrer que les 2 partages sont montés automatiquement au demarrage .
Dernière modification par iznobe (Hier à 08:05)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#250 Hier à 09:16
- eric63
Re : script d’automatisation sauvegardes
GGRRRRRR mozilla m’a tuer surtout mes mdp enfin tout quoi
purée c’est la deuxième fois impossible de retrouver ma synchro
mais je persiste à rester chez eux
kubu@kubu-System-Product-Name:~$ grep sshfs /etc/mtab
Multimedias@192.168.1.128:/home/Multimedias /home/kubu/VMMultimedias fuse.sshfs rw,nosuid,nodev,noexec,noatime,user_id=0,group_id=0,default_permissions,allow_other 0 0
fanou@192.168.1.60:/home/fanou/Documents /home/kubu/VMMultimedias/VMSauvegardesDocuments/VMSauvegardesDocumentsFanou fuse.sshfs rw,nosuid,nodev,noexec,noatime,user_id=0,group_id=0,default_permissions,allow_other 0 0
kubu@kubu-System-Product-Name:~$
donc tout c’est ok
par contre y a un truc qui ne fonctionne pas bien c‘est les incremental
je me retrouve avec des dossiers incremental imbriqués les uns dans les autres et pas toujours du même genre ???
kubu@kubu-System-Product-Name:/media/kubu/JEUX8T/SAUVEGARDES/incremental-Musiques/[u]2025-06-21_22h53/incremental-Images[/u]/2025-06-21_22h53[u]/incremental-Images/[/u]2025-06-21_22h53[u]/incremental-Photos/[/u]2025-06-21_22h53/Photos$
c’est très compliqué à lire pour pas dire plus
pourquoi les incremental ne sont pas à coté de leurs dossiers respectifs et les dates seraient dans ces dossiers incremental
exemple de ce que je voudrais pour une sauvegarde des documents dans la VM
DocumentsPartages
kubu@kubu-System-Product-Name:~/VMMultimedias$ ls -l
total 12
drwxrwxr-x 1 kubu kubu 4096 juin 18 10:34 DocumentsPartages
et à coté son dossier incremental-DocumentsPartages
drwxrwxr-x 1 kubu kubu 4096 mai 27 13:13 MultimediasCommuns
drwxr-xr-x 1 kubu kubu 4096 juin 21 09:18 VMSauvegardesDocuments
idem pour les documents
kubu@kubu-System-Product-Name:~/VMMultimedias/VMSauvegardesDocuments$ ls -l
ls: cannot access 'VMSauvegardesDocumentsFanou': Input/output error
total 4
drwxr-xr-x 1 kubu kubu 4096 juin 22 07:26 VMSauvegardesDocumentsEric
et à coté son dossier incremental-DocumentsEric
d????????? ? ? ? ? ? VMSauvegardesDocumentsFanou
et à coté son dossier incremental-DocumentsFanou
et dans le dossier SAUVEGARDE du 8T
kubu@kubu-System-Product-Name:/media/kubu/JEUX8T/SAUVEGARDES$ ls -l
total 28
drwxrwxr-x 2 kubu kubu 4096 juin 22 10:43 Images
et à coté son dossier incremental-Images
drwxrwxr-x 2 kubu kubu 4096 juin 22 10:42 Musiques
et à coté son dossier incremental-Musiques
drwxrwxr-x 2 kubu kubu 4096 juin 22 10:42 Photos
et à coté son dossier incremental-Photos
et éventuellement en doublon de la VM dans le 8T
drwxrwxr-x 2 kubu kubu 4096 juin 21 23:55 SauvegardesDocumentsCommuns
et à coté son dossier incremental-DocumentsCommuns
drwxrwxr-x 2 kubu kubu 4096 juin 21 23:55 SauvegardesDocumentsEric
et à coté son dossier incremental-DocumentsEric
drwxrwxr-x 2 kubu kubu 4096 juin 21 23:55 SauvegardesDocumentsFanou
et à coté son dossier incremental-DocumentsFanou
Dernière modification par eric63 (Hier à 10:52)
Kubuntu 25.04 wayland Plasma 6.3.4 KDE Qt 6.12.0 noyau 6.14.0-15 Asus B760+D4 i5-12400F 4.4Ghz DDR4 32Go nvidia RTX 3060 12GB
Utilisez les drivers libres avant d’ installer une brother avec le script de demonipuch
J’utilise le clavier french AFNOR
Hors ligne