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.

Share

4 Gedanken zu „Snapshotbackups von KVM Maschinen mit LVM

  1. Tolle Lösung. Werde wohl demnächst es ebenfalls einsetzten. Wie schaut es aus mit Migration?
    Sprich wenn man zwei Host-Rechner hat und man ein Image von A nach B Switch. Falls ein Host Rechner ausfallen sollte.

    • Das Skript ist für das Backup gedacht. Man kann die Images natürlich zur Wiederherstellung verwenden. Also egal ob man switchen will oder wiederherstellen. Aber für ein Failover mit HA wäre es etwas langsam – da kommt man um Shared Storage nicht herum.

  2. Hallo,
    danke für das gute Script.

    Ich habe es an meinem System angepasst und es läuft. Aber ich habe ein Problem beim wiederherstellen der Partition. Also beim Wiederherstellen der Partition gehe ich wie folgt aus:

    VM herunterfahren:
    virsh studown vm01

    ich mappe das LVM:
    kpartx -a -v /dev/vg0/lvm_00_01

    dann starte ich partimage:
    partimage restore /dev/mapper/vg0-lvm_00_01p1 /backup/lvm_00_01.img.gz.000

    dann entferne ich das Mapping-Device
    kpartx -d /dev/vg0/lvm_00_01

    Ich versuche die Vm zustarten…. No boot device.

    Könntest du bitte mir ein Tipp geben, wie ich die Wiederherstellung auszuführen habe?

    Beste Grüße,
    W.A.

    • Das hört sich für mich danach an, dass der Bootloader im MBR installiert wurde. Dafür müsste man zusätzlich die ersten 512 Byte wiederherstellen. Dazu müsste man das Skript noch erweitern oder einfach für die Maschinen ein pre Script erstellen:

      kvm-lvm-snapshot-backup-${maschine}.sh

      Wenn ein so benanntes Skript existiert und ausführbar ist, dann wird es noch vor dem Backup gestartet. Da müsste sinngemäß hinen:

      dd if=/dev/vg/lvmname of=/tmp/bootsec.img bs=512 count=1

      Soweit erstmal dazu – ich werde das Skript noch erweitern.

      Eine andere Möglichkeit ist das System mit einem Knoppix oder DamnSmallLinux zu starten und mit chroot hineinzuwechseln. Dann kann man von dort aus den Bootloader erneut installieren.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

aai2p3

Bitte geben Sie den Text vor: