{{tag> kvm,lvm,backup}} ====== LV auf zweiten Server klonen ====== Falls man in der komfortablen Lage ist, zwei Virtualisierungsmaschinen parallel laufen zu haben, kann man recht komfortabel und im laufenden Betrieb ein Snapshot des LVs von Server 1 auf Server 2 übertragen. Das Skript geht davon aus, dass auf beiden Servern identische VMs mit LVM eingerichtet sind. Außerdem kann man passwortlos per SSH auf die Backup-Maschine zugreifen. Falls eine Email-Adresse angegeben wird, muss der Email-Versand eingerichtet sein. Im wesentlichen wird sichergestellt, dass der aktuelle Server der ist, auf dem die VM läuft und diese auf dem Backup-Server nicht läuft. Die Größe wird verglichen und ggf. angepasst. Es gibt zweifellos noch einige Verbesserungsmöglichkeiten - aber bei uns läuft das erstmal so und macht nachts ein schnelles (ca. 8 minuten) Backup unseres Webservers (~80GB). Vielleicht ist es (ganz oder in Teilen) hilfreich für irgendjemanden. #!/bin/bash # this script assumes, that the target server is passwordless ssh-able # and that the user has sudo-rights on the local and the target-system # for mailing functionality install and setup mailutils / ssmtp # run on one of the kvm hosts user="serveradmin" source="" target="" mailto="" snapshot="backup" log="vmbackup.log" echo "Running vmbackup on $(hostname) at $(date) - syncing $source to $target" | tee "$log" if [ "$#" -eq 0 ]; then echo "X no vm name passed - ABORT" | tee -a "$log" exit 1 fi vm=$1 # check for needed packages/install - local and remote echo "* apt install needed packages" sudo apt install -y pigz pv &> /dev/null ssh $user@$target sudo apt install -y pigz pv &> /dev/null # check if vm is running locally (it has to) if [ "$(virsh list | grep $vm | grep -c 'running')" == "1" ]; then echo "* vm $vm running on source - OK" | tee -a "$log" else echo "X vm $vm not running on source - ABORT" | tee -a "$log" exit 1 fi # check if vm is running on remote machine (its not allowed to) if [ "$(virsh -c qemu+ssh://$user@$target/system list | grep $vm | grep -c 'running')" == "1" ]; then echo "X vm $vm is running on backup target - ABORT" | tee -a "$log" exit 1 else echo "* vm $vm not running on remote machine - OK" | tee -a "$log" fi # get name and size - local and remote - of lv from vm name (hopefully) locallvname=$(virsh dumpxml $vm | grep -A 3 ' /dev/null lvsnapshot=$(sudo lvs -o lv_path | grep $snapshot | tr -d " ") fi # ssh dd snapshot to other kvm host echo "* copy snapshot lv to backup lv" | tee -a "$log" sudo dd if=$lvsnapshot bs=4096 | pv | pigz | ssh $user@$target "pigz -d | sudo dd of=$remotelvname bs=4096" # delete snapshot lv echo "* remove snapshot lv" sudo lvremove -y $lvsnapshot &> /dev/null echo "* finished backup" | tee -a "$log" # mail log if [ "$mailto" != "" ]; then echo "* send log by mail" mail -s "SCRIPT: vmbackup finished on $(hostname)" $mailto < $log fi