Accueil > Logiciel Libre > Libvirt : sauvegardes des VM

Libvirt : sauvegardes des VM

dimanche 16 juillet 2017, par Axelos

Un article très technique sur de l’administration système Linux.

Prologue

Logo de Debian
Wikimedia

J’utilise un petit serveur dédié tournant sous Debian 7 depuis quelques années ou y sont installé mes programmes, tel que serveur web sur lequel tourne ce blog.
C’était mon premier, et je trouve que je m’en suis plutôt pas mal sorti, vu le nombre de services y tournant.

Durant ces années j’ai donc acquis pas mal de connaissances en tout genre, à force de me retrouver devant des impasses et donc consulter les documentations. Je suis donc en mesure de me lancer dans des gros projets, qui désormais commencent sérieusement à côtoyer ce que savent faire certains informaticiens chevronnés, des trucs bien balaises.

Mais, sur ce serveur il manque un truc, qui vu les nouveaux projets que je voudrais mettre en place me semble aujourd’hui hyper important : la sauvegarde.
En effet comme déjà écris précédemment il s’agit d’un petit serveur peu performant, je fus donc limité par ses capacités techniques. Pas de miroir RAID, pas de virtualisation, juste un simple programme de sauvegarde de fichier basique, que j’exploite manuellement, rien n’est donc automatisé.
Si demain mon serveur crame, ça peut arriver, alors certes j’aurais encore les fichiers, mais il me faudra du temps avant de le remettre totalement en service, des semaines voir des mois.

J’ai donc décidé de me prendre un serveur dédié plus balaise, dont le processeur sait gérer l’accélération matérielle concernant la virtualisation.

Logo de KVM
Wikimedia

Je me suis logiquement tourné vers KVM sur Debian 9, qui est déjà partiellement implémenté dans le noyau Linux, en utilisant l’interface graphique Virt-Manager.
Une interface plutôt pratique et simpliste (c’est relatif) pour installer et manipuler les machines. Seul bémol et c’est un peu logique, Virt-Manager ne sait pas gérer tout ce qui est automatisation de sauvegarde.

Voici donc ce pour quoi je rédige cet article, car l’automatisation des sauvegardes, quand on a jamais fait de virtualisation, c’est un peu chaud. Si demain un autre autodidacte veut se lancer dans la même aventure, il aura déjà une base à disposition.

Je fais le choix de sauvegarder à la fois en local mais aussi sur un autre serveur à distance en SSH. En cas de défaillance dans une VM, je pourrais la restaurer très rapidement, quelques minutes, et si c’est le serveur qui est défaillant, alors j’aurais une copie des VM qui pourront être recopié ailleurs, ce qui ne prendra que quelques jours. Toutefois le risque de subir un disque dur qui crame est faible, puisque le serveur est configuré en RAID 1.

Installation de Libvirt

Je ne vais pas vous expliquer de A à Z comment procéder, puisque de toutes façons une documentation y est dédié sur le wiki de Debian, mais je vais y ajouter deux-trois détails concernant des manipulations à faire en supplément sans quoi Libvirt refusera de démarrer convenablement, et il sera alors impossible de vous y connecter.

Virt-Manager
ubuntu.fr

L’heure du système. Truc vraiment très con qui fou bien la merde, l’heure de mon système Debian fraîchement installé n’était pas configuré sur le bon fuseau horaire ! Un petit coup de dpkg-reconfigure tzdata et le problème n’est plus.

Aussi, il manquait deux paquets, l’un pour gérer le par-feu (je ne connais pas son utilité exacte), et le second pour la connexion sécurisé SSH : apt install ebtable netcat-openbsd

Automatisation des sauvegardes

Dans l’exemple, la machine virtuelle s’appelle « respond », ces commandes sont à intégrer dans crontab. Les arborescences sont aussi évidemment à adapter.

Sauvegardes légères

Snapshots à chaud, c’est-à-dire sans couper la VM. On peut se lâcher, au minima un par jour. Avec l’utilitaire date on lui attribue la date du jour au format JJ-MM-AAAA.

Création d’un snapshot
virsh snapshot-create-as respond snapshot-<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZGF0ZSArJWQtJW0tJVk8L2NvZGU+"></span>

Suppression des snapshots âgés de plus de 7 jours
virsh snapshot-delete respond snapshot-<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZGF0ZSAtZGxhc3Qtd2VlayArJWQtJW0tJVk8L2NvZGU+"></span>

Sauvegardes lourdes

Copie de la VM à froid, elle doit être momentanément coupée pour éviter toute corruption du fichier. Au minima une fois pas semaine.

Suspension de la VM
virsh suspend respond

Copie du fichier respond.qcow2 en local pour aller vite
qemu-img convert -O qcow2 /home/utilisateur/kvm/respond.qcow2 /home/utilisateur/sauv/respond.qcow2

Relance de la VM
virsh resume respond

Copie du fichier sur un autre serveur
rsync -e "ssh -p 22" -av --delete-after /home/utilisateur/sauv/respond.qcow2 utilisateur@domaine:/home/utilisateur/sauv_server_kvm
Voir ici pour l’identification sans mot de passe.

Exemple de fichier crontab

Fichier qui reprend ces différentes commandes et les exécute automatiquement à des temps déterminés (/etc/crontab)

00 01 * * * root virsh snapshot-delete respond snapshot-<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZGF0ZSAtZGxhc3Qtd2VlayArJWQtJW0tJVk8L2NvZGU+"></span> 
05 01 * * * root virsh snapshot-create-as respond snapshot-<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZGF0ZSArJWQtJW0tJVk8L2NvZGU+"></span>
10 01 * * 0 root virsh suspend respond && qemu-img convert -O qcow2 /home/utilisateur/kvm/respond.qcow2 /home/utilisateur/sauv/respond.qcow2 && virsh resume respond
00 03 * * 0 root rsync -e "ssh -p 22" -av --delete-after /home/utilisateur/sauv/respond.qcow2 utilisateur@domaine:/home/utilisateur/sauv_server_kvm/respond.qcow2

Problème rencontré

Il se peut que cron a des difficultés à lancer les commandes contenant l’insertion des dates dans les noms des sauvegardes. J’en ignore la raison qui est certainement très technique, mais je sais comment contourner le problème : Insérer ces commandes dans des scripts shell appelés par cron.

Exemple pour la commande de création d’un snapshot dans le crontab :

05 01 * * * root /bin/sh /etc/cron.d/snapshot-create-respond.sh

Et dans le fichier snapshot-create-respond.sh que vous créez :

#!/bin/bash
virsh snapshot-create-as respond snapshot-<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZGF0ZSArJWQtJW0tJVk8L2NvZGU+"></span>

Un message, un commentaire ?

modération a priori

Ce forum est modéré a priori : votre contribution n’apparaîtra qu’après avoir été validée par un administrateur du site.

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.