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.