HowTo: Backup der virtuellen Festplatten unter QEMU

QEMU-Logo [1]

“QEMU ist ein allgemeiner Open Source Maschinen-Emulator und Virtualisierer.

Wie man einen QEMU-Host einrichtet, erfahren Sie hier.

Vorüberlegungen

  • Die virtuellen Festplatten befinden sich im Verzeichnis /var/lib/libvirt/images üblicherweise als *.qcow2-Dateien
  • Im laufenden Betrieb sollen nur die produktiven Dateien gesichert werden, wir schließen
    • Klone
    • Templates und
    • Temporäre Images aus
  • Wir verwenden borgbackup als Datensicherungstool (im aktuellen Beispiel wird auf einen externen USB-Datenträger gesichert).

Im Wesentlichen müssen nur die virtuellen Festplatten aus o.a. Ordner gesichert werden. Im einfachsten Fall sichert man mit borgbackup direkt auf eine externe Festplatte mit ausreichender Kapazität. Bitte unbedingt borg verwenden, weil wir es mit relativ großen Dateien zu tun haben und borg mit chunks [2] arbeitet (anstatt mit ganzen Dateien). Wird der Inhalt eines chunks verändert, braucht nicht die ganze Datei neu geschrieben werden, sondern nur der betreffende Anteil.

Datenträger vorbereiten

Soll die Datensicherung auf ein lokales Laufwerk gefahren werden (USB 3.0 und schneller), müssen Sie eine Festplatte mit dem Label “VH-Backup” formatieren. Als Dateisystem verwende ich ntfs. Mit einem anderen Label oder einem anderen Dateisystem müssen Sie den nächsten Schritt entsprechend abändern.

Legen Sie auf dem Laufwerk ein Verzeichnis mit dem Hostnamen des Gastrechners an (in meinem Fall: vhost). Dieses Verzeichnis dient in erster Linie dazu, festzustellen, ob der Datenträger ins Dateisystem richtig eingebunden ist.

Legen Sie nun auf dem vhost (mit Root-Rechten) das Verzeichnis /mnt/VH-Backup an …

… und ergänzen Sie die Datei /etc/fstab durch folgenden Eintrag:

# Backuplaufwerk einbinden
LABEL=VH-Backup /mnt/VH-Backup ntfs defaults,nofail,noauto,rw,uid=0,gid=0,nls=utf8 0 0

Sie können dieses Teilstück auch hier herunterladen und die Datei /etc/fstab mit Hilfe von Copy-Paste ergänzen.

Schließen Sie die externe festplatte an und booten Sie nun den Rechner neu. Der Datenträger wird nicht automatisch ins Dateisystem eingebunden (noauto), sondern erst bei Bedarf.

Test

Der Datenträger müsste nun vom System erkannt werden. Überprüfen Sie dies, indem Sie den Befehl lsblk im Terminal eingeben. Sie sollten eine ähnliche Ausgabe erhalten:

Die mit loop gekennzeichneten Ausgaben können Sie ignorieren.

Sie finden 3 Festplatten angezeigt: sda, sdb und sdc, wobei sich die erste in drei Partitionen sda1, sda2 und sda3 untergliedert ist.

  • sda1 ist die UEFI-Partition,
  • sda2 eine Linux-Bootpartition und
  • sda3 gehört – wie auch sdb zur LVM-Gruppe ubuntu-vg mit dem Logischen Volume ubuntu-lv.
    • sda3 und sdb werden vom System wie eine einzige Festplatte behandelt. Diese ist auf die Wurzel des Dateisystems “/” gemountet und enthält somit das komplette Linux-Dateisystem.

sdc ist frei. Also muss es sich um die externe Festplatte handeln.

Überprüfen Sie nun, ob sich die HD ins Dateisystem einbinden lässt:

> mount /mnt/VH-Backup

Tritt keine Fehlermeldung auf, sollten die Ausgabe von lsblk nun so aussehen:

Kontrollieren Sie nun, dass auf der Festplatte das Verzeichnis vhost (Hostname) vorhanden ist:

Borgbackup installieren

Borgbackup installiert man wie folgt:

> sudo apt update
> sudo apt install borgbackup

Das Skript zur Datensicherung

Hier können Sie das Skript vh-backup herunterladen, mit dessen Hilfe die Datensicherung durchgeführt kann. Das Skript fährt alle laufenden Server herunter und startet sie nach erfolgter Datensicherung neu. Es muss noch Ihren Anforderungen gemäß angepasst werden. Dies betrifft insbesondere die folgenden Einstellungen:

