Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| anwenderwiki:virtualisierung:kvm:kvm_clone [2020/03/22 23:41] – angelegt thoschi | anwenderwiki:virtualisierung:kvm:kvm_clone [2020/03/23 07:23] (aktuell) – thoschi | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | {{tag> kvm, | ||
| + | |||
| + | ====== 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, | ||
| + | |||
| + | 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=" | ||
| + | source="< | ||
| + | target="< | ||
| + | mailto="" | ||
| + | snapshot=" | ||
| + | | ||
| + | log=" | ||
| + | | ||
| + | echo " | ||
| + | | ||
| + | if [ " | ||
| + | echo "X no vm name passed - ABORT" | tee -a " | ||
| + | exit 1 | ||
| + | fi | ||
| + | | ||
| + | vm=$1 | ||
| + | | ||
| + | # check for needed packages/ | ||
| + | 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 [ " | ||
| + | echo "* vm $vm running on source - OK" | tee -a " | ||
| + | else | ||
| + | echo "X vm $vm not running on source - ABORT" | tee -a " | ||
| + | exit 1 | ||
| + | fi | ||
| + | | ||
| + | # check if vm is running on remote machine (its not allowed to) | ||
| + | if [ " | ||
| + | echo "X vm $vm is running on backup target - ABORT" | tee -a " | ||
| + | exit 1 | ||
| + | else | ||
| + | echo "* vm $vm not running on remote machine - OK" | tee -a " | ||
| + | fi | ||
| + | | ||
| + | # get name and size - local and remote - of lv from vm name (hopefully) | ||
| + | locallvname=$(virsh dumpxml $vm | grep -A 3 '< | ||
| + | locallvsize=$(sudo lvs $locallvname -o LV_SIZE --noheadings --units b --nosuffix | tr -d " " ) | ||
| + | remotelvname=$(virsh -c qemu+ssh:// | ||
| + | remotelvsize=$(ssh $user@$target sudo lvs $remotelvname -o LV_SIZE --noheadings --units B --nosuffix | tr -d " " ) | ||
| + | | ||
| + | # compare sizes | ||
| + | if [ " | ||
| + | echo "* local size of lv ($locallvsize) differs from remote ($remotelvsize) - resizing remote lv" | tee -a " | ||
| + | ssh $user@$target sudo lvextend -L ${locallvsize}B $remotelvname | ||
| + | remotelvsize=$(ssh $user@$target sudo lvs $remotelvname -o LV_SIZE --noheadings --units B --nosuffix | tr -d " " ) | ||
| + | if [ " | ||
| + | echo "X size still does not matter - GIVING UP" | tee -a " | ||
| + | break 1 | ||
| + | fi | ||
| + | else | ||
| + | echo "* local and remote size match - OK" | tee -a " | ||
| + | fi | ||
| + | | ||
| + | # create snapshot | ||
| + | if [ " | ||
| + | echo "X the snapshot-lv exists - ABORT" | tee -a $log | ||
| + | exit 1 | ||
| + | else | ||
| + | echo "* create snapshot lv" | tee -a $log | ||
| + | sudo lvcreate -l100%FREE -s -n $snapshot $locallvname &> /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 " | ||
| + | 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" | ||
| + | | ||
| + | # mail log | ||
| + | if [ " | ||
| + | echo "* send log by mail" | ||
| + | mail -s " | ||
| + | fi | ||