Portál AbcLinuxu, 10. května 2025 08:49

Dotaz: Linux KVM a zálohování virtuálních strojů s Windows

29.4.2013 07:58 Jiří Panský
Linux KVM a zálohování virtuálních strojů s Windows
Přečteno: 770×
Odpovědět | Admin

Dobrý den,

rád bych se zeptal zkušenějších jak se postavil k tomuto problému, mám Linux server CentOS 6 s rozběhnutou virtualizací přes KVM, celé to obsluhuji přes virsh nebo přes virt-manager.

Virtuální stroje jsou 4x windows XP, velikot disku 40GB a 1x Win2008 server, velikost disku 120GB, všechny stroje leží nad LVM, jinak řečeno používají přímo pro ně vytvořený oddíl (každý stroj má vlastní samostatný oddíl) o dané velikosti, oddíl je následně použit ve VM jako disk.

Problém je se zálohování, mám externí NAS (podporuje iSCSI a NFS) a rád bych na něj ukládal zálohy ale přesně netuším jak se k tomu postavit, stroje mohu přes noc zastavit/vypnout, ale dělat následně nad každým strojem dd mi neprijdě příliš efektivní.

Existuje rozumnější postup? Děkuji Jiří.

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

vencour avatar 29.4.2013 09:41 vencour | skóre: 56 | blog: Tady je Vencourovo | Praha+západní Čechy
Rozbalit Rozbalit vše Re: Linux KVM a zálohování virtuálních strojů s Windows
Odpovědět | | Sbalit | Link | Blokovat | Admin
Co pracovat se snapshotama?
Ty nejhlubší objevy nečekají nutně za příští hvězdou. Jsou uvnitř nás utkány do vláken, která nás spojují, nás všechny.
29.4.2013 11:39 Jiří Panský
Rozbalit Rozbalit vše Re: Linux KVM a zálohování virtuálních strojů s Windows

Funguje tento mechanismus i nad LVM (nemám totiž žadný qcow soubor, mám jen oddíl v LVM na kterém je disk virtuálního stroje)?

Např. http://vitobotta.com/more-on-kvm-virtual-machine-host/

Zde se popisuje zálohování s snapshotem na LVM.

Domnívám se správně, že snapshot na lvm funguje tak,že změny se nezapisuji do původního LVM, ale do snapshotu, takže s původním oddílem pracovat (kopirovat ho) a virtuální stroj žije na snapshotu, následně snapshot zruším a změny se zapíšou do původního oddílu? (ted na to koukam a je tedy potřeba ten virtuální stroj vlastně vypnout 2x během zálohování ne?) J.

29.4.2013 12:24 Aleš Kapica | skóre: 52 | blog: kenyho_stesky | Ostrava
Rozbalit Rozbalit vše Re: Linux KVM a zálohování virtuálních strojů s Windows
Domníváš se správně. Aby nevznikaly problémy, tak je ideální Win stroj zastavit (aby se ti uložily na disk data z paměti), pak uděláš snapshot a stroj můžeš zase spustit. Pak teprve můžeš odzálohovat původní LV oddíl. Po skončení kopírování snapshot zrušíš, a rozdílová data se z něj zintegrujou a máš zálohu zastaveného stroje.

To je asi tak jediný způsob, jak získat zálohu Win stroje bez nekonzistentního disku, s minimálním časovým přerušením běhu virtualizovaného stroje.

Pak samozřejmě existuje ještě jiná varianta zálohování, která je založena na live migraci ale to už není tak triviální. Nehledě na obnovu z takové zálohy.
29.4.2013 10:41 Aleš Kapica | skóre: 52 | blog: kenyho_stesky | Ostrava
Rozbalit Rozbalit vše Re: Linux KVM a zálohování virtuálních strojů s Windows
Odpovědět | | Sbalit | Link | Blokovat | Admin
Rozumnější postup?

Těžko říct. Já bych se vykašlal na LVM a použil virtuální disky, připojené přes iSCSI. Zálohování bych pak řešil na straně stroje, ze kterého by byly vypublikovány. A to tak, že bych použil Btrfs a snapshotování na úrovni souborového systému.
29.4.2013 11:33 Jiří Panský
Rozbalit Rozbalit vše Re: Linux KVM a zálohování virtuálních strojů s Windows

Děkuji za info, toto bohužel asi nelze v mém případě splnit, mám pouze jeden stroj.

