Salvările cu rsync

rsync este o unealtă folosită pentru a face 'backup' și 'synchronise' fișierelor voastre. (Poate fi rulat pe o mare varietate de porturi *nix).

Singura limitare a programului rsync este ca el NU poate copia de pe un sistem remote în alt sistem remote . Dacă doriţi să realizaţi acest lucru , va trebui să copiaţi fişierele din unul din sistemele remote într-un sistem local şi apoi din sistemul local în celălalt sistem remote . Aceasta este limitarea rsync.

Cu aptosid aveți opțiuni de cum să inițiați procesul, DIY sau via un pachet deb în Debian sid:

Pentru pachetul deb:
apt-get install luckybackup

Homepage of luckybackup.

Ce urmează de aici este din versiunea DIY

Informaţiile ce urmează vă vor ajuta să înţelegeţi ceea ce rsync poate să facă şi vă vor oferi mici exemple de cod ce pot fi folosite în scripturile dumneavoastră de backup .

rsync este un program foarte uşor de folosit ce poate salva atât fişiere cât şi directoare foarte rapid . Aceasta este posibilă prin utilizarea unei rutine foarte inteligente care verifică schimbările care au fost făcute asupra fişierelor şi doar acele fişiere vor fi selectate pentru copiere . rsync deasemeni foloseşte un utilitar de compresare pentru a grăbi procesul de copiere (atât timp cât este setat explicit prin opţiunea -z ). Explicaţia este foarte simplă :

Programul rsync detectează fişierele şi folder-ele ce trebuiesc copiate datorită schimbării unuia sau mai multor atribute ale acestora (de exemplu data/ora ultimei modificări , sau mărimea fişierului), în ambele cazuri ceva nu mai este la fel ca la ultima salvare . Procesul de selectare este foarte rapid .

După ce rsync a terminat alcătuirea listei de fişiere ce o va utiliza , copierea acestor fişiere schimbate va fi executată mult mai repede datorită rutinei de compresie folosită în timpul copierii . rsync face compresarea înainte de a trimite către destinaţie şi decompresează "on the fly " la final .

rsync poate copia fişiere de la :
* sistem local la sistem local ,
* sistem local la sistem remote ,
* sistem remote la sistem local .

el foloseste fie clientul ssh implicit , sau rulează un daemon rsync atât în sistemul sursă cât şi în cel destinaţie . Paginile man pages pentru rsync afirmă că , dacă dumneavoastră vă puteţi conecta ssh la un sistem , atunci şi rsync poate .

Singura limitare a programului rsync este că el NU poate copia de pe un sistem remote în alt sistem remote . Dacă doriţi să realizaţi acest lucru , va trebui să copiaţi fişierele din unul din sistemele remote într-un sistem local şi apoi din sistemul local în celălalt sistem remote . Aceasta este limitarea rsync.

Pentru a oferi un exemplu , să spunem că avem trei sisteme ;

neo – sistemul local
morpheus – un sistem remote
trinity – un alt sistem remote

Doriţi să folosiţi rsync pentru a copia , sau sincroniza , folderele /home/[user]/Data din toate cele trei sisteme între ele. Fiecare sistem este “deţinut” de un anumit utilizator , cu alte cuvinte , doar un anumit utilizator foloseşte în mod special acel sistem , şi de aceea acel sistem trebuie folosit ca “sursă” pentru celelalte două sisteme . Va trebui deasemeni să rulăm comanda rsync doar în computerul “local” , care este neo :

the main user of neo is cuddles,
the main user of morpheus is tartie, and
the main user of trinity is taylar.

Deci , ceea ce doriţi dumneavoastră să faceţi este salvarea sau sincronizarea următoarelor :

neo's /home/cuddles/Data area to morpheus and trinity,
morpheus's /home/tartie/Data area to neo and trinity,
trinity's /home/taylar/Data area to neo and morpheus.

Problema din rsync , şi anume că nu poate să copie dintr-un sistem remote în alt sistem remote , în exemplul de mai sus, va apărea când vom dori să salvăm din trinity în morpheus , sau din morpheus în trinity (atât sursa cât şi destinaţia sunt sisteme remote) , deci

