Exacte kopie
Bestanden synchroniseren met rsync
Rsync synchroniseert bestanden op lokale pc's of via een netwerk. Deze commandline-tool werkt op de achtergrond met SSH, waardoor de data versleuteld verstuurd worden. Door het slimme algoritme is rsync onverslaanbaar als het om grote bestanden gaat.
Als je bestanden tussen twee directory's wilt synchroniseren, 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 ontwikkelde programma werkt altijd in één richting. Vóór het synchroniseren vergelijkt rsync de bestanden met elkaar en bekijkt welke verschillen er zijn tussen het bron- en het doelbestand. Het vergelijkt bijvoorbeeld de grootte en het tijdstip van de laatste wijzigingen met elkaar. Alleen als er verschillen opgemerkt worden, komt het programma in actie.
Juist bij grote hoeveelheden data doet rsync het goed omdat daar waar mogelijk alleen de ontbrekende delen van bestan- den overgezet worden. Bij het versturen wordt SSH-versleuteling gebruikt. De data kunnen tijdens het versturen gecomprimeerd worden. Je kunt een maximale bandbreedte instellen en individuele bestanden uitsluiten. Op verzoek behoudt rsync bestandseigenschappen als toegangsrechten en gebruikers- of groepstoewijzing.
Recente Linux-versies installeren het programma in het algemeen automatisch mee. Krijg je bij het uitvoeren van rsync --help in een terminalvenster een foutmelding, dan voeg je de software toe via de pakketmanager. Ook macOS heeft deze
synchronisatietool, zodat het uitwisselen tussen Linux- en Apple-apparaten mogelijk is. Op macOS gebruik je rsync in een terminalprogramma 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 synchroniseer je bijvoorbeeld bestanden uit de map 'Documenten' in de homedirectory (afgekort door het ~-teken) naar de map /media/backup/documenten op dezelfde computer:
rsync ~/Documenten/*
/media/backup/Documenten/
Subdirectory's en verborgen bestanden met een punt voor de naam worden daarbij echter overgeslagen. Daarvoor zijn extra parameters vereist.
Om de bestanden naar een externe pc te versturen, is extra informatie over de gebruikeren hostnaam (of het ip-adres van de externe site) nodig. Ook moeten rsync en ssh op beide devices beschikbaar 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 gebruikersnaam (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 gebruikersnaam. Omdat rsync voor externe doelen het SSH-protocol gebruikt, speelt de publickey-procedure een rol voor een eventuele authenticatie 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 interessant bij het synchroniseren, waarbij rsync eerst de bestanden op de beide pc's met elkaar vergelijkt. Dan worden namelijk de bestandsgrootte en het tijdstip van de laatste verandering vergeleken (Quick check). Als die van elkaar verschillen, 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 gearchiveerd
Je kunt vóór de bron en het doel enkele parameters toevoegen om de werking van rsync te beïnvloeden. Standaard worden bijvoorbeeld 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 symbolische links: -l zorgt ervoor dat ze als symlink gekopieerd worden. Als je rsync gebruikt voor het maken van back-ups, zijn de volgende opties interessant: -p kopieert de machtigingen mee, -t de tijdstempel en -g de groepsrechten. Die drie opties zijn voor alle gebruikers beschikbaar, maar -o (bestandseigenaar) en -D (apparaatkenmerken) zijn alleen beschikbaar voor de systeembeheerder 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 symbolische links en behoudt de toegangsrechten, de tijdstempel en andere eigenschappen:
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' rechtstreeks naar de doelmap. Een bestand genaamd test.doc wordt dan gesynchroniseerd naar /media/backup/test.doc. Rsync maakt in dat geval geen submap 'Documenten' aan op de doellocatie.
Je controleert de werking van de tool met de optie -v (van 'verbose'). Rsync wordt dan een stuk mededeelzamer en toont in het terminalvenster wat het op de achtergrond 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 daadwerkelijk uitgevoerd.
Resultaatgericht
Zeker bij grotere hoeveelheden data of tragere verbindingen is een voortgangsindicatie prettig. Voeg de parameter --progress toe om het synchroniseren in de gaten te houden:
rsync -av --progress
hej@huhnix.org:.pi.iso ~/Downloads/
In het terminalvenster verschijnt dan een melding die aangeeft hoeveel bytes en hoeveel procent rsync al verstuurd heeft. Verder zie je ook de overdrachtssnelheid 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 doelsysteem in eerste instantie opgeslagen met een verborgen bestandsnaam (beginnend met een punt) en een willekeurig gekozen extensie. Pas als de overdracht voltooid is, krijgt het bestand de eigenlijke naam.
Als je een overdracht onderbreekt (bijvoorbeeld met de toetsencombinatie 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 synchronisatie 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) synchroniseert met een lokale kopie en de overdracht wordt onderbroken, overschrijft rsync het origineel met het al overgedragen (en mogelijk kleinere) deel.
Zuinig aan
Rsync heeft nog wat tuning-opties voor langzame verbindingen of grote hoeveelheden data. De parameter -z (lange versie: --compress) comprimeert data bijvoorbeeld voordat ze verstuurd worden. Een andere optie is --bwlimit ('bandwidth limit'), waarmee rsync de beschikbare bandbreedte beperkt. Die parameter moet worden gevolgd door het isgelijkteken en de snelheid in kilobit per seconde:
rsync -avP --bwlimit=30
hej@huhnix.org:pi.iso ~/Downloads/
Bij de weergave van de overdrachtssnelheid 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 ontwikkelaars werken eraan.
Sneller werken
De commando's hierboven synchroniseren als voorbeeld een ISO-image. Daarbij komen de voordelen van rsync goed naar voren. Dvd-images van een Linux-distributie wijzigen tussen de laatste betaversie en de definitieve versie meestal heel weinig. Als je rsync gebruikt om een imagebestand te synchroniseren, gaat dat veel sneller dan de complete ISO-image downloaden.
Het al genoemde delta-algoritme helpt daarbij. Op het doelsysteem verdeelt rsync het aanwezige bestand in blokken en berekent voor elk blok een MD5-checksum die aan het bronsysteem
wordt doorgegeven. Op dat systeem controleert rsync welke blokken al aanwezig zijn. Daarna stuurt de tool alleen de ontbrekende blokken en wordt aangegeven welke blokken op welke positie in het bestand gehandhaafd kunnen blijven.
Om te controleren hoe efficiënt rsync te werk gaat, kun je behalve -v en --progress ook de parameter --stats gebruiken. Na het afronden van een synchronisatie laat de tool dan enkele statistieken zien. Bij de huidige versie zijn dat het totale aantal bestanden (inclusief mappen, symlinks enzovoort) en wordt onderscheid gemaakt tussen verwijderde, aangemaakte en overschreven bestanden. Daarnaast zie je onder andere het totale aantal bytes en de overdrachtssnelheid.
Reddingsboei
Vaak wordt rsync als back-uptool gebruikt en wordt steeds weer dezelfde mappenstructuur (bijvoorbeeld de home-directory) naar een externe pc gekopieerd. Om te voorkomen dat de back-up op het doelsysteem steeds groter wordt, kun je rsync opdracht geven bestanden daar te verwijderen die niet meer aanwezig zijn op het bronsysteem. De betreffende optie heet --delete:
rsync -av --delete ~/Documenten
huhn:@huhnix.org:/media/backup/
De parameter --delete moet je heel voorzichtig 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 voorzorgsmaatregel 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 isgelijkteken en de gewenste extensie:
rsync -avb --suffix=.bak --delete ~/Documenten huhn@huhnix.org:/media/
backup/
Een andere optie is om rsync de te verwijderen bestanden in een aparte map te laten bewaren. De parameter --backupdir gebruikt een map relatief ten opzichte van de home-directory (bijvoorbeeld --backup-dir=reserve/) of een absoluut pad (zoals --backup-dir=/media/backup/ reserve/).
Goed gescript
Rsync gebruikt SSH en dus ook SSHsleutelparen. Juist in scripts, bijvoorbeeld voor automatische back-ups, kan het erg handig zijn om te werken met een sleutelpaar 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 rsynccommando. Het sleutelpaar 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 overschrijft. Het toevoegen gaat het makkelijkst 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-sleutelpaar zonder wachtwoord is een veiligheidsrisico, 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 betreffende sleutel en zet aan het begin (dus voor ssh-rsa) het bijbehorende commando, bijvoorbeeld 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 terminalvenster werkt, maar de voordelen van rsync niet wil missen, kun je het grafische Grsync proberen uit het gelijknamige pakket. Na het starten ervan vul je op het tabblad 'Basic options' eerst de bron en het doel in. Via selectievakjes bepaal je of toegangsrechten, tijdstempels, eigenaren en groepen behouden moeten blijven. In het onderste deel van het dialoogvenster activeer je andere opties, zoals uitgebreide meldingen en een voortgangsindicator.
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 achtergrond, dan wordt de uitvoering gesimuleerd (net als bij de optie -n). Je kunt in Grsync meerdere sessies definiëren, met elk kun eigen parameters en bron- en doelmap. (mdt)