[BETA]Sauvegarde du Disque VM

Bonjour :wave: :relaxed:.

Comme j’indiquai dernièrement une procédure pour installer Home Assistant supervised officiel sur une VM de la freebox, je tiens aussi à montrer un petit script afin de sauvegarder son disque virtuel.

Cette manipulation, évitera les snapshots interne de Home Assistant (avec pour manipulation de restauration: tout réinstaller, puis backuper le snapshot).
Cette méthode permet d’un simple copier/coller, de retrouver facilement un environnement de prod sans autre manipulation.

:warning:
Je n’ai pas encore de recule sur ce script.
Je ne l’ai testé que manuellement. Je n’ai pas eu de message d’erreur pour le moment. Je n’ai pas encore testé la restauration.
J’ai besoin de retour pour améliorer, ou corriger, puis tester via le crontab par la suite. Si vous avez des idées n’hésitez pas.

:warning:
Suite au retour d’Oli, j’ajoute le post qui permet de résoudre un problème de base de donnée corrompu. Il y aura surement des problemes si la base de donnée est mal arreté.

Vous retrouverez le script entier en fin de page. :arrow_heading_down:

:arrow_forward:TODO:
Il me reste encore quelque tricks à ajouter comme:

  • Vérifier si HA a bien été arrêté pendant le script (contrôle des retours d’état),
  • Un déclenchement automatique,
  • Une rétention temporelle,
  • Une gestion de log,
  • Gestion de la taille du fichier,
  • Une intégration à home assistant (je pense que ce ne sera pas possible par moi, pour des raisons de cloisonnement de docker).

Si vous avez les compétences pour m’aider dans ce TODO, ou pour améliorer mon script, je suis évidemment preneur (je me base sur un script que l’on avait fait pour domoticz).

Je suis donc pour le moment avec un script bash, que je peux insérer dans l’environnement de l’OS installé, puis déclencher manuellement, (ou à l’aide de la crontab si besoin).

:arrow_forward:PREREQUIS:

  • S’y connaitre un minimum en bash, en nano, en sudo et en linux,
  • Avoir coché l’accès aux disques Freebox lors de l’installation de la VM,
  • Pouvoir se connecter en SSH.

:arrow_forward:DESCRIPTION:
Je commence dans l’environnement de mon OS. Création d’un fichier « backup.sh » puis attribution des droits d’exécution:

~$ touch backup.sh
~$ sudo chmod +x backup.sh

J’utilise nano pour éditer mon fichier backup.sh:

~$ nano /home/backup.sh

Une fois dans l’éditeur, je vais implémenter ce qui suit:
Le shebang: Il permet à l’OS de savoir sur quel langage il peut s’appuyer pour exécuter le script:

#!/bin/bash

Je vais ensuite créer des variables:

1.
DATE_DEBUT_SEC=`date +%s`
DATE_BCK=`date +%Y%m%d-%Hh%M`
2.
KEEP_SAVE=5
3.
NAME_VM="Home-Assistant.qcow2"
NAME_BCK="vm-homeassistant"
4.
PATH_VM="/mnt/Freebox/VMs/"
PATH_BCK="Backup/"
[ ! -d ${PATH_VM}${PATH_BCK} ] && mkdir ${PATH_VM}${PATH_BCK}
5.
FILE_BCK=${NAME_BCK}-${DATE_BCK}.tar.gz
FILE_FILTER="${NAME_BCK}*tar.gz"
  1. Dans ces variables, je construit mon script temporellement avec les deux premières variables de date.

  2. La variable suivante: KEEP_SAVE contient le nombre de fichier que je souhaite garder (Nécessaire si le script est automatisé).

  3. Les variables NAME_* contiennent respectivement le nom du fichier à sauvegarder (il sera peut-être à remplacer pour votre propre script, il s’agit du nom de votre VM sur la Freebox). Puis le nom du fichier qui sera créé.

  4. Les variables PATH_* et la commande qui suit, contiennent les adresses des dossiers qui sont normalement d’origine, puis une commande pour créer le dossier de backup s’il n’existe pas.

  5. Enfin, les variables FILE_* contiennent plusieurs format pour l’exécution de certaines commandes.

Je continue ensuite par créer un log du script, puis le changement du dossier d’exécution:

echo "${DATE_BCK} Début de backup VM"
cd ${PATH_VM}

Le plus important commence ici:
J’arrête HA pour éviter de corrompre de la base de donnée

ha core stop

Je vais lister les fichiers connus du dossier de destination. Je ne garde que le nombre défini par KEEP_SAVE et je supprime le surplus

