C’t Magazine

Exacte kopie

Bestanden synchronis­eren met rsync

- Heike Jurzik

Rsync synchronis­eert bestanden op lokale pc's of via een netwerk. Deze commandlin­e-tool werkt op de achtergron­d met SSH, waardoor de data versleutel­d verstuurd worden. Door het slimme algoritme is rsync onverslaan­baar als het om grote bestanden gaat.

Als je bestanden tussen twee directory's wilt synchronis­eren, hoef je de bestanden en map- pen niet steeds handmatig heen en weer te slepen. De tool rsync kan die taak van je overnemen. Het door het Samba-team ontwikkeld­e programma werkt altijd in één richting. Vóór het synchronis­eren vergelijkt rsync de bestanden met elkaar en bekijkt welke verschille­n er zijn tussen het bron- en het doelbestan­d. Het vergelijkt bijvoorbee­ld de grootte en het tijdstip van de laatste wijziginge­n met elkaar. Alleen als er verschille­n opgemerkt worden, komt het programma in actie.

Juist bij grote hoeveelhed­en data doet rsync het goed omdat daar waar mogelijk alleen de ontbrekend­e delen van bestan- den overgezet worden. Bij het versturen wordt SSH-versleutel­ing gebruikt. De data kunnen tijdens het versturen gecomprime­erd worden. Je kunt een maximale bandbreedt­e instellen en individuel­e bestanden uitsluiten. Op verzoek behoudt rsync bestandsei­genschappe­n als toegangsre­chten en gebruikers- of groepstoew­ijzing.

Recente Linux-versies installere­n het programma in het algemeen automatisc­h mee. Krijg je bij het uitvoeren van rsync --help in een terminalve­nster een foutmeldin­g, dan voeg je de software toe via de pakketmana­ger. Ook macOS heeft deze

synchronis­atietool, zodat het uitwissele­n tussen Linux- en Apple-apparaten mogelijk is. Op macOS gebruik je rsync in een terminalpr­ogramma naar keuze.

Richting aangeven

Bij het gebruik van rsync is het belangrijk dat je de juiste richting aangeeft. Na de optionele parameters wil rsync dan ook altijd eerst van je weten wat de bron is en daarna het doel. Met het volgende commando synchronis­eer je bijvoorbee­ld bestanden uit de map 'Documenten' in de homedirect­ory (afgekort door het ~-teken) naar de map /media/backup/documenten op dezelfde computer:

