Backup maken met rsync

rsync is een tool die gebruikt wordt voor backup en synchronisatie van je bestanden. (het kan op verschillende *nix versies lopen).

Een beperking aan rsync is dat je NIET kunt copieren van een remote systeem naar een andere remote systeem. Als je dit wel wilt, dan moet je een copy van een remote systeem maken naar het lokale systeem en deze copy weer door copieren naar het andere remote systeem. Dit is een beperking van rsync.

In aptosid heb je keuzes hoe je het proces wilt initieren, DIY of via een deb pakket in Debian sid:

Voor de deb pakket:
apt-get install luckybackup

Homepage of luckybackup.

Wat vanaf hier volgt is voor de DIY versies

Dit document geeft je enige kennis van wat je met rsync kunt doen, en de voorbeelden kun je gebruiken voor je eigen backup script.

rsync is een makkelijk te gebruiken bestand backup programma, het kan bestanden en directory's snel backuppen. Dit wordt bewerkstelligd door een slimme routine welke controleerd of bestanden gewijzigd zijn, zodat alleen deze bestaden worden geselecteerd voor het copieren. rsync gebruikt ook een compressie utilitie om het copieer proces te versnellen. Dit kan heel eenvoudig worden uitgelegd:

Het rsync programma detecteerd bestanden en folders welke gecopieerd moten worden omdat een or meerdere attributen gewijzigd zijn (bijvoorbeeld datum/tijd van laatste modificatie, of de bestandsgrootte van het bestand), in beide gevallen, is iets niet gelijk aan de vorige backup. Deze selectie proces is erg snel.

Wanneer rsync klaar is met het bouwen van deze lijst die het gebruikt, de copie van deze veranderingen is dan veel sneller uitgevoerd omdat de compressie routine tijdens het copieren gebruikt wordt. rsync doet de compressie voor het verzenden, en decomprimeerd ze aan de andere kant “on the fly”.

rsync kan bestanden copieren vanaf:
* lokale systeem naar lokale systeem,
* lokale systeem naar remote systeem,
* remote systeem naar lokale systeem.

Het gebruikt of de standaard ssh client, of de lopende rsync daemon op beide kanten, bron en doel systemen. De "man pages van rsync zeggen dat, als je ssh kunt gebruiken naar het systeem, dan kan rsync ook gebruik maken van ssh.

Een beperking aan rsync is dat je NIET kunt copieren van een remote systeem naar een andere remote systeem. Als je dit wel wilt, dan moet je een copy van een remote systeem maken naar het lokale systeem en deze copy weer door copieren naar het andere remote systeem. Dit is een beperking van rsync.

Om een voorbeeld hiervan te geven, laten we zeggen we hebben drie systemen;

neo – het lokale systeem
morpheus – een remote systeem
trinity – een remote systeem

Je wilt rsync gebruiken om te copieren, of te synchroniseren van je /home/[gebruiker]/Data folders van alle systemen met elkaar. Elk systeem heeft een specifieke gebruiker als "eigenaar” , met andere woorden, een specifieke gebruiker gebruikt dat specifieke systeem , en daarom zal dat systeem gebruikt moeten worden als het “Bron” systeem voor de andere twee systemen. Je gaat rsync ook alleen maar gebruiken op het lokale systeem, en dit is neo:

de gebruiker van neo is cuddles,
de gebruiker van morpheus is tartie, en
de gebruiker van trinity is taylar.

Dus, wat we willen is, backuppen, of synchroniseren van het volgende:

neo's /home/cuddles/Data naar morpheus en trinity,
morpheus's /home/tartie/Data naar neo en trinity,
trinity's /home/taylar/Data naar neo en morpheus.

Het probleem van rsync is het niet in staat zijn om te copieren van een remote systeem naar een andere remote systeem, zoals het voorbeeld hierboven, zal leiden to het backuppen van trinity naar morpheus, of morpheus naar trinity (beide zijn bron en doel en remote systemen) bijvoorbeeld:

neo --> morpheus – werkt, dit is lokaal naar remote
neo --> trinity – werkt, dit is lokaal naar remote
morpheus --> neo – werkt, dit is remote naar lokaal
trinity --> neo – werkt, dit is remote naar lokaal
morpheus --> trinity – remote naar remote – werkt NIET
trinity --> morpheus – remote naar remote - werkt NIET