Koukám, že asi nebylo uplně štastné nasadit tam to LVM, měl jsem raději tedy nechat co stroj to jeden soubor s diskem, myslel jsem si původně, že to LVM mi pomůže při zálohování, respektive měl jsem představu, že když udělam snapshot LVM oddílu tak budu moci původní oddíl odkopírovat mimo virtualizační stroj a snapshot zrušit.

Tedy zastavit na chvíli stroj, udělat snapshot, pustit opět stroj, odkopírovat data mimo server, zrušit snapshot. J.

29.4.2013 12:08 hermelin | skóre: 21
Rozbalit Rozbalit vše Re: Linux KVM a zálohování virtuálních strojů s Windows
Ano - presne tak to na LVM muzes delat. Udelas snapshot na volume kterou chces zalohovat a pak se na onen snapshot odkazes napr dd apod. Ma to jedinou nevyhodu a to ze neni udrzena konzistence pro filesystem ani bezici sluzby. A jeste jedna nevyhoda je a to ze lze vzdy delat pouze full backup, nekde ani rozdilova ani inkrementalni zaloha.
29.4.2013 11:50 CandySan | skóre: 11 | blog: bonzacek
Rozbalit Rozbalit vše Re: Linux KVM a zálohování virtuálních strojů s Windows
Odpovědět | | Sbalit | Link | Blokovat | Admin
Zdar,

kdyz to mas v lvm, tak se ti muze hodit nasledujici zalohovaci script:
#!/bin/bash

# $0 {volume_group} {smazat_slozku_pripravy_zalohy}


DESTINATION='/vmshadow'
BACKUP_DIR="$DESTINATION/images"	# cilovy adresar zaloh
VOLUME_GROUP=$1
VG_PATH="/dev/"$VOLUME_GROUP
CLEAR_BACKUP_DESTINATION=$2  		# 1 - smazat uloziste pred vytvorenim nove zalohy (default); 0 - nemazat a jen pripisovat
LV_TMP_DEVICE='vmbackup'		# jmeno snapshotu
LV_SNAPSHOT_SIZE='5G'			# velikosty snapshotu

DUMP_DIR="$DESTINATION/domains"


#
# Zkontroluje zda logicky svazek smi byt zalohovan
#
# Vstupnim parametrem je nazev tesovaneho logickeho svazku
#
# Pokud ma byt vyrazen ze zalohovani, bude vracen kod 1
#
function skip_logical_volume {
	PREFIX=${1:0:3}
	if [ $PREFIX == "vm_" ]
	then
		return 0
	else
		echo "["`date`"] "" -- Ignoruji svazek $VOLUME_GROUP/$1 - nezacina prefixem \"vm_\" a tedy nesmi byt zalohovan"
		return 1
	fi
}

#
# Prochazi logickymi svazky a zavola backup pokud neni svazku zakazan backup
#
function backup_logical_volumes {
	for loc_lvolume in `ls $VG_PATH`; do
		skip_logical_volume $loc_lvolume
		if [ $? -eq 0 ]
		then
			# zaloha smi byt provedena
			do_lvbackup $loc_lvolume
		fi
	done
}

#
# Vytvori snapshot 
#
# Vstupnim parametrem je jmeno logickeho svazko jehoz snapshot se bude vytvaret
#	
function create_snapshot {
        loc_SUCCESS=''

        echo "["`date`"] ""lvcreate -L$LV_SNAPSHOT_SIZE -s -n $LV_TMP_DEVICE /dev/$VOLUME_GROUP/$1 2>&1'"
        for loc_LINE in "`lvcreate -L$LV_SNAPSHOT_SIZE -s -n $LV_TMP_DEVICE /dev/$VOLUME_GROUP/$1 2>&1`"; do
                echo "["`date`"] ""$loc_LINE"

                tmp_gline=`echo -n "$loc_LINE" | grep -E "created"`
                if [ -n "$tmp_gline" ]
                then

                        loc_SUCCESS='true'
                fi
        done

        if [ -z "$loc_SUCCESS" ]
        then
                echo "["`date`"] ""Error: nepodarilo se vytvorit snapshot $VOLUME_GROUP.$1! Koncim!"
                exit 1
        fi

}


#
# Odpoji SNAPSHOT_MOUNTPOINT a zrusi snapshot
#
function destroy_snapshot {
        loc_SUCCESS=''

        echo "["`date`"] Zaplneni snapshotu: "`lvs 2>&1 | grep $LV_TMP_DEVICE | awk '{print $6}'`'%'

        echo "["`date`"] ""lvremove -f /dev/$VOLUME_GROUP/$LV_TMP_DEVICE 2>&1"
        for loc_LINE in "`lvremove -f /dev/$VOLUME_GROUP/$LV_TMP_DEVICE 2>&1`"; do
                echo "["`date`"] ""$loc_LINE"

                tmp_gline=`echo -n "$loc_LINE" | grep -E "successfully removed"`
                if [ -n "$tmp_gline" ]
                then

                        loc_SUCCESS='true'
                fi
        done

        if [ -z "$loc_SUCCESS" ]
        then
                echo "["`date`"] "'Error: nepodarilo se odstranit snapshot!'
        fi
}