sudo ls -1t ${PATH_BCK}${FILE_FILTER} | tail -n +${KEEP_SAVE} | xargs rm -rf

Je peux enfin lancer une nouvelle sauvegarde:

tar -czvf ${PATH_BCK}${FILE_BCK} ${NAME_VM}

Je redémarre HA

ha core start

Une fois terminé, je formate le temps de traitement puis la date de fin pour logguer tout ca:

DATE_BCK=`date +%Y%m%d-%Hh%M`
DATE_FIN_SEC=`date +%s`
DUREE_SEC=$(($DATE_FIN_SEC-$DATE_DEBUT_SEC))
DUREE_H=$(($DUREE_SEC/3600))
DUREE_M=$((($DUREE_SEC%3600)/60))
DUREE_S=$((($DUREE_SEC%3600)%60))
echo "${DATE_BCK} Fin de backup VM. Durée: ${DUREE_H}h ${DUREE_M}m ${DUREE_S}s"

Je peux enfin sauvegarder avec ctrl+x et y pour valider le nom du fichier.

Pour tester, il faut lancer le script avec sudo, afin d’avoir les droits d’utiliser les commandes HA:

~$ sudo /home/backup.sh

:arrow_forward:AUTOMATISER:
Si je suis extrêmement sûr de moi, je vais pouvoir l’implémenter dans la CRONTAB. Recherche google.
Editer la crontab sudo:

~$ sudo crontab -e

puis renseigner une ligne du type:

@weekly /home/backup.sh

:arrow_forward:SCRIPT:

#!/bin/bash
#exec &> /var/log/backupVMFREEBOX.log
#############
#
# Sauvegarde du fichier de disque VM
#
#############

# Formatage de date
DATE_DEBUT_SEC=`date +%s`
DATE_BCK=`date +%Y%m%d-%Hh%M`

# Nombre de sauvegarde à conserver
KEEP_SAVE=5

# Nom de l'image disque de la VM
NAME_VM="Home-Assistant.qcow2"
# Nom du fichier de backup
NAME_BCK="vm-homeassistant"
# Répertoire des VMs sur la freebox depuis votre VM
PATH_VM="/mnt/Freebox/VMs/"

# Répertoire de sauvegarde
PATH_BCK="Backup/"
# Création du répertoire
[ ! -d ${PATH_VM}${PATH_BCK} ] && mkdir ${PATH_VM}${PATH_BCK}
# Formatage du nom de fichier de backup en sortie
FILE_BCK=${NAME_BCK}-${DATE_BCK}.tar.gz
# Filtre de recherche
FILE_FILTER="${NAME_BCK}*tar.gz"

############# Debut du script
# Log
echo ${DATE_BCK} Début de backup VM

ha core stop

cd ${PATH_VM}

# Suppression des anciens backup
sudo ls -1t ${PATH_BCK}${FILE_FILTER} | tail -n +${KEEP_SAVE} | xargs rm -rf

# Nouveau Backup directement depuis les vm vers le dossier de backup
tar -czvf ${PATH_BCK}${FILE_BCK} ${NAME_VM}

ha core start

# Formatage de la date de fin et de l'heure
DATE_BCK=`date +%Y%m%d-%Hh%M`
# Découpe pour mise en seconde
DATE_FIN_SEC=`date +%s`
# Calcul de la durée d'execution en seconde
DUREE_SEC=$(($DATE_FIN_SEC-$DATE_DEBUT_SEC))
# Remise en Heure - Minute - Seconde
DUREE_H=$(($DUREE_SEC/3600))
DUREE_M=$((($DUREE_SEC%3600)/60))
DUREE_S=$((($DUREE_SEC%3600)%60))

# Log
echo "${DATE_BCK} Fin de backup VM. Durée: ${DUREE_H}h ${DUREE_M}m ${DUREE_S}s"
2 « J'aime »

Petite remarque sur ce type de sauvegarde : HA utilise une base de données en interne (métriques, config, etc).
Ce genre de sauvegarde à chaud est plutôt déconseillé (corruption de la Base de données). Une meilleure pratique serait de stopper HA, sauvegarder le disque VM et relancer HA.

Genial, merci pour l’info !! Dans ce cas, je vais dans un premier temps modifier en pointant sur mon post qui traite du sujet de la base corrompu. Apres par contre je ne sais pas trop comment je vais pouvoir gerer ce probleme. Il faut que j’arrête HA depuis l’exterieur du docker, mais je ne sais pas encore comment faire. Si tu as l’info (pour redemarrer aussi…) je suis preneur (en attendant de la trouver moi meme…)