Snapshotbackups von KVM Maschinen mit LVM

Wer sich mit Virtualisierung auseinandersetzt wird zwangsläufig auch über das Thema Backup stolpern. Ich habe immer gerne ein Image von der Maschine parat – leider ist das die umständlichste und Platz in Anspruch nehmende Backup Methode.

Die Sicherung per Image hat aber auch Vorteile.

Ein Image lässt sich schnell und einfach wiederherstellen. Mit den geeigneten Tools kann man auch hier etwas Platz einsparen (natürlich nicht soviel wie bei der Sicherung der reinen Nutzdaten).

Eine Wiederherstellung aus einem Image ist in der Regel schneller erledigt als eine Neuinstallation. Darüber hinaus ist insbesondere beim Einsatz der richtigen Technik auch die Downtime zur Erzeugung des Images minimal.

Wie minimiere ich die Downtime? Ganz einfach – wenn ich LVM verwende kann ich von dem virtuellen Festplattenlaufwerk bei Bedarf auch im Betrieb einen Snapshot erstellen. Diesen Snapshot sichert man einfach mit den geeigneten Tools weg.

Sicherer ist es allerdings wenn man die virtuelle KVM Maschine erst herunterfährt oder in den Ruhezustand versetzt (Achtung – nicht den Stromsparmodus, sondern wirklich das RAM auf die Platte sichern!). Wenn man das mit einem Skript durchführt, einen Snapshot erzeugt und die Maschine wieder hochfährt hält sich die Downtime im einstelligen Minutenbereich.

Ich habe dafür ein Skript erstellt, dass ich immer wieder erweitere. Dazu zählt das herunterfahren, snapshotten, wiederhochfahren und sichern der KVM Maschine. Zu finden ist es hier:

http://git.itsolution2.de/redmine/projects/kvm-scripts

Das Skript ist so geschrieben, dass es vor und nach dem Backup noch weitere Befehle ausführen kann – ich verwende das um zum Beispiel eine FTP oder SSH Verbindung zum Backupserver herzustellen. In dem Skript gehe ich davon aus, dass die KVM Maschine innerhalb einer Volumegruppe liegt, in der noch freier Platz für Snapshots vorhanden ist. Außerdem gehe ich davon aus, dass die Maschine zum Beispiel KvmHost heisst und das entsprechne LVM Datenträge lvkvmhost. Die Konfiguration ist einfach in der „kvm-lvm-snapshot-backup.cfg“ zu erledigen:

# kvm-lvm-snapshot-backup.cfg
#
# Andreas Rehm <rehm@itsolution2.de>

# Logfile
LOGFILE=/root/kvm-lvm-snapshot-backup.log

# lvm volumegroup
VG=vg0

# Device mapper path (where kpartx creates device links)
MAPPER=/dev/mapper

# backup destination
DEST=/backup/

# folder location in sshfs or ftp servers
HDEST=/home/backup/

# ftp server settings - if pre script needs to mount ftp space
HOST=my.backup.server
USER=backup
PASS=PASS

# snapshot size - should be at least 1G - better 2 or 4
SNAPSIZE=2G

# Backuplist - array in array
# be carefull - I assume that the kvm name can be uppercase, but the
# volugroup will start with lv and followed by the kvm name
# example: kvm name="Server" lv name="lvserver"
KVMMACHINES=(KvmHost)

Mit dieser Konfiguration kann man ein Backup auf einen entfernten Rechner schieben – allerding benötigt man noch das Einhängen des Laufwerks über „kvm-lvm-snapshot-backup-pre.sh“ (der Ordner /backup aus der Konfigurationsdatei muss mit mkdir /backup erst angelegt werden):

#!/bin/bash
echo "- kvm-lvm-snapshot-backup-pre.sh -"

echo $DEST  ${USER}@${HOST}:${HDEST} ${DEST}

# sshfs
sshfs ${USER}@${HOST}:${HDEST} ${DEST}

# curlftpfs doesn't work with ntfsclone!
# mount FTP Share for backup
#echo "Mounting curlftpfs backup space"
#curlftpfs ${HOST} ${DEST} -o user=${USER}:${PASS}

Und dem Aushängen über „kvm-lvm-snapshot-backup-pre.sh“:

#!/bin/bash
echo "- kvm-lvm-snapshot-backup-post.sh -"
# umounts
umount ${DEST}

Soviel zu der Theorie – wie muss ich denn nun die Maschinen Anlegen? Also einfach mit dem Virt-Manager geht es wohl noch nicht. Allerdings kann man man bereits Volumegruppen angeben. Die Erzeugung des LVM Laufwerkes kann auf der Kommandozeile erfolgen:

lvcreate -L 120G -n lvkvmhost vg0

Im Virt-Manager kann man über die localhost Konfiguration den LVM Pool einbauen und dort auch über „New Volume“ ein LVM Laufwerk erzeugen:

Virt-Manager LVM Storage

Die Installation von einer KVM Maschine lasse ich hier mal aus und komme wieder zum Backup – das hier erzeugte LVM Laufwerk ist dann die virtuelle Festplatte der KVM Maschine. Durch LVM können wir einfach Snapshots erzeugen:

lvcreate -L2G -s -n lvkvmhost-snapshot /dev/vg0/lvkvmhost

Informationen dazu kann man auch hier finden: http://tldp.org/HOWTO/LVM-HOWTO/snapshots_backup.html

Ein Backupdurchlauf sieht dann etwa so aus:

root@hetzner2 ~ # bin/kvm-lvm-snapshot-backup.sh
KVM logical volume snapshot backup

Logfile will be saved in:                      /root/kvm-lvm-snapshot-backup.log
Requested Backup of this kvm maschines:        KvmHost
Backup will be saved in:                       /backup/
Maschines and snapshot will be in volumegroup: vg0
Snapshot will have a size of:                  2G
The following maschines are running:
KvmHost

--- Starting backup ---

Backup of maschine KvmHost
Shutting down 'KvmHost'...
  Logical volume "lvkvmhost-snapshot" created
Starting 'KvmHost'
Domain KvmHost started

Backup vg0-lvkvmhost--snapshot1 to /backup/vg0-lvkvmhost--snapshot1-ntfsclone.img.gz
ntfsclone v2012.1.15AR.1 (libntfs-3g)
NTFS volume version: 3.1
Cluster size       : 4096 bytes
Current volume size: 104853504 bytes (105 MB)
Current device size: 104857600 bytes (105 MB)
Scanning volume ...
100.00 percent completed
Accounting clusters ...
Space in use       : 26 MB (24.1%)
Saving NTFS to image ...
100.00 percent completed
Syncing ...
Backup vg0-lvkvmhost--snapshot2 to /backup/vg0-lvkvmhost--snapshot2-ntfsclone.img.gz
ntfsclone v2012.1.15AR.1 (libntfs-3g)
NTFS volume version: 3.1
Cluster size       : 4096 bytes
Current volume size: 64317550592 bytes (64318 MB)
Current device size: 64317554688 bytes (64318 MB)
Scanning volume ...
100.00 percent completed
Accounting clusters ...
Space in use       : 18741 MB (29.1%)
Saving NTFS to image ...
100.00 percent completed
Syncing ...
  Logical volume "lvkvmhost-snapshot" successfully removed
--- End of backup ---

Bei Interesse poste ich gerne weitere Informationen.