HowTo: Backup der virtuellen Festplatten unter QEMU
“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:
Variable | Inhalt |
---|---|
mountziel | Voreingestellt: /mnt/VH-Backup; die Stelle, an welcher der Sicherungsdatenträger eingebunden werden muss (diese Angabe muss mit dem Eintrag in /etc/fstab übereinstimmen). |
bmountpoint | Da 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. |
sicherung | Wenn alle virtuellen Datenträger gesichert werden sollen, brauchen Sie hier nichts zu verändern. sicherung=”var/lib/libvirt/images” |
exclude | Zum Ausschließen einzelner Dateien (z.B. exclude=”–exclude *-clone*.qcow2 –exclude *test*.qcow2 –exclude *template*.qcow2 … “) |
verschluesselung | zum 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. |
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>
Kommando | Funktion |
init | Anlegen des Borg-Repositories. Muss nur ein einziges Mal ausgeführt werden. |
create | Durchfü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 keepsleeping | wie create, jedoch werden die virtuellen Maschinen nach de Datensicherung nicht mehr hochgefahren. Diese Option ermöglicht es, nach der Sicherung kritische Wartungsarbeiten durchzuführen. |
open | Einbinden des Datenträgers mit dem Borg-Repository in /mnt/VH-Backup. Ein Repository ist in der Regel nicht wie ein normales Dateisystem lesbar. |
close | Aushängen des Datenträgers mit dem Repository. |
mount | Eine 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. |
umount | Aushängen der lesbaren Version. Nicht zu Verwecheln mit close; umount hängt das Repository nicht aus; close hängt ggf. beide Kopien aus. |
list | Auflisten der Datensicherungen |
prune | Löschen nicht mehr benötigter Sicherungskopien |
prune test | zum Testen der Einstellungen; das Löschen selbst wird nicht durchgeführt. |
log | Auslesen 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:
# This is a sample cron file for vh-backup.
#
# Feel free to adapt it to your needs.
# Minute Hour Day Month Weekday (0=Sun 1=Mon, ...)
0 2 * * 0 root /usr/local/sbin/vh-backup create 1>/dev/null 2>&1
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ß). |