neo --> morpheus – fine, thats local to remote
neo --> trinity – fine, thats local to remote
morpheus --> neo – fine, thats remote to local
trinity --> neo – fine, thats remote to local
morpheus --> trinity – remote to remote – won't work
trinity --> morpheus – remote to remote – won't work

Pentru a rezolva această problemă trebuie să modificaţi schema rsync un pic . Ce urmează poate să rezolve situaţia ;

morpheus --> trinity – becomes: morpheus --> neo & neo --> trinity
trinity --> morpheus – becomes: trinity --> neo & neo --> morpheus

Este un pas suplimentar , faţă de procesul dintr-un singur pas , dar dacă ţinem cont că fişierele trebuie să ajungă şi în neo deasemeni , asta înseamnă că doar am schimbat sursa lor dar nu şi rezultatul final . Asta înseamnă că salvările vor fi în regula şi nimic nu va lipsi .

Va trebui să ţineţi cont de această limitare din rsync când programaţi un proces de backup .

Utilizarea hostname cu hostname în rsync.

Aşa cum am descris mai sus , folosind neo, morpheus , sau trinity ca o corespondenţă la adresa IP , este un mod curat şi uşor de a face lucrurile mult mai uşor de citit . Ca să faceţi posibilă folosirea acestor nume (hostnames) este simplu .

Va trebui să editaţi fişierul /etc/hosts şi să adăugaţi aceste nume ( hostnames) şi adresele IP cărora le sunt asociate . Iată o mică porţiune din liniile de început ale fişierului /etc/hosts , care arată asocierile :

192.168.1.15	 neo
192.168.1.16	 morpheus
192.168.1.17	 trinity

Prima linie de deasupra asociază Adresei IP 192.168.1.15 numele “neo” , a doua adresa -192.168.1.16 numelui “morpheus”, şi în ultima linie , adresa IP 192.168.1.17 numelui “trinity”. După adăugarea celor de deasupra şi salvarea lor în fişierul /etc/hosts veţi putea folosi aceste "nume" în loc de adresa IP , sau puteţi folosi în continuare Adresa IP . Ce face ca acest lucru să fie cu adevărat strălucitor este momentul când se schimbă o adresă IP a unuia dintre sisteme . Ca să dăm un exemplu despre aceasta , să spunem că neo îşi schimbă adresa IP din 192.168.1.15 în 192.168.1.25

Dacă toate scripturile dumneavoastră folosesc adresa IP atunci va trebui să le găsiţi şi să schimbaţi în fiecare cu noua adresă .Pe de altă parte dacă scripturile folosesc "nume”, tot ce trebuie să faceţi este să schimbaţi linia din /etc/hosts , care să reflecte schimbarea şi toate scripturile vor funcţiona . Acesta va fi foarte folositor dacă aveţi multe scripturi care se conectează remote la alte sisteme , sau vice-versa . Metoda cu “name” face scripturile mult mai uşor de citit şi urmărit pentru că nu folosiţi adresa IP ci dimpotrivă un nume mai uşor de recunoscut ce este asociat unei adrese IP .

rsync , şi cele doua moduri în care poate fi utilizat .

Un mod este să “împingi” fişierele către o ţintă , iar celalalt mod este de a le “trage” dintr-o sursă . Fiecare metodă are avantaje şi dezavantaje . Hai să privim fiecare metodă (pentru acest exemplu vom presupune că unul din sisteme este local iar celălalt este un sistem remote . În acest fel veţi înţelege mai bine terminologia ) .

“împinge” - sistemul local are folderele şi fişierele sursa în el iar locaţia ţintă este pe un sistem remote . Comanda rsync este rulată pe sistemul local şi “împinge” fişierele în sistemul ţintă .

Avantaje :
* Puteţi avea mai multe sisteme care să-şi salveze fişierele într-un sistem ţintă .
* Procesul de backup este împărţit între sisteme , nu doar un singur sistem este solicitat .
* Dacă un sistem este mai rapid ca altul ,va termina procesul de salvare mai repede şi-l veţi putea utiliza pentru a executa alte sarcini .

Dezavantaje :
* Dacă folosiţi un script şi faceţi o programare cu cron , aceasta va necesita să faceţi update şi să schimbaţi în fiecare sistem schema de salvare automată precum şi să faceţi update la toate versiunile de script existente .
* Procesul de backup nu poate verifica dacă sistemul ţintă are partiţia destinaţie montată şi va face salvarea pe nimic în sistemul ţintă .

“trage” - sistemul remote conţine folderele şi fişierele ce trebuiesc salvate iar destinatia este în computerul local . Comanda rsync este rulată în sistemul local şi “trage” fişierele din sistemul sursă .

Avantaje :
* Unul din sisteme va fi serverul şi va controla procesele de backup din toate sistemele . Backup centralizat .
* Dacă utilizaţi un script el va fi conţinut doar într-un sistem şi va fi doar unul singur , făcând upgrade-ul şi modificările mult mai uşoare . Deasemeni va trebui să controlezi un singur fişier crontab pentru a programa execuţia scriptului .
* Scriptul va putea verifica , şi monta la nevoie , partiţia destinaţie .

Sintaxa pentru rsync , aşa cum se găseşte în man pages :
       rsync [OPTION]... SRC [SRC]... DEST

       rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST

       rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST

       rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST

       rsync [OPTION]... SRC

       rsync [OPTION]... [USER@]HOST:SRC [DEST]

       rsync [OPTION]... [USER@]HOST::SRC [DEST]

       rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
Exemple de lucru cu comanda rsync :
rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie /media/sda7/SysBackups/morpheus/home

Să privim mai de aproape anumite parţi ale comenzii :

the source path/file is: morpheus:/home/tartie
and the target is: /media/sda7/SysBackups/morpheus/home

totul din /home/tartie... va fi salvat în /media/sda7/SysBackups/morpheus/home care va arăta aşa :

/media/sda7/SysBackups/morpheus/home/tartie...

Ţineţi cont , singurul motiv pentru care /tartie este conţinut în /home este pentru ca acolo este indicată ŢINTA şi NICICUM SURSA . “Sursa” doar selectează de unde vin fişierele , nu şi unde se vor duce . “ţinta” este cea care spune programului rsync unde să salveze fişierele pe care le ia din “sursa”. Să luam următorul exemplu :

rsync [...] /home/user/data/files /media/sda7/SysBackups/neo

În comanda de mai sus , doar folderul sursă , cu tot ce conţine el , se va găsi în folderul /neo – şi nu /media/sda7/SysBackups/neo/home/user/data/files

Nu uitaţi să ţineţi cont de aceasta când creaţi comenzile de backup cu rsync .

Explicarea opţiunilor :
-a is used for archive mode. From the man page, it explains this option as “in simple terms, a way to backup recursively, and to preserve 'almost' everything”. It does mention that this format does not preserve hardlinks due to the complexity of processing. The -a option is stated as being equivalent to the following: -rlptgoD which means this:
  -r = recursive – process sub-folders and files found in our “source” location.
  -l = links – when symlinks are encountered, recreate them on the target location.
  -p = permissions – tells rsync to set target permissions the same as source.
  -t = times – tells rsync to set target times the same as source.
  -q = quiet – tells rsync to keep its output minimal, though we add a level of verbose with the command -v right after this. To make the process complete “quiet”, remove the “v” in the above command.
  -o = owner – tells rsync that if it's run as root, set the target files owner the same as source.
-D = this is equivalent to using these two commands: --devices --specials
 --devices = causes rsync to transfer character and block device files to
the remote system to recreate these devices. Unfortunately, if you do not
also include --super in the same command, this has no effect.
 --specials = causes rsync to transfer special files such as named sockets
