Portál AbcLinuxu, 20. říjen 2019 20:45

Zálohovanie na domáci server

6.11.2012 05:00 | Přečteno: 2825× | poslední úprava: 6.11.2012 00:29

Zdravím

Trochu skriptujem v BASHi a ako každý správny linuxák som mal neodolatelnú potrebu napísať si vlastný zálohovací skript. Prezentované riešenie je výhodné v tom, že vštky zálohy vyzerajú ako plné aj keď sú v skutočnosti inkrementálne. Bola to dobrá motivácia na zdokonalenie skriptovania.

Na úvod ešte spomeniem že na skripte sme pracovali spolu s bratrancom čiže nieje to len moje dielo :-).

Požiadavky:

Chcem zálohovať domáce fotky, dokumenty a prácu. Je to cca 50GB dát z toho viac ako polovica sú menšie súbory v rozsahu 1MB - 5MB. Z toho sa deňne mení len malá časť (cca 200MB), zvyšok sa nemení. Zálohvoať sa bude na domáci server. Záloha musí prebehnúť čo najrýchlejšie. Zálohy musia byť prehliadateľné cez štandardný filemanager (napr MC) aby bolo možné prezerať a obnoviť aj jednotlivé súbory bez potreby špecialnej aplikácie čo vytvorila zálohu (pre prípad kompletnej havárie notebooku). Adresárová štruktúra musí vyzerať pri každej zálohe presne rovnako ako oreginál (vyzualne nesmie nič z 50GB súborov chýbať). Nenáročnosť na HW prostriedky. Kompresia nieje potrebná.

Hlavné súčasti riešenia:

Rsync - plná záloha:

rsync -ab --log-file=$tgf/00_full.log --block-size=$blok -X /tmp/exclude -d $s1 $tgf Rsync skopíruje všetko do nového umiestnenia, spraví log, vylúči súbory čo sa nebudú zálohovať,a data bude kopírovať po blokoch zadanej velkosti

Rsync - prírastková záloha:

rsync -ab --block-size=$blok --link-dest=$lbf -X /tmp/exclude -d $s1 $tgi

Rsync postupuje rovnako ako pri plnej zálohe. Na nezmenené súbory spravý hardlink namiesto kopírovania.

SSHFS - prístup na server:

sshfs tomolc@$iph:/home/tomolc/zalohy/tomolc $tg

Kontrola či NB bezí z batérie:

cat /sys/class/power_supply/ACAD/online

V prípade že NB beží z batérie spraví sa len prírastková záloha.

Samotný skrypt pridáva niekoľko obslužných pasáži, ktoré kontrolujú stav NB, pripoja domáci server a vyhodnotia aká záloha sa uskutoční - full alebo prírastková.

V dizkuzii by som sa chcel poradiť ohladom optimálnosti riešenia vzhladom na čas zálohovania na 100Mbit LAN a jednojadrovom CPU na notebooku (Intel Core2Solo 1,6Ghz). Pôvodná predstava bola, že plnú zálohu stačí robiť raz za niekoľko mesiacov a prírastkovú potom každý deň.

Je dvoležité aby dáta v zálohe vyzerali rovnako ako oreginál. V prípade že si zmažem omylom súbor tak si jednoducho cez sshfs pripojím disk so zálohou a skopírujem cez filemanager záložný súbor nazad do notebooku.

Skript vyzerá takto: (Zatial som neprerobil všetky komenty do AJ - v tom som začiatočník.)


echo "back_remote======================================================="
ac=`cat /sys/class/power_supply/ACAD/online`
#if [ "$ac" = "0" ]; then echo "power off-line"; exit; fi

dnorm="`date +'%Y-%m-0%d_%H-%M-%S'`" #human date
dunix="`date '+%s'`" #unix date in "s"
bn=30 #backup numbers
hm=$HOME #user home
export DISPLAY=:0

blok=32768 #65536, 16384
iph=192.168.0.101 #ip servera urceneho na zalohy
fbd=60 #full backup time period in days
ibh=24 #incremental backup time period in hours
fbt=`echo $(($fbd * 24 * 3600))` #full backup time period in "s"
ibt=`echo $(($ibh * 3600))` #incremental backup time period in "s"

s1="$hm" #source dirs to backup
tg=/media/netfs/.z_back_remote #remote backup target
tgf=$tg/$dnorm-full #target full backup
tgi=$tg/$dnorm-incr #target incr backup
lbf=$tg/00_last_backup_full #last backup full symlink
lbi=$tg/00_last_backup_incr #last backup incr symlink

echo "mobac
.mobac
XnView.db
.thumbnails
lost+found
.cache
" > /tmp/exclude #users excludet dirs or files

