Rsync

Allikas: Kuutõrvaja

Sissejuhatus

Rsync on vabavara unixi laadsetele op süsteemidele, mis teeb andmete sünkroniseerimese arvutite vahel väga lihtsaks. Rsync kasutab kodeerimist ja ei tekita varundamisel duplikaate, vaid loob viiteid failide vahel, vähendades sedaviisi infomahte ja ka kettakasutust.

Veebisait http://rsync.samba.org/ ja dokumentatsioon http://www.samba.org/rsync/documentation.html.

Lihtne näide rsync kasutamisest:

Sünkroniseerime faili lokaalsest masinast teise nimega host.ee

rsync fail.laiend kasutaja@host.ee:

Sünkroniseerime kausta lokaalsest masinast teise

rsync -a kaust kasutaja@host.ee:

Rsync toimib ka üle tavalise OpenSSH (Kuid on rohkem koormust tekitav).

Olulisemad võtmed

  • --archive -a arhiivi võti mida kasutades kindlustatakse kuupäevade õiguste omanike ja linkide säilumine, soovituslik lisada igasuguste sünkroniseerimiste puhul.
  • --verbose -v protsessi kohta põhjalikuma info näitamine nt failinimekiri
  • --progress ülekande progressi kohta info
  • --stats ülevaatlikum statistika kulunud ajast ja failide hulgast
  • --compress -z toimub pakkimine enne ülekandmist
  • --delete -d sihtkohast kustutatakse algallikas enam mitte eksisteerivad failid
  • --exclude "*bak" mingite faililaiendite, failinimede ignoreerimine näiteks avi, mp3 võib määrata ka võtmega --exclude-from faili milles failides või kaustades asjadest mida ei varundata
  • --numeric-ids ei üritata failide UID/GID muuta sünkroniseeritava süsteemi kasutajate järgi ja jäetakse need puutumatuna

Veel mõned erandjuhtudel vajaminevad parameetrid

  • -n Mille korral rsync lihtsalt ütleb mida ta teeks ilma reaalselt faile üle kandmata
  • -W Teatab rsyncile kanda üle terve fail selle asemel, et kasutada oma block leveli võrdlemise vahendeid. Kui kasutada on väga kiire võrguühendus võib see võti muuta tööd kiiremaks kuna rsync ei pea faile kontrollima, kasutades rsynci üle interneti on tõenäoliselt seda võtit kasutada ebapraktiline
  • -c Käseb genereerida kõigi failide kontrollsummad. Kasutades seda võtit võib rsync muutuda üsnagi aeglaselt seega kasutada vaid tõsise vajaduse korral, näiteks kui kahtlus, et failide info on kuidagi rikutud.
  • -z suunab rsynci kasutama zlib pakkimist
  • -H, --hard-links Säilita hard lingid, vajalik nt kui ülekantavad andmed varundatud link-dest võtmega
  • -i - kui nö tavalise võtmekomplekti '-avH --numeric-ids' puhul ei esitata andmeid kui ainult faili metaandmed muutuvad, nt omanik, siis -i lisamisel esitatakse
  • -A --acls säilita acl-id
  • -X --xattrs säilitada laiendatud atribuudid

Lisaks kui rsync teatab file has vanished tähendab seda, et failisüsteemis on sünkroniseerimise ajal tekkinud muudatusi

Tasub ettevaatlik ning tähelepanelik olla kaika (/) märgi kasutamisega. kui tahad kopeerida kataloogi alla, siis pane teisele argumendile kaigas ja esimesele mitte. Kui tahad kopeerida kataloogi (/mnt -> /mnt ntx), siis pane esimesele kaigas ja teisele mitte. Kaks näidet kuidas selle asetsemine võib käsu tundmatuseni muuta:

  • --exclude "/foo"

eraldab faili nimega foo kaustas kus hetkel asutakse mida näeb pwd käsuga

  • --exclude "foo/"

eraldab aga kõik kaustad nimega foo

Võimalus on tekitada ka kausta mida arhiveeritakse fail .rsync-filter sisuga