and fifos.
-g is used to preserve “group” of the source file to the target.
-E is used to preserve “executable” of the source file to the target.
-v is used to increase the verbosity that is displayed. After we are sure we are backing up what we want, the “v” can be removed. I have left it in, because I run this process from a cron job, and prefer to “see” what it did. I leave it up to the individual to decide.
-z is used to compress the data it needs to “transfer” or copy, this makes the copy process take less time, because the data being transferred is smaller in size than its real size.
--delete-after = target files/folders that are no longer on the source are
deleted after transfer, not before. This “after” is used in case of problems
or a crash, and the “delete” is used to keep target files that no longer
exist on source system from hanging around and not cleaned up on our target
location.
--exclude = a pattern used to exclude files or folders with. In the
example, --exclude=“*~” would exclude ANY and ALL files or folders ending
with the “~” character from being backed up. Only one pattern can be supplied
with the --exclude option, so if more than one is needed, you need to supply
additional exclude lines on the command line.

Aditional , alte cateva optiuni folositoare ale comenzii :

-c – which will add another level of checks into the source being compared to the target after the copy process, but it adds more time to the copy process, and rsync already does comparisons of the source and target files during its processing, so this option was not included for the simple fact it slows the complete process down, and is only a form of redundancy, which is not needed.
--super – which, as the man page describes it, the receiver, or target system,
will attempt super-user activities
--dry-run – which will show what would have been transferred. This is kind of
like using the -s option with apt-get install, or apt-get dist-upgrade.

Restul comenzii noastre este soursa file/folder, apoi locația folderului țintă.

Exemple de comenzi :
rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie /media/sda7/SysBackups/morpheus/home

Această comandă va salva toate fişierele şi orice folder aflat în /home/tartie în sistemul cu numele “morpheus”, şi va plasa totul în folderul /media/sda7/SysBackups/morpheus/home – păstrând structura arbore din folderul numit tartie intactă .

rsync -agEvz --delete-after --exclude=”*~” /home/tartie neo:/media/sda7/SysBackups/morpheus/home

Această comandă este reversul comenzii anterioare , ea va “împinge” folderul /home/tartie şi întreg conţinutul său în sistemul numit în acelaşi folder – reţineţi că un sistem este considerat remote când are semnul “ : ” (două puncte) în faţa căii .

rsync -agEvz --delete-after --exclude=”*~” /home/cuddles /media/sda7/SysBackups/neo/home

Această comandă face un backup din computerul local în computerul local , observaţi că semnul două puncte nu este asezat nici la sursă nici la destinaţie . Va fi salvat folderul /home/cuddles în acelaşi sistem la locaţia /media/sda7/SysBackups/neo/home .

Să vedem cum arată o comandă rsync cu mai multe opţiuni exclude :

rsync -agEvz --delete-after --exclude=”*~” --exclude=”*.c” --exclude=”*.o” "/*" /media/sda7/SysBackups/neo

Comanda de mai sus va salva TOTUL din rădăcina unui sistem local ,foldere şi fişiere, şi le va plasa în locaţia /media/sda7/SysBackups/neo – doar că acum vor fi excluse toate folderele sau fişierele ale caror nume se termină în “~”, sau “.c” , sau în “.o”

Mai jos este o comandă care mai mult ca sigur va da un mesaj de eroare şi care trebuie evitată de câte ori e posibil . Este exemplul unei comenzi rsync de pe un sistem remote pe un alt sistem remote :

rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie trinity:/home

Cum am menţionat şi mai devreme în acest document aceasta este limitarea programului rsync .

Un ultim exemplu al unei comenzi , să vedem cum arată comanda rsync de la un sistem remote la unul local dacă vom înlocui “numele sistemului ” cu adresa IP .

Prima comandă este metoda cu “nume” , iar cea dea doua este exact aceaşi comandă dar folosind adresele IP

rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie /media/sda7/SysBackups/morpheus/home
rsync -agEvz --delete-after --exclude=”*~” 192.168.1.16:/home/tartie /media/sda7/SysBackups/morpheus/home

Cum am spus şi mai devreme , nu este obligatoriu să folosiţi metoda cu "nume" , dar în primul exemplu puteţi citi conţinutul comenzii mult mai uşor decât în al doilea .

Acum ar trebui să puteţi concepe o comandă simplă fie din exemplele date fie prin a ajusta comenzile arătate în aşa fel încât să obţineţi ceea ce aveţi nevoie .

Page last revised 14/08/2010 0100 UTC