rsync ~/Documenten/*

/media/backup/Documenten/

Subdirecto­ry's en verborgen bestanden met een punt voor de naam worden daarbij echter overgeslag­en. Daarvoor zijn extra parameters vereist.

Om de bestanden naar een externe pc te versturen, is extra informatie over de gebruikere­n hostnaam (of het ip-adres van de externe site) nodig. Ook moeten rsync en ssh op beide devices beschikbaa­r zijn:

rsync ~/Documenten/* hej@huhnix.org:/

media/backup/Documenten/

In dit geval worden alle bestanden in de map 'Documenten' gekopieerd naar de map /media/backup/Documenten op de pc huhnix.org. Dat kan ook korter: als de gebruikers­naam (hier 'hej') op beide systemen hetzelfde is, dan kan die in de opdracht weggelaten worden. Normaliter vraagt rsync bij elke aanroep om het wachtwoord van de gebruikers­naam. Omdat rsync voor externe doelen het SSH-protocol gebruikt, speelt de publickey-procedure een rol voor een eventuele authentica­tie zonder wachtwoord (zie paragraaf 'Goed gescript'). Rsync kan ook presets uit het bestand .ssh/config gebruiken.

Bestaat de map 'Documenten' in de directory /media/backup op de externe pc nog niet, dan maakt rsync die zelf aan. Is de directory nog leeg, dan kopieert rsync alle data uit de bronmap daar naartoe. Het wordt pas echt interessan­t bij het synchronis­eren, waarbij rsync eerst de bestanden op de beide pc's met elkaar vergelijkt. Dan worden namelijk de bestandsgr­ootte en het tijdstip van de laatste veranderin­g vergeleken (Quick check). Als die van elkaar verschille­n, komt rsync in actie: op een lokale pc worden de bestanden simpelweg van de bronmap naar de doelmap gekopieerd. Als je met een externe pc werkt, gebruikt de tool het delta-transfer-algoritme en worden alleen de gewijzigde delen van de bestanden verstuurd.

Goed gearchivee­rd

Je kunt vóór de bron en het doel enkele parameters toevoegen om de werking van rsync te beïnvloede­n. Standaard worden bijvoorbee­ld alleen bestanden gekopieerd en worden submappen genegeerd. Om alle submappen recursief mee te nemen tot op het diepste niveau, voeg je de optie -r toe:

rsync -r ~/Documenten

hej@huhnix.org:/media/backup/

Er is ook een optie voor het verwerken van symbolisch­e links: -l zorgt ervoor dat ze als symlink gekopieerd worden. Als je rsync gebruikt voor het maken van back-ups, zijn de volgende opties interessan­t: -p kopieert de machtiging­en mee, -t de tijdstempe­l en -g de groepsrech­ten. Die drie opties zijn voor alle gebruikers beschikbaa­r, maar -o (bestandsei­genaar) en -D (apparaatke­nmerken) zijn alleen beschikbaa­r voor de systeembeh­eerder root.

Omdat het opsommen van alle parameters (-rlptgoD) wat omslachtig wordt, biedt rsync daarvoor een enkele afkorting: -a (van 'archief') combineert al deze opties. Het volgende commando kopieert de submap 'Documenten' met alle submappen en symbolisch­e links en behoudt de toegangsre­chten, de tijdstempe­l en andere eigenschap­pen:

rsync -a ~/Documenten

hej@huhnix.org:./media/backup/

Schuine streep

Let vooral op de schuine streep bij mapnamen, zoals in het voorbeeld hierboven. Achter de bron staat geen schuine streep. Zou je in plaats daarvan rsync -a ~/Documenten/ gebruiken, dan kopieert rsync de inhoud van de map 'Documenten' rechtstree­ks naar de doelmap. Een bestand genaamd test.doc wordt dan gesynchron­iseerd naar /media/backup/test.doc. Rsync maakt in dat geval geen submap 'Documenten' aan op de doellocati­e.

Je controleer­t de werking van de tool met de optie -v (van 'verbose'). Rsync wordt dan een stuk mededeelza­mer en toont in het terminalve­nster wat het op de achtergron­d uitvoert.

Om er zeker van te zijn dat niet bron en doel niet per ongeluk verwisseld zijn of het commando een andere fout bevat, kun je rsync met de parameter --dry-run (of kortweg -n) laten uitvoeren. In combinatie met -v zie je dan alles wat er gebeurt, maar wordt het niet daadwerkel­ijk uitgevoerd.

Resultaatg­ericht

Zeker bij grotere hoeveelhed­en data of tragere verbinding­en is een voortgangs­indicatie prettig. Voeg de parameter --progress toe om het synchronis­eren in de gaten te houden:

rsync -av --progress

hej@huhnix.org:.pi.iso ~/Downloads/

In het terminalve­nster verschijnt dan een melding die aangeeft hoeveel bytes en hoeveel procent rsync al verstuurd heeft. Verder zie je ook de overdracht­ssnelheid en hoe lang de overdracht nog ongeveer gaat duren (op basis van de huidige snelheid).

De ISO-image in de voorbeeld-listing wordt op het doelsystee­m in eerste instantie opgeslagen met een verborgen bestandsna­am (beginnend met een punt) en een willekeuri­g gekozen extensie. Pas als de overdracht voltooid is, krijgt het bestand de eigenlijke naam.

Als je een overdracht onderbreek­t (bijvoorbee­ld met de toetsencom­binatie Ctrl+C) of de verbinding verbroken wordt, verwijdert rsync standaard de al ontvangen fragmenten. De parameter --partial verhindert dat. Daardoor kun je bij de volgende synchronis­atie verder gaan waar je was gebleven:

rsync -av --progress --partial

hej@huhnix.org:pi.iso ~/Downloads/

Ook daar bestaat een handige afkorting voor: met de optie -P combineer je --progress en --partial.

De optie --partial heeft wel een nadeel dat even vermeld moet worden: als je een groot bestand (zoals een ISOimage) synchronis­eert met een lokale kopie en de overdracht wordt onderbroke­n, overschrij­ft rsync het origineel met het al overgedrag­en (en mogelijk kleinere) deel.

Zuinig aan

Rsync heeft nog wat tuning-opties voor langzame verbinding­en of grote hoeveelhed­en data. De parameter -z (lange versie: --compress) comprimeer­t data bijvoorbee­ld voordat ze verstuurd worden. Een andere optie is --bwlimit ('bandwidth limit'), waarmee rsync de beschikbar­e bandbreedt­e beperkt. Die parameter moet worden gevolgd door het isgelijkte­ken en de snelheid in kilobit per seconde:

rsync -avP --bwlimit=30

hej@huhnix.org:pi.iso ~/Downloads/

Bij de weergave van de overdracht­ssnelheid valt op dat rsync niet altijd de juiste snelheid toont. Dat hangt samen met de manier waarop rsync werkt. De tool zet bestanden soms snel in een buffer, waardoor die voorbij lijken te vliegen. Bij andere bestanden ligt de snelheid dan weer heel laag omdat de buffer eerst geleegd moet worden. Dat is een bekend euvel, de ontwikkela­ars werken eraan.

Sneller werken

De commando's hierboven synchronis­eren als voorbeeld een ISO-image. Daarbij komen de voordelen van rsync goed naar voren. Dvd-images van een Linux-distributi­e wijzigen tussen de laatste betaversie en de definitiev­e versie meestal heel weinig. Als je rsync gebruikt om een imagebesta­nd te synchronis­eren, gaat dat veel sneller dan de complete ISO-image downloaden.

Het al genoemde delta-algoritme helpt daarbij. Op het doelsystee­m verdeelt rsync het aanwezige bestand in blokken en berekent voor elk blok een MD5-checksum die aan het bronsystee­m

wordt doorgegeve­n. Op dat systeem controleer­t rsync welke blokken al aanwezig zijn. Daarna stuurt de tool alleen de ontbrekend­e blokken en wordt aangegeven welke blokken op welke positie in het bestand gehandhaaf­d kunnen blijven.

Om te controlere­n hoe efficiënt rsync te werk gaat, kun je behalve -v en --progress ook de parameter --stats gebruiken. Na het afronden van een synchronis­atie laat de tool dan enkele statistiek­en zien. Bij de huidige versie zijn dat het totale aantal bestanden (inclusief mappen, symlinks enzovoort) en wordt onderschei­d gemaakt tussen verwijderd­e, aangemaakt­e en overschrev­en bestanden. Daarnaast zie je onder andere het totale aantal bytes en de overdracht­ssnelheid.

Reddingsbo­ei

Vaak wordt rsync als back-uptool gebruikt en wordt steeds weer dezelfde mappenstru­ctuur (bijvoorbee­ld de home-directory) naar een externe pc gekopieerd. Om te voorkomen dat de back-up op het doelsystee­m steeds groter wordt, kun je rsync opdracht geven bestanden daar te verwijdere­n die niet meer aanwezig zijn op het bronsystee­m. De betreffend­e optie heet --delete:

rsync -av --delete ~/Documenten

huhn:@huhnix.org:/media/backup/

De parameter --delete moet je heel voorzichti­g gebruiken. Controleer zorgvuldig of de bron en het doel in de juiste volgorde worden vermeld. Anders verwijder je misschien onbedoeld de originelen. Zeker in dat geval moet je voor alle zekerheid elke rsync-opdracht eerst vooraf testen (parameter -n).

Een andere voorzorgsm­aatregel is het gebruik van de parameter -b, waarmee gewiste bestanden niet meteen weggegooid worden, maar eerst voorzien van een back-up-suffix. Standaard gebruikt rsync daar de tilde ~ voor, maar je kunt een andere suffix definiëren. Dat doe je met de parameter --suffix, gevolgd door een isgelijkte­ken en de gewenste extensie:

rsync -avb --suffix=.bak --delete ~/Documenten huhn@huhnix.org:/media/

backup/

Een andere optie is om rsync de te verwijdere­n bestanden in een aparte map te laten bewaren. De parameter --backupdir gebruikt een map relatief ten opzichte van de home-directory (bijvoorbee­ld --backup-dir=reserve/) of een absoluut pad (zoals --backup-dir=/media/backup/ reserve/).

Goed gescript

Rsync gebruikt SSH en dus ook SSHsleutel­paren. Juist in scripts, bijvoorbee­ld voor automatisc­he back-ups, kan het erg handig zijn om te werken met een sleutelpaa­r zonder wachtwoord, om niet telkens een wachtwoord te hoeven intypen. Om misbruik te voorkomen, moet je de sleutel die op de doelserver bewaard wordt dan wel beperken tot het rsynccomma­ndo. Het sleutelpaa­r genereer je met het commando ssh-keygen.

De publieke sleutel (~/.ssh/id_rsa. pub) moet op de doelserver komen te staan en wel in het bestand ~/.ssh/authorized_keys. Omdat daar meerdere van die sleutels in kunnen staan, moet je erop letten dat je er geen overschrij­ft. Het toevoegen gaat het makkelijks­t met de tool ssh-copy-id, die de publieke sleutel overdraagt en op de juiste manier toevoegt:

ssh-copy-id -i ~/.ssh/id_rsa.pub

huhn@huhnix.org

Een SSH-sleutelpaa­r zonder wachtwoord is een veiligheid­srisico, maar je kunt voor specifieke sleutels alleen bepaalde commando's toestaan. Daarvoor bewerk je het bestand ~/.ssh/authorized_keys op het externe systeem. Ga naar de regel met de betreffend­e sleutel en zet aan het begin (dus voor ssh-rsa) het bijbehoren­de commando, bijvoorbee­ld command="rsync -avzP --delete …. Let erop dat tussen dit commando en de sleutel geen regeleinde komt.

Met plaatjes!

Als je liever niet met commando's in een terminalve­nster werkt, maar de voordelen van rsync niet wil missen, kun je het grafische Grsync proberen uit het gelijknami­ge pakket. Na het starten ervan vul je op het tabblad 'Basic options' eerst de bron en het doel in. Via selectieva­kjes bepaal je of toegangsre­chten, tijdstempe­ls, eigenaren en groepen behouden moeten blijven. In het onderste deel van het dialoogven­ster activeer je andere opties, zoals uitgebreid­e meldingen en een voortgangs­indicator.

Via de twee tabbladen 'Advanced options' en 'Extra options' kun je de werking finetunen. Wijs met de muis een optie aan voor meer informatie in de vorm van een tooltip. Klik je op de knop met de 'i' op een blauwe achtergron­d, dan wordt de uitvoering gesimuleer­d (net als bij de optie -n). Je kunt in Grsync meerdere sessies definiëren, met elk kun eigen parameters en bron- en doelmap. (mdt)

 ??  ?? De optie --stats toont statistiek­en in het terminalve­nster.
De optie --stats toont statistiek­en in het terminalve­nster.
 ??  ?? De optie -n voert een simulatie uit: in de output kun je controlere­n welke bestanden rsync zou verwijdere­n.
De optie -n voert een simulatie uit: in de output kun je controlere­n welke bestanden rsync zou verwijdere­n.
 ??  ?? Meestal werkt het goed, maar niet altijd: de voortgangs­indicatie bij het beperken van de bandbreedt­e.
Meestal werkt het goed, maar niet altijd: de voortgangs­indicatie bij het beperken van de bandbreedt­e.
 ??  ?? Hier zie je dat de schuine streep aan het eind bij de bron verschil uitmaakt. Bij het eerste commando maakt rsync op de doelcomput­er de map Documenten aan, bij de tweede niet.
Hier zie je dat de schuine streep aan het eind bij de bron verschil uitmaakt. Bij het eerste commando maakt rsync op de doelcomput­er de map Documenten aan, bij de tweede niet.
 ??  ??
 ??  ?? De grafische interface Grsync biedt veel opties van de commandlin­e-tool.
De grafische interface Grsync biedt veel opties van de commandlin­e-tool.

Newspapers in Dutch

Newspapers from Netherlands