#
# Vytvori dump logickeho svazku
#
function do_lvbackup {
	echo -e "\n\n"
	echo "["`date`"] ""Priprava zalohy svazku $VOLUME_GROUP/$1"

	mkdir -p $BACKUP_DIR 2>&1

	create_snapshot $1

##	echo "["`date`"] ""ionice -c 3 nice -n 19 dd if=$VG_PATH"/"$LV_TMP_DEVICE bs=100M 2>$BACKUP_DIR"/tmp_errout" | ionice -c 3 nice -n 19 gzip --fast -f -v -c >$BACKUP_DIR\"/\"$VOLUME_GROUP\".\"$1\".raw.gz\" 2>&1"
##	ionice -c 3 nice -n 19 dd if=$VG_PATH"/"$LV_TMP_DEVICE bs=100M 2>$BACKUP_DIR/tmp_errout | ionice -c 3 nice -n 19 gzip --fast -f -v -c >$BACKUP_DIR"/"$VOLUME_GROUP"."$1".raw.gz" 2>&1
	echo "["`date`"] ""ionice -c 3 nice -n 19 dd if=$VG_PATH"/"$LV_TMP_DEVICE bs=100M 2>$BACKUP_DIR"/tmp_errout" | ionice -c 3 nice -n 19 gzip --fast -f -v -c >$BACKUP_DIR/$VOLUME_GROUP.$1.raw.gz 2>&1"
	ionice -c 3 nice -n 19 dd if=$VG_PATH"/"$LV_TMP_DEVICE bs=100M 2>$BACKUP_DIR/tmp_errout | ionice -c 3 nice -n 19 gzip --fast -f -v -c >$BACKUP_DIR/$VOLUME_GROUP.$1.raw.gz 2>&1

	cat $BACKUP_DIR"/tmp_errout"
	rm $BACKUP_DIR"/tmp_errout"
	loc_tmp_imgsize=`qemu-img info /dev/$VOLUME_GROUP/$1 | grep 'virtual size' | awk '{print $4}'`
	loc_imgsize=${loc_tmp_imgsize:1}
	loc_bckpsize=$(stat -c%s "$BACKUP_DIR/$VOLUME_GROUP.$1.raw.gz")"00"
	
	loc_cmpr=$(( $loc_bckpsize / $loc_imgsize ))
	
	echo "["`date`"] ""Velikost souboru po kompresi $loc_cmpr""%"

	destroy_snapshot
}

#
# Vytvori dump domeny (definice virtualni masiny)
#
function dump_domain {
        mkdir -p $DUMP_DIR 2>&1
        DOMAIN="$1"
        echo "["`date`"] Ukladam dump domeny $DOMAIN"
        virsh dumpxml "$DOMAIN" > "$DUMP_DIR/$DOMAIN.xml" 2>&1
}

function dump_all_domains {
	i=0
	for loc_domain in `virsh list --all | awk '{print $2}'`; do
        	if [ $i -ge 1 ]
	        then
	                dump_domain "$loc_domain"
	        fi

	        i=$((i+1))
	done

}


#
# Ukonci beh programu v pripade, ze probiha restaurovani diskoveho pole (aby nedoslo k pretizeni)
#
function exit_when_resync {
        tstresyncval=`grep resync /proc/mdstat`
        if [ -n "$tstresyncval" ]
        then
                echo "["`date`"] Probiha restaurovani diskoveho pole!"
                exit 1
        fi
}



################---------------------------------####################

if [ -z "$VOLUME_GROUP" ]
then
	echo "["`date`"] ""ERROR! Nebyla zadana skupina svazku! (VOLUME GROUP)"
	exit 1
fi

exit_when_resync

if [ "$CLEAR_BACKUP_DESTINATION" == "" ]
then
	# default hodnota je 1 (smazat)
	CLEAR_BACKUP_DESTINATION=1
fi