#zalohovacie funkcie----------------------------------------------------
function backfull () {
	echo "full_backup==================================================="
	cd $tg; mkdir $tgf #vytvori ciel pre novu plnu zalohu
	if [ -L "$lbf" ]; then rm $lbf; fi
	ln -s $dnorm-full 00_last_backup_full #vytvori novy simlink aby bolo jasne ktora zaloha je posledna plna
	echo $dunix > $tgf/full.time #poznaci unixovi datum tejto plnej zalohy
	echo "backfull"
	rsync -ab --log-file=$tgf/00_full.log --block-size=$blok -X /tmp/exclude -d $s1 $tgf
	echo "end==========================================================="; sleep 3
	}
function backincr () {
	echo "incremental_backup============================================"
	cd $tg; mkdir $tgi
	if [ -L "$lbi" ]; then rm $lbi; fi
	ln -s $dnorm-incr  00_last_backup_incr
	echo $dunix > $tgi/incr.time
	echo "backinr"
	rsync -ab --block-size=$blok --link-dest=$lbf -X /tmp/exclude -d $s1 $tgi
	echo "end==========================================================="; sleep 3
	}

#sprava uloziska--------------------------------------------------------
function hzon () {
	ping -c 3 -W 3s $iph > /dev/null
		if [ "$?" = "0" ]; then	echo "domaci server je online"; sync
			sshfs tomolc@$iph:/home/tomolc/zalohy/tomolc $tg
		else echo "domaci server je offline"; exit
		fi
}
function hzoff () { sync; sync; fusermount -u /media/netfs/.z_back_remote;}

#kontroly---------------------------------------------------------------
function control () {
	rsync --version &>/dev/null
	if [[ ! $? -eq 0 ]]; then echo "nainstaluj program rsync"; exit; fi

	sync; sleep 2
	if [ ! -f "$tg/tomolc.test" ]; then hzon; else echo "Server uz je pripojeny, zacinam zalohovanie"; fi
}

#samotne zalohovanie----------------------------------------------------
control; cd $tg
if [ -d "$lbf" ]; then dplna="`cat $lbf/full.time`"; else dplna=0; fi #pri uplne prvom spusteni spravi plnu zalohu, pri dalsich uz pracuje podla ligiky nizsie
if [ -d "$lbi" ]; then dprir="`cat $lbi/incr.time`"; else dprir=0; fi #pri uplne prvom spusteni spravi plnu zalohu, pri dalsich uz pracuje podla ligiky nizsie

if [ "$ac" = "0" ]; then echo "sekcia 1 power off-line"; echo "INCREMENTAL"; fi #ak NB bezi na baterku urobi sa len prirastkova zaloha.
if [ "$ac" = "1" ]; then #ak je PC pripojeny do elektriky tak sa rozhoduje co dalej
	echo "sekcia 2 power online"
	if [ `echo $(($dunix - $dplna))` -ge $fbt ]; then #podmienka vypocita ako stara je posledna plna zaloha a ak je starsia ako FB (def hore) spravy znova plnu zalohu
		echo "sekcia 2-3 plna"
		backfull
	elif [ `echo $(($dunix - $dprir))` -ge $ibt ]; then
		echo "sekcia 2-4 prirastkova"
		backincr
	else echo "dnes uz zaloha prebehla"
	fi
	long="`ls -t $tg | tail -n +$bn`" #list backup older of backup numbers
	#if [ ! "$long" = "" ]; then echo "remove old backup"; cd $tg; rm $long; fi #remove old backup
fi
sync; sleep 1; sync; hzoff
echo "end==============================================================="; sleep 3
       

Hodnocení: 75 %

        špatnédobré        

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

Komentáře

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

Vložit další komentář

Josef Kufner avatar 6.11.2012 11:55 Josef Kufner | skóre: 69
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Odpovědět | Sbalit | Link | Blokovat | Admin
Koukni na rdiff-backup. Je to rsync + inkrementální zálohy.
Hello world ! Segmentation fault (core dumped)
AsciiWolf avatar 6.11.2012 13:48 AsciiWolf | skóre: 39 | blog: Blog
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
+1
gtz avatar 6.11.2012 11:57 gtz | skóre: 27 | blog: merlins | Brno - Venkov / Rosicko
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Odpovědět | Sbalit | Link | Blokovat | Admin
Pôvodná predstava bola, že plnú zálohu stačí robiť raz za niekoľko mesiacov a prírastkovú potom každý deň.
Pokud nebudete dělat rotaci záloh (myslím změnu disku, médií apod.) pak Vám stačí udělat plnou pouze jednou a následně pouze increment.
- nejhorší jsou trpaslíci ... Ti Vám vlezou úplně všude
6.11.2012 12:23 tomolc | skóre: 29 | blog: Live Desktop Tuning | Bratislava
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Ďakujem za reakcie.

