J'ai conçu un script bash permettant de sauvegarder rapidement les fichiers importants de mon Raspberry Pi vers mon NAS Synology.
Vous l'attendiez, voici enfin bm-PiBackup 🙂
Principe de fonctionnement
A partir d'une liste de fichiers et/ou de dossier le Raspberry crée une archive tar.gz qui est stockée sur un partage de fichiers CIFS (SMB) monté à la volée.
En effet il n'est pas rare qu'une carte microSD vous claque dans les doigts : aurevoir tous les scripts sympas ou les fichiers de configuration sur lesquels vous avez passé des heures !
Le script est stocké sur mon github : backupToNas.sh (raw)
Téléchargez-le et ajoutez le droit d'exécution.
Variables
Modifiez les variables en début de script, à savoir :
- PARTAGE : chemin CIFS (SMB)
- PARTAGEMNT : point de montage local pour le partage (sera créé s'il n'existe pas)
- PARTAGENAME : description purement visuelle et sans incidence sur le déroulement du script
- USERNAME : nom d'utilisateur ayant le droit d'écrire sur le partage CIFS
- PASSWORD : mot de passe de USERNAME
Ce partage peut bien sûr être tout et n'importe quoi, un Windows Server comme un NAS. C'est mon cas puisque mon Synology de backup assure ce rôle à la maison.
Pour éviter de saisir un identifiant / mot de passe en clair d'un compte important j'ai créé un compte dédié pour le Raspberry Pi. Ce compte a uniquement les droits lecture/écriture dans un partage dédié qui se nomme "pi_backup"ayant pour login "raspberry" et "backup" comme mot de passe.
Enfin il faut préciser les fichiers ou dossiers que vous souhaitez sauvegarder (l.90 environ). Le slash de fin n'est pas obligatoire mais peut vous aider à différencier les fichiers des dossiers. Le script contient des exemples :
tar zcf "$TAR" \
/etc/cron.daily \
/etc/cron.hourly \
/etc/cron.monthly \
/etc/init.d \
/etc/network/interfaces \
/etc/modules \
/etc/modprobe.d/ \
/etc/udev \
/etc/wpa_supplicant \
/var/www \
/home/pi \
/tmp/crontab \
/root/*.sh* \
/root/.bash* \
--exclude '/home/pi/Desktop' \
--exclude '/home/pi/motion' \
--exclude '/home/pi/photos' \
--exclude '/home/pi/homebridge' \
--exclude '/home/pi/.node-*' \
> /dev/null 2>&1
Pour éviter de surcharger le CPU du Pi vous pouvez faire des exclusions comme le montre les dernières lignes "--exclude". Le joker "*" étant supporté.
Vous remarquerez que je ne sauvegarde pas mon dossier root en totalité mais seulement les scripts sh et les fichiers ".bash*" (ex : .bash_profile, .bashrc etc.).
Résultat
Le résultat du backup sera stocké sous cette forme :
hostname_raspberryPi-AAAA-MM-JJ_HHhMM.tar.gz
Exemple :
domoPi-2017-05-15_22h09.tar.gz
L'archive de destination reprendra l'arborescence d'origine, c'est pourquoi j'aime beaucoup ce mode de fonctionnement.
MàJ 11/09/2018
Depuis peu la commande mount.cifs tente de se connecter en SMB version 3 par défaut.
Si votre Synology en face n'accepte pas SMB 3 vous aurez cette erreur :
"mount error(95): Operation not supported Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)"
J'ai donc ajouté un argument vers=2.0
pour forcer la connexion avec SMB version 2 pour des questions de compatibilité avec la plupart des partages CIFS.
Toutefois je vous recommande d'activer SMB3 dans DSM : Pann. de conf. > Service de fichiers > SMB/AFP/NFS > Paramètres Avances :
- Protocole maximum = 3.0
- Protocole minimum = 2.0
Valider avec "Appliquer" (implique un redémarrage des services associés).
Enfin si vous avez toujours l’erreur :
sudo apt install --reinstall cifs-utils -y && reboot
Conclusion
Je vous laisser tester et améliorer le script si besoin, j'ai mis un peu de couleur et le "OK!" apparaît vraiment au moment où l'action en question s'est réalisée. Avant j'ajoutais bêtement un "OK" à la ligne mais je trouve que c'est bien mieux intégré comme ça 🙂
Bien sûr ce script peut servir dans bien d'autres occasions et pas seulement avec un Raspberry Pi. Attention tout de même à la compression en tar.gz qui est assez consommatrice en ressources.
Vous pouvez aussi uploader ce backup avec cURL faire un backup complet de la carte microSD ou bien d'autres méthodes telles que rsync ou image-utils.
Avec un Raspberry Pi B+ connecté en WiFi 54 mbps le script sauvegarde 120 mo en 13 minutes (1850 fichiers).
Auteur : Mr Xhark
Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter
11 commentaires
Intéressant.
Je m'apprête à mettre en oeuvre la même chose pour le mien mais plutôt à base de rsync en ssh avec authentification par clé.
Je préfère un backup différentiel, et en cas de pb, un simple rsync dans le sens opposé me permettra de récupérer mes données.
Bonjour,
script sympathique, merci
j'ajouterai pour ma part un mail en début et fin de sauvegarde avec la durée de la sauvegarde
@papoo: n'hésite pas à poster ta version je l'ajouterai dans le billet
la version sauvegarde incrémentielle m’intéresserait
sinon pour les mails avec la durée de la sauvegarde :
https://pastebin.com/257LqMHE
@papoo: j'ai envoyé ton code sur un pastebin pour que ce soit plus lisible
Bonjour
Merci pour ton script qui fonctionne sur mon raspberry pi4 buster vers Nas synology en samba.
J'ai tout de même encore ce message d'erreur : mount error(95): Operation not supported Refer to the mount.cifs
Malgré tes infos pour corriger (réinstal zt modif paramètre smb sur le dsm du synology) mais a la fin de rigueur tant pis la sauvegarde .tar est générée et copiée.
Par contre pourrais-tu rajouter un envoi d'un mail sur un compte externe style Gmail a la fin du scripts pour le suivi ?
Merci
@Kwet: pour faire du mail tu peux suivre ceci : https://linuxhint.com/bash_script_send_email/
personnellement j'utilise le SMTP (non authentifié) de mon FAI
Salut,
J'ai créé un dossier partagé sur mon Synolog, sur lequel j'ai autorisé un compte "pi" à en lecture/écriture.
Dans ton script, j'ai spécifié ceci :
PARTAGE="//192.168.0.15/volume1/Backup_MMM"
PARTAGEMNT="/mnt/Backup_MMM"
Et au lancement du script, j'ai ceci comme messages :
mount error(2): No such file or directory
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
ERREUR: montage impossible de //192.168.0.15/volume1/Backup_MMM -- Arrêt du script
Une idée de l'origine de l'erreur ?
Merci
Edit: C'est bon j'ai trouvé, j'ai supprimé "volume1" de l'adresse du NAS et ça fonctionne.
Désolé pour le dérangement et merci pour ce superbe script !
@mattx38: Effectivement, en partage CIFS c'est directement le nom du partage (volume1 n'est donc pas visible, contrairement à un accès NFS qui afficherait le chemin complet)
Bon début mais à quoi sert une sauvegarde si on a pas le(s) moyen(s) de tester la restauration ?
@niko44: personne n'a dit qu'il ne fallait pas tester la restauration. De mon côté j'ai plusieurs fois eu besoin d'aller y chercher des fichiers, toujours avec succès.