if [ $CLEAR_BACKUP_DESTINATION -ne 0 ]
then
	# vycisteni slozky pro pripravu dat k zalohovani
	echo "["`date`"] ""Mazu slozku pro pripravu zalohy"
	echo "["`date`"] ""rm -rf $DESTINATION/*"
	rm -rf $DESTINATION/* 2>&1
fi

echo "["`date`"] Backing up /etc"
rsync -av /etc $DESTINATION 2>&1

echo "["`date`"] Backing up /usr/local/bin"
mkdir -p $DESTINATION/usr
mkdir -p $DESTINATION/usr/local
mkdir -p $DESTINATION/usr/local/bin
rsync -av /usr/local/bin/* $DESTINATION/usr/local/bin 2>&1

dump_all_domains

backup_logical_volumes

echo "["`date`"] ""Priprava zalohy dokoncena"
musis mit nainstalovan i rsync. U me to slouzi k vytvoreni zalohy na lokalni disk, odkud si to jiny proces potom stahuje do zalohy a az tam nekde venku se provadi i rotace zaloh (pouzivam dirvish).

Zavolas to takto: (mam to nazvane lvs_dump) lvs_dump {jmeno volume group} // takto se provede smazani tmp uloziste - pokud mas vic skupin, tak se to vola s parametrem 0 lvs_dump {jmeno prvni volume group} lvs_dump {jmeno volume group1} 0 lvs_dump {jmeno volume group2} 0 lvs_dump {jmeno volume group3} 0

atd...

Obcas se muze stat, ze shodis masinu zrovna kdyz mas vytvoreny snapshot a tak mam za to, ze je dobre behem bootovani kazdy snapshot zrusit (v te dobe je uz kazdy takovy zbytecny) a tak do /etc/rc.local (nebo jakkoliv po spusteni) jeste volam tento script:
#!/bin/bash

i=0
for snapshot in `lvs 2>/dev/null | awk {'print $1'}`; do
	if [ $i -gt 0 ]
	then
		tstsn=`lvs 2>/dev/null | grep "$snapshot" | awk {'print $5'}`
		if [ -n "$tstsn" ] && [ "$snapshot" != "$tstsn" ]
		then
			vg=`lvs 2>/dev/null | grep "$snapshot" | awk {'print $2'}`
			lvremove -f '/dev/'"$vg"'/'"$snapshot"
		fi
	fi

	i=$((i+1))
done
29.4.2013 12:19 CandySan | skóre: 11 | blog: bonzacek
Rozbalit Rozbalit vše Re: Linux KVM a zálohování virtuálních strojů s Windows
Jo jeste pozor! Zapomnel jsem napsat, ze se prochazi a zalohuji jen a pouze ty svazky, ktery se jmenuji vm_{cokoliv}.

Stavajici svazky lze prejmenovat lvrename /dev/group/puvodni_jmeno /dev/group/nove_jmeno

Delam to pak tak, ze svazky virtualnich masin prefixuju bud vm_ (tedy zalohovane) nebo independent_ (abych opticky videl, ze to patri k virt. masine).

Nevadi mi pak jakakoliv zmet dalsich svazku typu root, boot, ISO atd...

A jeste jedno dulezite POZOR! Cache musis nastavit na none. To je dulezite, jinak bys zalohoval poskozene disky a nejspise by nesly obnovit.
29.4.2013 13:19 Jiří Panský
Rozbalit Rozbalit vše Re: Linux KVM a zálohování virtuálních strojů s Windows

Děkuji za script, vypadá zajímavě, zkusím si to projít.

Jestli to chápu správně, tak v tomto případě virtuální stroje nevypínáte s tím, že jsem četl upozornění, že cache se pro virtuální stroj musí nastavit na NONE (tedy zapisuje se rovnou na disk), aby data uvnitř VM byla "kozistentní", tím, že pak udělám snapshot nemělo by dojít k nekonzistentnosti, jelikož v cache nic nění.

Data si odkopiruje pomocí dd na externí úložiště a na něm si již vyřešíte tu duplikaci, dirvish neznám ale podívam se na něj.

Zeptám se ještě hloupě, rsync nelze použít přímo nad LVM oddílem (uvažujmě, že snapshot již mám hotov) místo dd a přenášet pouze změněná data? Jelikož i tom než přenesu např. 120GB dat na externí uložiště tak to chvíli potrvá (uložístě používa NFS). J.

29.4.2013 14:19 CandySan | skóre: 11 | blog: bonzacek
Rozbalit Rozbalit vše Re: Linux KVM a zálohování virtuálních strojů s Windows
Rsync jsem uvedl jen kvuli tomu, ze mi tam pozustal z davnejsi doby. Pro soucasny ucel (zde ve scriptu) je dokonce mozna spis jen na skodu a sel by nahradit cp.

Pouzit rsync primo nad lvm..? Neni to zcestna myslenka, ale odpoved zatim neznam. Mam vsak za to, ze to nebude mit zadny prinos v pripade, kdy se vse odehrava na stroji, ke kteremu je pripojeno sitove uloziste. Mam za to, ze to ma vyznam jen tehdy, kdyz na obou stranach (vzdalene stroje) bezi rsync a komunikuji spolu. Pokud se nepletu, tak se musi postupne cist jak zdroj, tak cil a porovnavaji se rozdily a jen ty se zaslou. Logicky mi z toho vychazi, ze to je zajimave jen tehdy, kdyz se o tom domluvi 2 rsync procesy, ktere maji pristup ke svym lokalnim datum a vzdalenemu jen sdeli vysledek. Tedy v pripade pripojeneho vzdaleneho uloziste by stejne jeden z tech souboru cely protekl siti.

Jelikoz taky ukladam i pres net a to ruzne i ze siti ve firmach za natem na adsl, tak prave z tohoto duvodu vytvarim lokalni kopii na nejaky nemirorovany disk, ktery existuje jen pro tento ucel. Tam se to vytvori a pak se to taha postupne do zalohy kdyz uz script davno dobehnul a uz jsou zrusene snapshoty.

Ve scriptu se volume rovnou komprimuje a obvykle se ta velikost srazi na pulku. Kdyz jsem komprimoval pomoci gzip a uroven komprimace jsem nechal vychozi (komprimoval jsem zkopirovane raw soubory), tak se obvykle vysledky moc nemenily a speedup jsem mel treba i 70 na stroji, ktery jsem zalohoval jen 1x tydne (data jsem zalohoval denne jinym procesem). U stroju, ktere zalohuju i denne cele a gzip ma nastavenou uroven komprese na 1 a nove tedy zalohuju lvm svazky a ne raw soubory, tak speedup mam jen kolem 1 az 1,2 - proste trapne. Zatim nevim cim to je, jen na to upozornuju a je dobre timto smerem zapatrat.

Zaroven by bylo zajimave zjistit, zda se pri zapausovani virtualky nevysype (spolehlive) cache..? Tohle je potreba prokonsultovat s odborniky, ale pokud by tomu tak bylo, tak by stacilo rozsirit script o pridani pause, vytvoreni snapshotu a hned po vytvoreni zase odpausovat stroj. Nikomu by ta chvilkova nedostupnost nemela nijak vadit a po celou dobu zivota toho snapshotu by uz jinak virtualka mohla fungovat. Ja bych vsak cache nezapinal nikdy, protoze jakykoliv pad fyzickeho stroje (vypadek proudu, lidska chyba atd...) by zpusobila zniceni uloziste virtualniho stroje.

Mam to tedy bez cache a stroje nijak nevypinam a zalohuju za behu. Takto jsem zalohoval cele uloziste najednou, ve kterem byly raw soubory, ale to jsem musel zmenit (viz. muj dotaz ohledne podivnych problemu s vykonem uloziste). V te konfiguraci jsem se nemusel starat ani o to, zda jsou jednotliva uloziste konzistentni vuci sobe (napr. uvnitr virtualky dalsi lvm pres nekolik virtualnich disku), protoze se vzdy udelal snapshot celeho uloziste najednou. Ted je to samozrejme jine kdyz zalohuju jeden svazek za druhym. V teto variante si musim davat pozor abych mel data uvnitr rozdelena tak aby to nevadilo. Nastesti zvetsovat lvm svazky muzu libovolne a uvnitr virt. masiny pak vzdy jen pridam dalsi partition (napr. pro lvm), nebo widle rozsiruju pomoci parted.
29.4.2013 14:27 hermelin | skóre: 21
Rozbalit Rozbalit vše Re: Linux KVM a zálohování virtuálních strojů s Windows
kdysi jsem to nekde zahlednul - vypada ze to je to co hledas https://github.com/mpalmer/lvmsync
Zdeněk Zámečník avatar 29.4.2013 16:47 Zdeněk Zámečník | skóre: 26
Rozbalit Rozbalit vše Re: Linux KVM a zálohování virtuálních strojů s Windows
Odpovědět | | Sbalit | Link | Blokovat | Admin
Doporučuji vyzkoušet tento postup. Jednoduše vytvoříš LVM snapshot a potom uděláš rdiff-backup. S trochou štěstí to bude fungovat přesně tak, jak sis přál. Jen je škoda, že už se rdiff-backup neudržuje...

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.