Tá inkrementálna záloha mi robí aj hardlinky na nezmenené súbory. Keď dám df -h filesystém sa tváry akože som tam nakopíroval ďalších 50GB dát aj keď sa realne kopírovalo povedzme len 1GB.

Keď takto virtuálne zaplním disk budú zálohy fungovať ďalej? Na disku je ext4. Je to otázka voľby FS?
pocasienahorach.sk
gtz avatar 6.11.2012 19:45 gtz | skóre: 27 | blog: merlins | Brno - Venkov / Rosicko
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Nejsem si jistý zda by se do scriptu nemusel přidat přepínač pro hardlinky (--hard-links). Díval jste se zda se to nějak celé nezacyklilo protože "df" ukáže total. Když se to kopírovalo včetně těch hardlinků jsou ty hardlinky na cílovém systému stejné?
- nejhorší jsou trpaslíci ... Ti Vám vlezou úplně všude
6.11.2012 20:55 tomolc | skóre: 29 | blog: Live Desktop Tuning | Bratislava
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Zdravím

Priamo rsync robí hardlinky cez --link-dest=/posledna/plna/zaloha. Čiže v pri inkrementálnej zálohe sa skopírujú len zmenené súbory voči poslednej plnej zálohe a na zvyšok sa spravia hardlinky. Samozrejme posledná plná záloha aj inkrementálne zálohy sú na rovnakej partícii disku na servery.
pocasienahorach.sk
frEon avatar 6.11.2012 12:02 frEon | skóre: 40 | Praha
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Odpovědět | Sbalit | Link | Blokovat | Admin
ve vecech jako fbt=`echo $(($fbd * 24 * 3600))` muzes usetrit jedno volani echo a jeden subshell a napsat rovnou:

fbt=$(($fbd * 24 * 3600))

Talking about music is like dancing to architecture.
6.11.2012 12:30 tomolc | skóre: 29 | blog: Live Desktop Tuning | Bratislava
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Zdravím

ušetrím subshell aj v tomto prípade?:

dnorm="`date +'%Y-%m-0%d_%H-%M-%S'`" ---> dnorm=$(date +'%Y-%m-0%d_%H-%M-%S')
pocasienahorach.sk
frEon avatar 6.11.2012 14:06 frEon | skóre: 40 | Praha
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
ne. `` a $() je v bashi ekvivalentni zapis az na rozdil v tom, ze $() muzes vnorovat do sebe (jelikoz jde u toho poznat, co je zacatecni znak a co ukoncovaci) a vzdycky to pusti subshell.

Usetreni jsem myslel v pripade, kdy nechas bash udelat subshell, v nem spustit echo a tomu predat vysledek toho vypoctu v $(()).

Jinak $(()) zadnej subshell nepousti, vpodstate to jenom rika bashi, to co je uvnitr vyhodnot jako aritmetyckej vyraz a vrat to.

Talking about music is like dancing to architecture.
6.11.2012 12:07 RapMan | skóre: 14 | blog: RapMan
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Odpovědět | Sbalit | Link | Blokovat | Admin
Ja pouzivam grsysnc, hezky si to naklikam...
Michal Fecko avatar 6.11.2012 14:30 Michal Fecko | skóre: 31 | blog: Poznámkový blog
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Kým iní ešte klikajú, ja už ENTRUJEM :-D
Michal Fecko avatar 6.11.2012 14:30 Michal Fecko | skóre: 31 | blog: Poznámkový blog
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Odpovědět | Sbalit | Link | Blokovat | Admin
Kým iní ešte klikajú, ja už ENTRUJEM :-D
6.11.2012 14:59 Ondrej 'SanTiago' Zajicek
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Odpovědět | Sbalit | Link | Blokovat | Admin
Pochopil jsem to spravne, ze delas rsync na filesystem pripojeny pres sshfs? Proc tak slozite? rsync umi vyuzit ssh primo (cil se zada jako user@host:path) a je to tak rozhodne vic duveryhodne reseni.

6.11.2012 16:55 tomolc | skóre: 29 | blog: Live Desktop Tuning | Bratislava
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Ďakujem za tip. Toto som v man prehliadol. Idem to prerobiť.
pocasienahorach.sk
Michal Fecko avatar 6.11.2012 17:45 Michal Fecko | skóre: 31 | blog: Poznámkový blog
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
alebo este vyuzit kluce SHA a netreba ani heslo :-D
Josef Kufner avatar 6.11.2012 19:14 Josef Kufner | skóre: 69
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
RSA ;-)