Om deze limiet op te lossen, moet je rsync schema een beetje wijzigen. Het volgende zal gedaan moten worden;

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

Dit is een extra stap, vergeleken met de enkele stap, maar aangezien je de bestanden ook naar new wilt hebben is het alleen maar de sources veranderen waar de bestanden vandaan komen. Dit verzekerd dat onze backups goed is en dat we niets missen.

Deze beperking van rsync moet je goed onthouden wanneer je via rsync een backup procedure gaat maken.

Gebruik van hostnamen met hostnamen mbv rsync.

Zoasl hierboven beschreven is, wordt neo, morpheus, of trinity gebruikt ipv een fysiek IP Adres, dit is een goede manier om dingen beter begrijpbaar te maken. Het is erg simpel om gebruik van hostnamen tot stand te brengen.

Dit doe je door het bestand /etc/hosts te wijzigen, voeg de hostnamen en hun IP Adressen in dit bestand in. Hier is een kleine weergave van de bovenste regels van de /etc/hosts bestand, waar je kunt zien hoe de vertaling van IP Adres naar hostnaam gaat:

192.168.1.15	 neo
192.168.1.16	 morpheus
192.168.1.17	 trinity

De eerste regel vertaal het IP Adres 192.168.1.15 naar de naam “neo”, de tweede regel 192.168.1.16 vertaald naar de naam “morpheus”, en de laaste regel, IP Adres 192.168.1.17 wordt vertaald naar de naam “trinity”. Nadat je de regels hebt toegevoegd sla je het bestand /etc/hosts op, nu kun je de naam gebruiken ipv het IP Adres, of je blijft het IP Adres gebruiken. Waarvoor dit echt goed is, is wanneer je een systeem een andere IP Adres geeft. Om een voorbeeld te geven, veranderen we neo's IP Adres van 192.168.1.15 naar 192.168.1.25

Als je IP Adressen gebruikt in je scripts, dan moet je deze allemaal wijzigen naar het nieuwe IP Adres. Maar gebruik je in je scripts de hostnaam, dan is het enige wat je moet wijzigen het bestand /etc/hosts , hierin moet je het ip adres van neo wijzigen , en nu werken alle scripts weer. Dit is natuurlijk erg handig als je veel scripts hebt welke verbinding maken met andere systemen en visaversa. De hostnaam methode maakt je scripts ook beter leesbaarderm zijn makkelijker te volgen omdat je geen IP Adressen gebruikt, maar de hostnaam.

rsync, en de twee manieren om het te gebruiken.

De eerste manier is om bestanden te “push”en (duwen) naar het Doel (bestemming) , en de andere manier is om de bestanden te “pull”en (ophalen) van de Bron. Elk heeeft zijn eigen voordelen en enkele nadelen. Laten we beiden na elkaar bekijken (voor deze uitleg, nemen we aan dat een van de systemen lokaal is, en de andere een remote systeem. Op deze manier, zou je de terminologie stukken beter begrijpen)

“push” - het lokale systeem bezit de bron bestanden en folders, en de doel locatie is het remote systeem. Het rsync commando wordt gestart op het lokale systeem, en "duwt"(pushes) zijn bestanden naar het doel(remote) systeem.

Voordelen:
* Je kunt meer dan 1 systeem hebben die zichzelfs backupped naar een doel systeem.
* Het backup proces wordt verspreid over je gehele computer systemen en niet dat alleen 1 systeem wordt belast met deze taak.
* Indien een systeem sneller is dan de andere, dan kan het klaar zijn voordat de andere systemen klaar zijn, en kan dus voor andere dingen ingezet worden.

Nadelen:
* Als je gebruikt maakt van een script, en deze scheduled met cron dan, is het bij wijzigingen van het script nodig dat je alle crontabs op de systemen moet aanpassen, en ook de scripts op deze systemen moet updaten.
* Je backup kan niet controleren of je doel paritie op het doelsysteem aangekoppeld is, en kan dus "niets" backuppen naar het doel.

