Automatinis atsarginių kopijų kūrimas su rsync ir Notify-OSD pranešimai

2009-06-24 · 17 comments

in Linux,Programavimas

Iš pradžių norėjau papasakoti tik apie Ubuntu Notify-OSD pranešimų rodymą iš komandinės eilutės ir kaip juos privesti veikti iš crontab aplinkos. Tačiau galiausiai vistiek nusprendžiau papasakoti pilną istoriją, todėl kartu sužinosite ir apie atsarginiu kopijų darymą su rsync.

Notify-OSD pranešimai

Į Ubuntu 9.04 Jaunty Jackalope versiją buvo įdiegta nauja informacinių pranešimų sistema – Notify-OSD. Notify-OSD atsakinga už programų ir operacinės sistemos informacinių pranešimų valdymą ir rodymą vartotojui. Apie juos plačiau galite pasiskaityti Mark Shuttleworth bloge arba oficiame puslapyje. Man iškart kilo klausimas, kaip rodyti custom pranešimus. Notify-OSD biblioteka turi C, C# ir Python API. O ką daryti kitiems? Kitiems siūloma naudotis komandine eilute. Tereikia susiinstaliuoti libnotify-bin biblioteką ir bus galima naudotis notify-send komanda:

1
notify-send "Title" "Info message"

Gausime štai tokį informacinį pranešimą su tekstu (jop, neiškenčiau kartu nepaspaudinėti ir ekrano šviesinimo mygtuko):

Ubuntu Notify-OSD popup

Atsarginės kopijos

Kad reikia daryti atsargines kopijas – žinom visi. Nuo tada, kai pavogė mano seną nešiojamą kompiuterį, į visą šį reikalą žiūriu daug rimčiau. Atsarginių kopijų darymo principai skiriasi priklausomai nuo to, kokios yra naudojamos sistemos. Serveriuose naudojami vienokie būdai, namų kompiuteriuose – kitokie. Aš pats turiu nešiojamą kompiuterį. Mano atsarginių kopijų darymo tikslas – išsaugoti informaciją, jei kas nors nutiktų kompiuteriui, todėl dubliuoti duomenis tame pačiame diske yra nelogiška. Tam naudoju išorinį diską, jungiamą per USB jungtį. Čia iškyla keletas klausimų, kuriuos reikia išspręsti:

  • Diskas ne visada yra prijungtas.
  • Atsarginių kopijų kūrimas turi būti automatizuotas. Nesinori rankomis paleidinėti skripto, kai prijungiamas diskas.

Atsarginių kopijų kūrimo skriptas

Problemą išsprendžiau pasirašęs nesudėtingą bash skriptą, tikrinantį ar yra prijungtas mano nurodytas diskas. Jei diskas prijungtas, vykdomi duomenų sinchronizavimo darbai. Skriptą leidžiu periodiškai, porą kartų per dieną. Kadangi duomenų pokyčiai nėra dideli, tai tokio dažnumo man pilnai užtenka, turint omenyje, kad sinchronizavimas bus atliktas vidutiniškai kas 2-3 dienas (tada būsiu prisijungęs išorinį diską). Kadangi skriptas vykdomas periodiškai su crontab pagalba, tai pasinaudodamas Notify-OSD išvedu į ekraną informacinius pranešimus. Skriptas atrodo taip:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/bin/bash
#author: Povilas Balzaravičius 2009
#
 
BACKUP_DISK="/media/E";
 
#Checks if disk passed as parameter $1 is mounted to the system.
is_mounted ()
{
	if [ -z "$1" ]
	then
		notify "Disk path is zero length."
	else
		if mount|grep $1 > /dev/null;
		then
			return 1;
		else
			return 0;
		fi
	fi
}
 
#Displays notify message balloon.
notify ()
{
	/usr/bin/notify-send "Backup" "$1"
}
 
is_mounted $BACKUP_DISK
disk_mounted=$?
export DISPLAY=:0 #For cronjob using gui notifications.
 
