Sikkerhedskopiering med rsync

rsync er et værktøj til at sikkerhedskopiere og synkronisere dine filer (rsync kan køre på en vifte af *nix porte).

En begrænsning i rsync er at programmet ikke er i stand til at kopiere fra remote- til remote-system!. Hvis du vil gøre dette med rsync skal du kopiere et af remote-systemerne til et lokalt system, og så kopiere fra det lokale til det andet remote-system.

Med aptosid har du 2 forskellige muligheder for at starte processen, Gør-det-selv eller via deb pakke i Debian sid:

For deb pakken:
apt-get install luckybackup

Hjemmesiden for luckybackup.

Her følger gør-det-selv versionen

Det følgende vil give dig noget praktisk anvendelig information om hvad rsync kan gøre, samt give dig nogle eksempler på kode som du kan bruge i dit eget sikkerhedskopierings-script.

rsync er et letanvendeligt sikkerhedskopierings program, det kan osse sikkerhedskopiere filer og mapper meget hurtigt. rsync opnår dette ved at anvende en meget smart rutine hvor den kontrollerer hvilke filer der er blevet ændret, således at kun filer med ændringer selekteres til kopiering. rsync anvender også et kompressions værktøj til at øge hastigheden på kopierings processen (når denne mulighed er valgt eksplicit med -z parametren). Dette kan forklares meget simpelt:

rsync programmet detekterer filer og mapper der skal kopieres fordi en eller flere af deres attributter er blevet ændret (for eksempel dato/tid for sidste ændring, eller størrelsen af filen), i begge tilfælde en ændring siden sidste sikkerhedskopiering. Denne selektionsproces er meget hurtig at udføre.

Når rsync først har bygget listen over det den vil kopiere, går selve kopieringen meget hurtigt idet kompressions værktøjet anvendes herunder. rsync komprimerer før filerne afsendes til bestemmelsesstedet, derefter afkomprimeres de “on the fly”.

rsync kan kopiere filer fra:
* lokal system til lokal system,
* lokal system til remote system,
* remote system til lokal system.

Der envendes enten en standard ssh klient, eller en rsync daemon på både kilde- og mål-systemet. Man siderne for rsync slår fast at hvis du er i stand til at ssh til et system, så kan rsync også ssh til det.

En begrænsning i rsync er at programmet ikke er i stand til at kopiere fra remote- til remote-system!. Hvis du vil gøre dette med rsync skal du kopiere et af remote-systemerne til et lokalt system, og så kopiere fra det lokale til det andet remote-system.

For at vise dette med et eksempel, forestiller vi os tre systemer;

neo – et lokalt system
morpheus – et remote system
trinity – et remote system

Hvis du vil anvende rsync til at kopiere, eller sync, mapperne /home/[user]/Data fra lle systemer ne til hinanden. Hvert system "ejes" af en specifik bruger, med andre ord, hvert specifikke system har en specifik bruger, og derfor bør ethvert af systemerne bruges som "kilden" til de andre to systemer. Du kan udelukkende køre kommandoen rsync fra den lokale maskine (det er neo):

brugeren af neo hedder cuddles,
brugeren af morpheus hedder tartie, og
brugeren af trinity hedder taylar.

Det du altså vil gøre er at sikkerhedskopiere (synkronisere) følgende:

neo's /home/cuddles/Data area til morpheus og trinity,
morpheus's /home/tartie/Data area til neo og trinity,
trinity's /home/taylar/Data area til neo og morpheus.

Problemet med at rsync ikke kan kopiere fra remote til remote betyder nu at i dette eksempel støder vi ind i problemer med at kopiere fra trinity til morpheus, og fra morpheus til trinity (både kilde og mål er remote) i.e.

neo --> morpheus – fint, local til remote
neo --> trinity – fint, local til remote
morpheus --> neo – fint, remote til local
trinity --> neo – fint, remote til local
morpheus --> trinity – remote til remote – virker ikke
trinity --> morpheus – remote til remote – virker ikke