“pull” - het remote systeem bezit de bron bestanden en folders, en de doellocatis is het lokale systeem. Het rsync commando wordt gestart op het lokale systeem, en "trekt" (pull) de bestanden van het bronsysteem.

Voordelen:
* Een systeem wordt server gemaakt, waarvan alle backups gecontroleerd worden voor alle andere systemen. Dit zijn gecentraliseerde backups.
* Indien je een script gebruikt, staat deze maar op 1 systeem en is er dus maar 1 script, wat het maken en updaten van wijzigenen makkelijk maakt. Nu hoef je ook maar 1 crontab bestand te beheren om het script te schedulen.
* Je script kan controleren , en mounten van de doelpartitie indien dit nodig is.

Syntax van rsync, zoals men deze in de man pagina's kan vinden:
       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]
Werkende voorbeelden van rsync commando's:
rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie /media/sda7/SysBackups/morpheus/home

Laten we enkele delen van dit commando nader bekijken:

het bron pad/bestand is: morpheus:/home/tartie
en her doel is: /media/sda7/SysBackups/morpheus/home

alles van /home/tartie... zal gebackupped worden onder /media/sda7/SysBackups/morpheus/home dit zal eruit zien als:

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

Het moet opgemerkt worden dat de enige reden is dat /tartie onder /home komt is , omdat dit door de doelverwijzing komt, en NIET door de bronverwijzing. De “bron” selecteert alleen waar de bestanden vandaan komen, maar niet waar ze geplaatst worden. Het “doel” verteld aan rsync waar deze de bestanden , die van de bron komen, geplaatst moeten worden. Bekijk het volgende voorbeeld:

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

In het bovenstaande commando. wordt alleen het bron folder /files, en wat er beneden ligt geplaatst onder de doel-folder /neo – en dit is niet /media/sda7/SysBackups/neo/home/user/data/files

Neem dit in je op bij het creeeren van je rsync backup commando's.

Uitleg van de opties:
-a wordt gebruikt voor archive mode. Van de "man" pagina, wordt deze optie "in eenvoudige termen" uitgelegd als een manier om recursive te backuppen en om "bijna alles" te behouden. Het vermeld ook dat hardlinks niet behouden worden, dit door de complexiteit van deze hardlinks. De -a optie is staat gelijk aan het volgende optie reeks: -rlptgoD wat het volgende betekend:
  -r = recursive – proces sub-folders en bestanden gevonden in onze “bron” locatie.
  -l = links – wanneer symlinks gevonden worden, creeer deze dan ook op de doel locatie.
  -p = permissions – verteld rsync om de doelrechten precies zo als de bronrechten te zetten.
  -t = times – verteld rsync om doel tijden precies zoals de bron tijden te zetten.
  -q = quiet – verteld rsync om zijn minimale weergave te behouden, toch voegen we een weergave level toe met het commando -v. Om het proces volledig "onzichtbaar" temkaen verwijder je de “v”  optie in het bovenstaande commando.
  -o = owner – verteld rsync dat wanneer het gestart wordt als root gebruiker, dat de doel bestanden eigenaar hetzelfde gezet worden als de bron eigenaar.
-D = Dit is gelijk aan het gebruik van deze twee commando's: --devices --specials
 --devices = zorgt ervoor dat rsync de "character en block device" bestanden transporteert naar het remote systeem om ze daar als devices te hercreeeren. Jammer genoeg heeft dit geen effect als je niet het --super optie samen gebruikt met dit commando.
 --specials = zorgt ervoor dat rsync de "special" bestanden ,zoals "named sockets" en "fifos", worden getransporteerd.