#If disk is mounted, let's do backups.
if [ "$disk_mounted" -eq 1 ]
then
	notify "Started"
	rsync -Pva /home/pawka/C/Documents/* "$BACKUP_DISK/backup/Documents"; 
	rsync -Pva --delete /home/pawka/www/* "$BACKUP_DISK/backup/www"; 
	rsync -Pva --delete /home/pawka/darbai/* "$BACKUP_DISK/backup/darbai"; 
	rsync -Pva --delete /home/pawka/tools/* "$BACKUP_DISK/backup/tools"; 
	notify "Finished"
else
	notify "Disk $BACKUP_DISK is not mounted."
fi
 
exit 0;

Atkreipkite dėmesį į šią eilutę:

31
export DISPLAY=:0 #For cronjob using gui notifications.

Ji reikalinga, kad vykdant blowcronjob būtų galima rodyti pranešimus vartotojo grafinėje aplinkoje. 0 (nulis) nurodo darbalaukio numerį. Jei nebūtų šios eilutės, informaciniai pranešimai nebūtų rodomi. Analogiškai, jei iš cron aplinkos norite paleisti kokią nors grafinę programą, taip pat turite nurodyti šį parametrą. Pavyzdžiui norėdami ryte atsibusti su muzika, į cron’ą turite įrašyti šią eilutę:

1
30 6 * * * export DISPLAY=:0 && vlc http://jungletrain.net/64kbps.m3u

Atsarginių kopijų darymo skripte nusirodykite savo diską į kurį norite kopijuoti duomenis (BACKUP_DISK kintamasis), pakeiskite rsync katalogus, kuriuos norite išsaugoti ir naudokit į sveikatą.

  • http://karolis.pocius.lt Karolis Pocius

    Aš tai atsarginėms kopijoms daryti naudoju Back In Time programą – čia kaip sakant ne tokiems g33k’ams kaip tu :) Planuoju apie ją parašyt atskirai.

    Beje, login ambasadoriaus ženkliuką jau gali nusiimt ;)

  • http://pawka.linija.net/ Pawka

    Karoli, O kur tu dedi duomenis? Į išorinį HDD ar kokį home-serverį? Jei į išorinį diską, tai kaip Back In Time elgiasi, kai diskas neprijungtas? Beje, ji veikia visada kaip atskiras daemonas ar surašo vykdymo skriptus į crontab’ą?

    P.S. Ženkliuką išsiėmiau :-)
    P.P.S. Radau atsakymą dėl cron’o – surašo duomenis į jį.

  • http://karolis.pocius.lt Karolis Pocius

    Jep, programa realiai yra tik UI keliems skriptams, tarp jų ir tam pačiam rsync’ui. O jei neranda išorinio HDD, paprašo, kad jį per 30 sekundžių įjungtum. Jei to nepadarai, tą backup praleidžia ir laukia kito eilės. Be to, ji daro inkrimentinius backup’us – t.y. išsaugo tik tai kas pasikeičia, o į kitus failus sudeda hardlink’us, todėl galima labai daug backup’ų sutalpint į vieną diską, o po to labai lengva pasirinkti kurį būtent nori atkurti.

  • http://pawka.linija.net/ Pawka

    Taip, mačiau, kad snapshoot’us daro. Pats irgi galvojau ar man reikia jų. Kadangi kompiuteriu naudojuosi pats vienas, o ne visa šeima ar giminė, tai nusprendžiau jų atsisakyti. Be to, kodui naudoju paskirstytą versijavimo sistemą (jei konkrečiai – GIT). Tai, kiekvienam projekte yra saugoma visa jo istorija. Dėl šios priežasties ir nusprendžiau atsisakyti snapshoot’ų, nes jų kaip ir nebereikia. Beje, jei pastebėjai, Documents katalogui visdėlto nepridėjau “–delete” parametro :-)

  • lioniax

    Saunus skriptas, bet kad ji jau viesini, keletas pastebejimu (kabinejimasis?):
    1) Bet kokiam daznai naudojamam skripte patartina pasiupdatint aplinkos PATH kintamaji, del visa ko. Esu mates a6tveju, kai jis buna iskraipomas, saugoja nekorektiskus kelius.
    2) Kai jau pasiupdatini PATH kintamaji, manau reiktu patikrint ar skripte naudojamos programos apskritai egzistuoja sistemoj…
    3) Patartina idet loginima i faila (scripte ar cron’e), juk ne visada sedesi prie kompiuterio ir seksi i ekrana metomas zinutes.
    4) Pamirsai paminet (nepastebejau?), kad kintamajam DESKTOP priskiriamas dydis (0) nera konstanta; ka reikia priskirt, prilauso nuo to, ant kurio desktopo (skaitytojai to taip pat neturetu maisyt su workspace’ais) sukasi tavo X’ai, kur nori matyt paleidziamos programos langa.

    pheu… backups FTW!!!

  • http://pawka.linija.net/ Pawka

    @lioniax Dėl PATH ir komandų tikrinimo pritariu. Pradžioj galvoju, kur čia PATH man gali pakišti koją ir visai nepastebėjau, kad rsync nenurodęs pilno kelio :-) Loginimą esu pasidaręs, o dėl DISPLAY, tai paminėjau, kad tai darbalaukio numeris.

    Taip pat sutinku, kad skriptą yra kur tobulinti. Šiaip, jei darant jį idealesniu, tai pasirašyčiau skriptą ar funkciją, kuriai nebūtų įhardkodinti sincrhonizuojami keliai, o persiduotų per parametrus/parametrų masyvą. Tačiau kol neplanuoju atskiros programos rašymo, viskas ok kaip yra :-)

  • lioniax

    na keliu apskritai nereikia harkodint, perdavinet per parametrus ar parametru masyvus, kam tada PATH reikalingas? pasirasai naudojamu komanda sarasiuka, cikla, kuris perbega ir patikrina ar programos egzistuoja PATH’e (komanda which) ir viskas, kazkas panasaus:

    cmds=”ls grep awk”
    which which > /dev/null 2>&1
    if [ $? -eq 0 ] ; then
    :
    else
    print “(EE) update your PATH” ; exit 1
    fi
    for cmd in ${cmds} ; do
    which ${cmd} > /dev/null 2>&1
    # gali kartot ankstensi if
    done

    ant bash gal siek tiek kitaip apsiraso, mm, nors turetu veikt…

  • Vytautas

    Ar šiuo atveju nebūtų geriau pasirašyti UDEV taisyklę, kuri paleistų skriptą po mountinimo ?

  • http://pawka.linija.net/ Pawka

    @Vytautas ne, nes kiltų problemų pvz. prisijungiant diską siekiant persikopijuoti kelis muzikos failus ir bėgti su laptopu namo. Tada prasidėtų kopijavimas.

  • Vytautas

    O kas dabar būna, kai “trumpam” prijungi diską ? Jei prieš ištraukiant diską prasideda backup ?

  • http://pawka.linija.net/ Pawka

    Prasideda atsarginių kopijų darymas :-) Tačiau geriau tai, nei kiekvieną kartą prijungiant diską. Tiksliau MAN taip patogiau. Nebent galima su kokiu zenity parodyti popup’ą su klausimu “ar daryti atsargines kopijas”.

  • tadas

    As truputi pakeiciau tavo skripta

    COUNT=0
    export DISPLAY=:0 #For cronjob using gui notifications.

    for i in `mount | awk ‘{print $3}’`
    do
    if [ -f $i/.make_backup ]; then
    COUNT=`expr $COUNT + 1`
    notify “Started ($i)”

    rsync -Pva –del /home/tadas/Documents/* “$i/backup/Documents”;
    rsync -Pva –del /home/tadas/Projects/* “$i/backup/Projects”;

    notify “Finished ($i)”
    fi
    done

    if [ $COUNT -eq 0 ]; then
    notify “No backup media found.”
    exit 1
    fi

    Einam per visus primountintus diskus ir ieskom to kuriam yra failas .make_backup. Jei randam padarom backup. Zinoma, dar geresnis budas butu susieti backup diska pagal jo serijini numeri, kad kartais netycia nepadarytu backup ten kur nereikia.

  • http://pawka.linija.net/ Pawka

    Tadai, o pas tave visuose tuose diskuose yra backupinamos tos pačios direktorijos?

  • tadas

    Nelabai supratau ko klausi. Ka as anksciau parasiau yra skirta tam jei nenori nustatyti kazkokio tai pastovaus mount point savo backup diskui. Tiesiog sukuri diske faila .make_backup ir viskas. Butu galima padaryt isvis kietai. Pvz .make_backup galetu saugot katalogus kuriuos reikia backupint. Jei nori truputi daugiau saugumo gali pasidaryt sifruota diska su cryptsetup:

    # cryptsetup luksFormat /dev/sdb2
    # cryptsetup luksOpen /dev/sdb2 backup
    # mkfs.ext3 /dev/mapper/backup

    Ir poto naudoji kaip paprasta diska, tik pries montuojant reikes slaptazodi ivest. Ubuntu graziai su tuo susitvarko ir papraso slaptazodzio.

  • http://pawka.linija.net/ Pawka

    Tą ir norėjau pasiūlyt, kad į .make_backup nurodyt direktorijas, kurias reikia backupint. Nors šitas būdas turi vieną trūkumą. Backup’o konfigūraciniai failai būtų išmėtyti po diskus. Man patogiau atrodytų, kad visa konfigūracija būtų vienoje vietoje. Nors aišku čia priklauso nuo situacijos.

  • Pingback: Duomenų atstatymas su laisvom programom | geko()

  • http://www.lescinskas.lt Paulius

    notify-send patogu naudoti parametrus -i /kelias/iki/ikonos.png ir -t 1000 (pranešimą rodys 1000 milisekundžių)

Previous post:

Next post: