Nach dem letzten Crash bin ich dazu übergegangen die virtuellen Maschinen jede Nacht per lvm-snapshot mit lzop komprimiert zu sichern. Eine separat eingebaute Festplatte (/mnt/backup) hält diese backups. Das ultra-kurze Skript dazu sieht so aus:

#!/bin/bash
LVMS="snowhow komplett root"
VG=vg0
BUP_DST=/mnt/backup/snapshot_vms
NICE=15
VERBOSE=0
## cron needs full path to commands
LVCR=/sbin/lvcreate
LVRM=/sbin/lvremove
LVS=/sbin/lvs
VIRSH=/usr/bin/virsh
while getopts ":vl:" opt; do
  case $opt in
    v)
      VERBOSE=1
      ;;
    l)
      LVMS=$OPTARG
      ;;
  esac
done
function doBackup {
  logger -t SNAPSHOT_BACKUP "starting backup for $LV"
  if [ -f $BUP_DST/$LV-snap.lzo ]
  then
    mv $BUP_DST/$LV-snap.lzo $BUP_DST/$LV-snap.lzo.old
  fi
  $VIRSH suspend $LV
  $LVCR -L1G -s -n $LV-snap /dev/$VG/$LV
  $VIRSH resume $LV
  if [ $VERBOSE -eq 1 ]
  then
    $LVS
    SIZE=$($LVS --nosuffix --units b -o lv_size --rows --separator ':' /dev/$VG/$LV | cut -d':' -f2)
    echo $SIZE
    nice -n $NICE bash -c "dd if=/dev/$VG/$LV-snap bs=4M | pv -s $SIZE | lzop -c | dd of=$BUP_DST/$LV-snap.lzo bs=4M"
    $LVS
  else
    nice -n 15 bash -c "dd if=/dev/$VG/$LV-snap bs=4M | lzop -c | dd of=$BUP_DST/$LV-snap.lzo bs=4M"
  fi
  $LVRM -f /dev/$VG/$LV-snap
  logger -t SNAPSHOT_BACKUP "done backup for $LV"
}
for i in $LVMS
do
  LV=$i
  doBackup
done

Die Parameter funktionieren folgendermaßen: Wird der -l switch angegeben, so werden die default Logical Volumes snowhow komplett root überschrieben. Mit -v gibt es eine graphische Ausgabe des Fortschritts. Damit die VM im suspend Modus gesichert werden kann, muss die KVM Instanz den gleichen Namen haben wie das LV auf dem sie liegt.

Natürlich läuft auch ein konventionelles backup um einzelne Files wiederherzustellen, aber sicher ist sicher.