-g wordt gebruikt om de “group” van de bron bestand naar de doel te behouden.
-E wordt gebruikt om de “executable” van de bron bestand naar de doel te behouden.
-v wordt gebruikt om de weergave die getoond wordt uit te breiden. Nadat we zeker gesteld hebben dat we backuppen wat we willen, dan kunnen we de optie “v” uit het commando halen. Ik heb de optie in het commando gelaten, omdat ik het proces vanuit een cron job start en ik "zie" graag wat het gedaan heeft. Ik laat het aan jou over of je de optie behoud of niet.
-z wordt gebruikt om de data , welke overgezet of gecopieerd wordt, te comprimeren, dit zorgt ervoor dat het copieer proces minder tijd in beslag neemt, omdat de te copieren data kleiner is dan de werkelijke grote.
--delete-after = doel bestanden/folders welke niet meer op de bron zijn worden na het copieren verwijderd, niet ervoor. Het “ernaar (after)” wordt gebruikt ivm eventueel problemen of een crash van het systeem, en het “delete” wordt gebruikt om doelbestanden die niet meer bestaan op het bron systeem om rondhangen en niet opschonen op onze doel systeem te voorkomen.
--exclude = een patroon gebruikt om bestanden of folders uit te sluiten. In het voorbeeld, --exclude=“*~” wordt ELKE en ALLE bestanden uitgesloten welke eindigen met het karakter “~” voor het backuppen. Er kan maar 1 patroon gebruikt worden met de --exclude optie, indien je meer dan 1 nodig hebt moet je dus meerdere exclude regels in het commando opnemen.

Verder zijn er nog andere handige commando opties:

-c – Dit commando voegt een level van controles toe, voor het vergelijken van de bron en doel bestanden na het copieer proces, maar hiermee duurt het copieer proces ook langer, en rsync vergelijkt de bron- en doelbestanden al tijdens het gehele process, daarom is deze optie niet meegenomen, omdat het de complete uitvoering van het commando vertraagd. Het is alleen maar een extra controle om nog meer zekerheid te bieden.
--super – zal proberen om gebruik te maken van super-gebruiker activiteiten.
--dry-run – laat zien wat gecopieerd zou gaan worden. Dit is een soort -s optie met apt-get install, of apt-get dist-upgrade.

De rest van onze commando is het bron bestand/folder, en dan onze doel folder locatie.

Voorbeeld commando's:
rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie /media/sda7/SysBackups/morpheus/home

Dit commando zal alle bestanden en alle folders onder /home/tartie backuppen op het systeem met de naam “morpheus”, en plaatst deze in de /media/sda7/SysBackups/morpheus/home folder – de directory structuur blijft bewaard van de tartie folder.

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

Dit commando doet precies het omgekeerd als het commando die hierboven beschreven is, het zal de /home/tartie folder "duwen (push)" , zijn inhoud, en sub-folders naar het systeem met de naam neo in dezelfde folder – bemerk dat een systeem gezien wordt als een remote systeem doormiddel van het “:” (colon) symbool welke vooraan in het pad staat.

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

Dit commando voert een lokale naar lokale backup uit, bemerk dat er geen "colon" aanwezig is in zowel de bron- als doel locaties. Dit commando zal lokaal de /home/cuddles omgeving backuppen naar hetzelfde systemen /media/sda7/SysBackups/neo/home locatie.

Laten we nu een meervoudige "exclude" rsync commando bekijken:

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

Het bovenstaande commando zal ALLES backuppen vanaf de root van het lokale systeem en al zijn bestanden/folders, en worden dan geplaatst op de doellocatie /media/sda7/SysBackups/neo – maar nu zal het alle bestanden of folder overslaan welke eindigen op een “~”, of een “.c”, of een “.o”

Hieronder is een voorbeeld van een rsync commando welke of fout zou moten gaan, of gemijd moet worden wanneer het maar kan. Het is een voorbeeld van een remote systeem naar een remote systeem rsync commando:

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

Zoals eerder genoemd in dit document, is dit een beperking van het rsync commando.

Het laatste voorbeeld commando, laten we eens kijken hoe een rsync commando eruit ziet als we de namen van onze remote en lokale systemen vervangen door IP Adressen.

Het eerste commando is op de “naam” methode, en bij het tweede commando, precies gelijk, wordt gebruikt gemaakt van IP Adressen.

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

Zoals al eerder gezegd is, hoef je niet de vertaalde namen te gebruiken, zoals in voorbeeld 1, maar je kunt het wel beter begrijp wat er uitgevoerd gaat worden dan in het 2e voorbeeld.

Je moet nu in staat zijn om een simpel commando te ontwerpen, vanuit de voorbeelden of het mixen van de commando's die je gezien hebt.

Inhoud het laatst gewijzigd op 14/08/2010 0100 UTC