A pak to ještě hodit do cronu a je vystaráno.
Hello world ! Segmentation fault (core dumped)
Michal Fecko avatar 6.11.2012 19:43 Michal Fecko | skóre: 31 | blog: Poznámkový blog
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Presne RSA :D + cron :D
6.11.2012 15:27 Robertek | skóre: 5
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Odpovědět | Sbalit | Link | Blokovat | Admin
Podivej se na rsnapshot a pak zauvazuj zda je treba vymejslet kolo.
6.11.2012 20:56 tomolc | skóre: 29 | blog: Live Desktop Tuning | Bratislava
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Ďakujem za typ určite vyskúšam. Tento program som v dobe tvorenia skriptu nenašiel.
pocasienahorach.sk
6.11.2012 17:06 marek_hb
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Odpovědět | Sbalit | Link | Blokovat | Admin
Příloha:
na tohle je super rdiff-backup - umí inkrementální zálohy a v backup adresáři udržuje v čitelném stavu poslední zálohu a přes rdiff-backup-fs umí připojit zálohu jako klasickou adresářovu strukturu - taky super věc

do přílohy dávám svůj první a jediný script, co jsem kdy dělal :-) - stálo mě to X nervů a marného vzpomínání na ATARI 800XE a BASIC před víc jak 20 ti lety - tehdy jsem naposledy něco "programoval" :-) - ale funguje jak potřebuju :-)

zkoušel jsem něco podobného naklikat, ale jak v gnome, tak v kde jsem narážel na různé pič.viny kvůli kterým jsem se na to musel vykašlat

6.11.2012 20:02 diverman | skóre: 32 | blog: život s tučňáčkem
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Odpovědět | Sbalit | Link | Blokovat | Admin
Zkoušel sis cvičně zálohu obnovit? Neschopnost obnovit zálohu=nemít zálohu.
deb http://ftp.cz.debian.org/debian jessie main contrib non-free
Michal Fecko avatar 6.11.2012 20:13 Michal Fecko | skóre: 31 | blog: Poznámkový blog
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Ako to kazdotyzdenne zalohovanie na pasku z ktorej sa vyklula paska cistiaca :D
gtz avatar 6.11.2012 20:28 gtz | skóre: 27 | blog: merlins | Brno - Venkov / Rosicko
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
a pak telefon ... "umřel nám server, potřebujeme hodně rychle data nazpět" .... potom zpocené čelo, pot .. rychle cigáro a kafe a hledat tu zálohu na které něco je :-)
- nejhorší jsou trpaslíci ... Ti Vám vlezou úplně všude
6.11.2012 21:01 tomolc | skóre: 29 | blog: Live Desktop Tuning | Bratislava
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Zdravím

Ano skúšal. Pripoil som si cez SSHFS umiestnenie záloh a následnie som si cviťčne vykopíroval z poslednej inkrementálnej zálohy nejaký film a pár súborov na lokálny disk. Prebehlo to ok.
pocasienahorach.sk
Bedňa avatar 7.11.2012 11:27 Bedňa | skóre: 34 | blog: Žumpa | Horňany
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Odpovědět | Sbalit | Link | Blokovat | Admin
Záloha na domáci server nieje záloha, máš to na tom istom vedení, jeden elektrický šok a máš po všetkom.

Hlavne veci ako fotky a vlastnú tvorbu (programy atď.) si treba zálohovať aspoň dva krát. Mám jeden USB disk z vstavanou ochranou proti prepetiu, pripojujem ho len za pekného počasia, vyzálohujem a hneď odpojím. Rozrobené veci, väčšinou v rádach KB hádžem na jeden server ku kámošovi a ešte na jeden čo mám v prenájme, tak len toľko. Teraz ti to možno príde ako blbosť, ale keď o všetko prídeš, dáš mi zapravdu ;)
KERNEL ULTRAS video channel >>>
7.11.2012 20:28 tomolc | skóre: 29 | blog: Live Desktop Tuning | Bratislava
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Zdravím

Ano, máte pravdu. V šuplíku na spodku skrinky mám hardisk, ktorý pravidelne pripájam cez USB a odzálohujem tam disk :-).
pocasienahorach.sk
Bedňa avatar 7.11.2012 20:42 Bedňa | skóre: 34 | blog: Žumpa | Horňany
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
A fotky si určite niekde uploadni, alebo daj spraviť vo fotolabe, strata môže bolieť.
KERNEL ULTRAS video channel >>>
9.11.2012 11:08 xHire | skóre: 20 | blog: Linuxovník
Rozbalit Rozbalit vše Re: Zálohovanie na domáci server
Mám zvláštní odpor k zálohování na stejný typ média, jako na kterém jsou původní data.

Hlavní zálohy (neinkrementální) v delších intervalech dávám na DVD-RAM, zálohy „pro jistotu“ (jen důležitá data, co se hodně mění, abych neměl jen zálohu měsíc starou) pak každou půl hodinu na SDHC kartu ve slotu v notebooku (via rdiff-backup).
Kryptoměny a bločenka.

Založit nové vláknoNahoru

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