For at arbejde dig rundt om denne begrænsning kan du ændre din metode til det følgende;

morpheus --> trinity – gøres ved: morpheus --> neo & neo --> trinity
trinity --> morpheus – gøres ved: trinity --> neo & neo --> morpheus

Det kræver altså lidt ekstra arbejde at gøre dette, men eftersom du også ønsker at kopiere filerne til neo er det i realiteten bare en ændring af kilden du foretager, resultatet bliver det ønskede. Forudsat dine sikkerhedskopieringer er vellykkede og intet mangler.

Denne begrænsning i rsync skal du tage med i dine overvejelser når du designer dine sikkerhedskopierings procedurer.

Anvendelse af hostnames med hostnames i rsync

Anvendelse af IP-adresser på neo, morpheus og trinity kan gøre kopieringsprocessen mere gennemskuelig og dermed nemmere.

Du skal redigere filen /etc/hosts, og tilføje dine hostnames og IP-addresserne som de skal oversættes til. Her er en lille snip af en /etc/hosts fil, så du kan se hvordan det skal se ud:

192.168.1.15	 neo
192.168.1.16	 morpheus
192.168.1.17	 trinity

Den føste linie oversætter IP-adressen 192.168.1.15 til navnet “neo”, den anden 192.168.1.16 til “morpheus”, og den sidste IP-Addressen 192.168.1.17 til navnet “trinity”. Efter tilføjelse af dine skal du gemme /etc/hosts filen, og du kan så anvende navnet i stedet for IP-adressen, eller du kan fortsætte med at anvende IP-addressen. Dette er specielt nyttigt når/ hvis systemer ændrer deres IP-adresse, du skal så bare ændre din /etc/hosts fil, og ikke alle dine scripts. For eksempel hvis neo ændrer IP-addresse fra 192.168.1.15 til 192.168.1.25:

Hvis du har skrevet alle dine scripts med ip-adresser i skal du finde dem alle og redigere dem til den nye adresse. Men hvis du anvender hostnames, så er det eneste du skal redigere /etc/hosts filen, og så virker alle dine scripts igen. Metoden med at anvende hostnames gør også hele processen mere gennemskuelig idet genkendelige navne sikkert vil sige dig mere end ip-adresser om hvilken maskine det er du arbejder med.

rsync, og de to måder du kan anvende det på.

En måde er at “skubbe” filer til et givent mål, og den anden måde er at “trække” filerne fra en given kilden. Hver metode har deres fordele, og nogle ulemper. Lad os se på dem hver især (for denne del lad os antage at en af dine systemer er lokal og det andet er remote. På den måde er det nemmere at få fat i terminologien).

“skubbe” - lokal systemet har kilde filerne og mapperne liggende, og målet er en remote maskine. rsync kommandoen afvikles på lokal systemet, og “skubber” filerne til mål systemet (remote systemet).

Fordele:
* Du kan have mere end et system der sikkerhedskopierer sig selv til et enkelt mål system.
* Sikkerhedskopieringsprocessen fordeles over dit totale computer system, og tynger ikke blot en enkelt maskine.
* Hvis et system er hurtigere end de andre kan det afslutte før de andre og bruges til andre formål.

Ulemper:
* Hvis du anvender et script, og planlægger dem med cron, så kræver det opdatering og ændring af adskillige crontabs på hvert system, ligesom opdatering af adskillige versioner af dit script.
* Din sikkerhedskopi kan ikke kontrollere om mål systemets har mål-partitionen monteret, og du kan derfor risikere at du laver en sikkerhedskopi til ingenting på mål systemet.

“trække” - fjernsystemet har kilde filerne og mapperne liggende, og målet er lokal systemet. rsync kommandoen afvikles på lokal systemet, og “trækker” filerne over fra kilde systemet (remote systemet).