VariableInhalt
mountzielVoreingestellt: /mnt/VH-Backup; die Stelle, an welcher der Sicherungsdatenträger eingebunden werden muss (diese Angabe muss mit dem Eintrag in /etc/fstab übereinstimmen).
bmountpointDa ein Brog-Repo für Menschen nicht lesbar ist, kann es mit borg mount zusätzlich in lesbarer Form ins Dateisystem eingebunden werden. Die Stelle wird hier festgelegt. Sie muss von $mountziel unterschieden sein. Diese lesbare Variante ist für eine file-by-file-Datenrücksicherung bestens geeignet.
sicherungWenn alle virtuellen Datenträger gesichert werden sollen, brauchen Sie hier nichts zu verändern. sicherung=”var/lib/libvirt/images”
excludeZum Ausschließen einzelner Dateien (z.B. exclude=”–exclude *-clone*.qcow2 –exclude *test*.qcow2 –exclude *template*.qcow2 … “)
verschluesselungzum Angeben einer Verschlüsselungsart (Standard wäre repokey). In diesem Fall sollten Sie das Passwort in einer besonders gesicherten Datei .borg-passphrase mit eingeschränkten Zugriffsrechten hinterlegen und die Zeile export BORG_PASSCOMMAND auskommentieren.
Die weiteren Infos entnehmen Sie bitte den Kommentaren in vh-backup

Kopieren Sie die Ihren Bedürftnissen angepasste Datei auf den Host in das Verzeichnis /usr/local/sbin und versehen Sie sie mit den entsprechenden Dateirechten:

Bedienung von vh-backup

Das Skript wird über Kommandos gesteuert. Es werden Sysadmin-Rechte vorausgesetzt:

> sudo vh-backup <Kommando> <Option>

KommandoFunktion
initAnlegen des Borg-Repositories. Muss nur ein einziges Mal ausgeführt werden.
createDurchführen einer Datensicherung. Dies kann – abhängig vom zu sichernden Datenvolumen – einige Zeit in Anspruch nehmen. Dies gilt besonders für das ersten Mal.
create keepsleepingwie create, jedoch werden die virtuellen Maschinen nach de Datensicherung nicht mehr hochgefahren. Diese Option ermöglicht es, nach der Sicherung kritische Wartungsarbeiten durchzuführen.
openEinbinden des Datenträgers mit dem Borg-Repository in /mnt/VH-Backup. Ein Repository ist in der Regel nicht wie ein normales Dateisystem lesbar.
closeAushängen des Datenträgers mit dem Repository.
mountEine lesbare Version wird in /root/.borgmount zusätzlich eingebunden. Die gesicherten Dateien können beim Rücksichern von hier aus an ihren Ursprungsort zurück kopiert werden.
umountAushängen der lesbaren Version. Nicht zu Verwecheln mit close; umount hängt das Repository nicht aus; close hängt ggf. beide Kopien aus.
listAuflisten der Datensicherungen
pruneLöschen nicht mehr benötigter Sicherungskopien
prune testzum Testen der Einstellungen; das Löschen selbst wird nicht durchgeführt.
logAuslesen der log-Datei (Beenden mit “q”)

Automatisches Ausführen von vh-backup

Soll das Backup beispielsweise als zusätzliches Backup einmal in der Woche gefahren werden, erstellen Sie bitte ein Datei in /etc/cron.d mit folgendem Inhalt:

Empfehlenswert ist es auch, die Log-Datei von Zeit zu Zeit zu löschen. Erstellen Sie beispielsweise eine ausführbare Datei in /etc/cron.monthly mit folgendem Inhalt:

#!/bin/bash

# Logfiles von vh-backup löschen
# Bitte in cron.monthly kopieren

# es werden max. 3 Logfile-Kopien behalten
#
# vh-backup.log

i=/var/log/vh-backup.log

# entferne älteste Logfile-Kopie
if [ -f $i.3.gz ]
then
rm $i.3.gz
fi


# Kopie 2 -> 3
if [ -f $i.2.gz ]
then
mv $i.2.gz $i.3.gz
fi

# Kopie 1 -> 2
if [ -f $i.1.gz ]
then
mv $i.1.gz $i.2.gz
fi

# erzeuge erste Kopie
if [ -f $i ]
then
mv $i $i.1
gzip $i.1
echo >$1 # leeres Logfile anlegen
fi

Daten rücksichern

Zum Rücksichern wird das Repository zunächst in lesbarer Form eingebunden. Dann können die benötigten Dateien mit cp problemlos zurückkopiert werden. Ein Beispiel:

> sudo -i
> vh-backup mount
> cd ~/.borgmount
> ls -l

Nun wählt man ein Backup aus:

> cd vhost-2024-08-06-162823
> cd var/lib/libvirt/images
> ls -l

Das könnte dann z.B. so aussehen:

Will man beispielsweise nur dbserver.qcow2 zurücksichern, muss man dafür sorgen, dass der Server nicht läuft. Dann kopiert man die Datei einfach mit cp:

> virsh shutdown dbserver
> cp -v dbserver.qcow2 /var/lib/libvirt/images

Einzelnachweise

[1]Bildnachweis: Von Benoît Canet, CC BY 3.0, https://commons.wikimedia.org/w/index.php?curid=32230901
[2]Unter chunks versteht man Datenportionen auch Datenblöcke genannt. So wird eine gesamte Datei auf einem Datenträger in der Regel portioniert und in einzelnen Blöcken abgespeichert (bei SSDs meist 4096 Byte groß).