+ *.mbox/***
- *

ja käsuraltuleb lisada -F võti.

rsync server

Varundusserverit luues on mõistlik startida seal rsynci deemon, mis võimaldab parooliga ligipääsu lugemiseks/kirjutamiseks teatud kaustadele.

Seadistusfailiks on rsyncd.conf mis vaikimisi Linuxis /etc/rsyncd.conf ja FreeBSDs /usr/local/etc/rsyncd.conf

Näidis failist rsyncd.conf:

uid = root
gid = root
use chroot = no
max connections = 25
log file=/var/log/rsyncd.log

pid file = /var/run/rsyncd.pid

[failid]
       path = /kus/failid/on
       comment = failid
       read only = false

[pildid]
       path = /kus/pildid/on
       comment = failid
       dont  compress = *

NB! Kasutades FreeBSDd tuleb rida "gid = root" asendada reaga "gid = wheel". read only parameeter on ääretult oluline, kui soovid rsync'ida faile serverisse. Vastasel juhul saad veateate, et "module is read only".

Seadistusfail tekitab kaks jaotist: Failid ja Pildid. Piltidele keelame direktiiviga "dont compress = *" andmevoo pakkimise, kuna pildid on juba pakitud ning suurt eelist see ei anna. Sama võib teha ka videosid sisaldavate kaustadega.

Seda meetodit rakendatakse vaikimisi failitüüpidele: *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

Logimist võib korraldada ka läbi syslogi'i, kasutades rida:

syslog facility = local5

Või lihtsalt lisada syslog.conf'i rea:

daemon.info                                     /var/log/daemon.log

Logimisest saab lugeda täpsemalt sellest palast.

Soovides lubada varundamisele kliente ligi vaid kindla parooliga tuleks share teha selliselt:

[failid]
  path = /kus/failid/on
  comment = failid
  auth users = kasutaja
  secrets file = /etc/rsyncd.pass
  read only = false

Tekitame faili /etc/rsyncd.pass sisuga

kasutaja:salasona

Pange tähele, et paroolid hoitakse failis tavalise tekstina (plain text). Kindlasti tuleb paika panna paroolifaili õigused (ainult omanikule lugemiseks), vastasel juhul annab rsync veateate ja paroolifaili ignoreeritakse!

rsync klient

Ka klient masinas same parooli hoida eraldi failis. Tekitame /etc/rsyncd.pass faili sisuga

salasona

Kausta /etc sünkroniseerimiseks varundamise serveriga:

$ rsync --password-file /etc/rsyncd.pass -a /etc kasutaja@192.168.1.10::failid

Failide taastamine

$ rsync --password-file=/etc/rsyncd.pass -a kasutaja@192.168.1.10::failid /tmp/

Tulemüüri seadistamine

rsync töötades deemonina kasutab porti tcp 873

linux iptablesis saame müüri teha pordi lahti käsuga

iptables -I INPUT -p tcp -s 192.168.1.10 --dport 873 -j ACCEPT 

FreeBSD packet filteris

pass in on $ext_if proto tcp from { 192.168.1.10 } to port 873 

Muidugi võib seadistusfaili kirjutada kohe

hosts allow = *.host.ee
hosts deny = * 

nüüd võime anda käsu rsync -a kaust kasutaja@server::jaotisenimi


$ rsync -a kaust kasutaja@arhiiv.zoo.tartu.ee::failid

üleslaetud failide nimistut saab

$ rsync -v --list-only -a root@host.ee::failid

kui pole öeldud muidugi list = false

Soovides limiteerida aeglasema kiirusega kohtades rsync kiirust tuleks kasutada rsync omadust --bwlimit=KBPS

Paroolita rsync kasutades ssh kopeerimist

Paroolifaili etteandmine ilma rsync serverit kasutamata ei toimi, sellisel juhul tuleks toimida järgnevalt

Genereerime privaatse ja avaliku võtme, kui parooli ei soovi vajutame lihtsalt enteri

# ssh-keygen -t rsa -b 4096 -f rsync-key
Generating public/private rsa key pair.
rsync-key already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in rsync-key.
Your public key has been saved in rsync-key.pub.
The key fingerprint is:
e8:c7:f2:f1:da:2a:0f:a4:4f:63:89:9f:3e:9d:b9:87 root@loomaaed.zoo.ee

Kopeerime rsync-key.pub sisu sihtkoht masinas kasutaja faili .ssh/authorized_keys

$ scp rsync-key.pub remoteuser@remotehost:/home/remoteuser/ 

Seal masinas anname käsud

$ cat thishost-rsync-key.pub >> .ssh/authorized_keys 
$ chmod 700 .ssh
$ chmod 600 .ssh/authorized_keys

Testime

$ ssh -i rsync-key root@192.168.1.10

ja rsync käsk näeb välja järgnev, ette tuleb anda rsync privaatne võti

$ rsync -av --delete  -e "ssh -i /home/kasutaja/rsync-key"  /srv/kauyst root@192.168.1.10:/srv/

Soovituslik oleks üldiselt kasutada sellistel juhtudel juba rsync serverit.

Snapshot stiilis backup

Rsync omab võtit --link-dest mis võimaldab full backupide tegemisel hoida kokku ruumi. Nimelt võtab rsync siis näiteks eelmise päeva backupi aluseks ja loob jooksva päeva backup kausta hardlingid failidest mis on juba olemas ning syncib ainult muutunud failid. Nii on kaustas full backup kuid selle suuruseks on vaid muutunud failide summa. Nii on võimalik teha paarkümmend full backupi kuid nende mahuks jääb kokkuvõtteks 1-2 maht.

Summary educ4 html 61d7cbef.png

Illustreeriv skeem, võetud lehelt http://web.cs.mun.ca/infrastructure/labnet/summary_educ4.html

Hardlink on symlingi sarnane. Nad on tavaliselt loodud ln käsuga kuid ilma -s võtmeta. Hard link kujutab endast seda kui 2 faili viitavad samale inodele ja kettablokile. Erinevalt symlingist pole tegemist eraldi failiga vaid lihtsalt kahe lingiga samale faili.e Kui kustutada ükskõik kumb viide jääb teine alles ning sisaldab infot.

Käsu süntaksiks on:

rsync -avH --link-dest=/backup/eile /root/kaust_mida_varundame /backup/tänane_backup

Anname rsyncile ette eilse backupi kausta, siis kausta mida soovime varundada ja kausta kuhu varundada.

Töö lihtsustamiseks võib luua skripti

 #!/bin/sh
 t2na=`date "+%Y%m%d"`
 eile=`date -v-1d "+%Y%m%d"`
 mkdir /backup/$t2na
 rsync -avH --link-dest=/backup/$eile /www/kaust/mida/varundame /backup/$t2na

Ajaformaat tuleb kujul 20120809 ning võti -v-1d lahutab selest maha ühe päeva.

Loomulikult ei või aga kustutada ühtegi backup kausta kuna sellisel juhul lähevad hardlingid failide vahel katki.

Siin on näide skriptist mis salvestab 7 incremental varukoopiat http://www.syrlug.org/contrib/rsync.html

Juhul kui soovime sälitada vaid 28n päeva andmed siis tulb lisada skripti järgnev osa

DAY29=`date -v-29d "+%Y%m%d"`
if [ -d /backup/website/$DAY29 ]
then
rm /backup/$DAY29
fi

Veel juttu rsynciga snapshotide tegemisest aadressidel

Kiiruse limiteerimine

Kasutuse all olevates süsteemides võib sünkroniseerides juhtuda, et rsync hakkab liiga ohtralt io/protsessoriaega kulutama ja server muutub selle käigus aeglaseks, selpuhul on kasulik limiteerida kiirust näiteks järgnevalt

rsync --bwlimit=1000 fail1 fail2

kiirus tuleb märkida kilobaitides, number näitab täpsemalt mitu kilobaiti sekundus lubatakse saata. Teine hea võimalus on kasutada nice käsku

Sudo kasutamine

Vahel pole võimalik root kasuajana logida aga vaja täisõigusi, selleks aitab kui lisada rsyncile võti

--rsync-path="sudo rsync"

Ning /etc/sudoers faili

username ALL= NOPASSWD:/usr/bin/rsync

Probleemid

Ühes servers kippis rsync ikka aegajalt viskama teadet, et ei saa sünkroniseerimist lõpetada.

Output:
ERROR: out of memory in receive_sums [sender]
rsync error: error allocating core memory buffers (code 22) at util.c(117)  [sender=3.0.9]

Aitas, kui muutsin block-size suurust 1024 pealt ümber:

--block-size 2048 

Lingid