Fordele:
* Et system er serveren der kontrollerer alle sikkerhedskopieringer for alle de andre systemer. Centraliseret sikkerhedskopiering.
* Anvender du scripts findes disse udelukkende på et enkelt system. Og du har kun brug for et enkelt script hvad der gør opdatering og ændringer meget nemt at udføre. Det tillader dig også at have bare en crontab fil til at planlægge script'et.
* Dit script kan kontrollere, og montere (om nødvendigt) mål partitionen.

Syntaksen for rsync, som du finder den i man siderne:
       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]
Eksempler på rsync kommandoer:
rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie /media/sda7/SysBackups/morpheus/home

Lad os kigge nærmere på dele af denne kommando:

kilde stien/ filen er: morpheus:/home/tartie
og målet er: /media/sda7/SysBackups/morpheus/home

alt fra /home/tartie... vil blive sikkerhedskopieret til /media/sda7/SysBackups/morpheus/home som vil se ud som følger:

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

Det skal bemærkes at den eneste grund til at /tartie er under /home er på grund af MÅL-designationen (TARGET designation), og IKKE kilden (SOURCE). Kilden (source) selekterer kun hvor filerne kommer fra, ikke hvorhen de bliver sendt. "Målet" (target) er det der fortæller rsync hvor filerne, som kommer fra kilden, skal placeres. Se det følgende eksempel:

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

I den ovenstående kommando bliver kun kilde mappen /files, og alt hvad der ligger under dette, blive kopieret til mål mappen /neo – og altså ikke denne del /media/sda7/SysBackups/neo/home/user/data/files

Husk at tage dette med i dine overvejelser når du designer dine kommandoer til sikkerhedskopiering med rsync.

Forklaring af parametrene:
-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 t
his 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.

I tillæg findes disse parametre du kan anvende:

-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.

Resten af vores kommandoe er kilde-filen/mappen, og dernæst den mappe der er vores mål.

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

Denne kommando kopierer all filerne og mapperne under /home/tartie på systemet der oversættes af navnet “morpheus”, og placere dem i /media/sda7/SysBackups/morpheus/home mappen – bevarende mappestrukturen fra tartie mappen og udad.

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

Denne kommando er den modsatte af den forrige, den vil “skubbe” /home/tartie mappen, dets indhold og undermapper over i systemet med navnet neo ind i den samme mappe – bemærk at et system opfattes som remote når det har “:” (kolon) foran navnet.

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

Denne kommando laver en lokal til lokal kopiering, bemærk fraværet af kolon i både kilde og mål destinationerne. Denne kommando kopierer lokalt /home/cuddles delen til det samme systems /media/sda7/SysBackups/neo/home destination.

Lad os kigge på en multiple exclude rsync kommando:

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

Ovenstående kommando vil sikkerhedskopiere ALT fra root på lokal systemet, og alle filerne og mapperne, placere dem i mål destinationen /media/sda7/SysBackups/neo – men nu vil kommandoen ekskluderer alle filer eller mapperr der ender med et “~”, eller et “.c”, eller et “.o”

Nedenunder er et eksempel på en rsync kommando der bør undgås; En kommando der beskriver en remote-til-remote kopiering:

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

Som tidligere nævnt er dette en begrænsning i rsync.

En sidste kommando som eksempel. Lad os se på en remote til lokal rsync som den vil se ud hvis vi anvender ip-adresser istedet for hostnames.

Den første kommando er med navne, den næste er den samme kommando, blot med ip-adressen istedet

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

Som sagt skal du ikke bruge hostnames, men som du ser kan det øge dit overblik over hvad du foretager dig.

Du bør nu være i stand til at designe dine egne simple kommandoer, enten ud fra eksemplerne vi her har givet, eller ved at sammensætte dine helt egne ud fra de anvendelige parametre.

Page last revised 14/08/2010 0100 UTC