Linux commando: rsync
Vroeg of laat moet je als Linux-gebruiker veel bestanden van de ene plek naar de andere kopieren: een website naar een server, een home-map naar een backupschijf, een project tussen twee machines. Je kunt het met cp of scp doen, maar zodra je diezelfde kopie een tweede keer draait, voel je de verspilling, want ze kopieren elke keer alles opnieuw. rsync is precies daarvoor gemaakt. Het kijkt naar wat er al op de bestemming staat en verstuurt alleen de delen die veranderd zijn, wat het de stille ruggengraat maakt van backups, deployments en servermigraties over de hele wereld.
1. De basis
De taak van rsync is om een bestemming op een bron te laten lijken, en dat met zo min mogelijk werk te doen. Je wijst het een bron en een bestemming aan, en het kopieert de bestanden. Tot zover is het gewoon cp. Het verschil komt naar voren de tweede keer dat je het draait: rsync vergelijkt eerst de twee kanten en slaat alles over wat al identiek is, dus een herhaalde synchronisatie van een grote map kan in seconden klaar zijn, zelfs als er maar een bestand is veranderd.
Dat ene idee, "kopieer alleen het verschil", is wat rsync bijzonder maakt. Het werkt op een machine, tussen twee schijven, en over het netwerk via SSH, allemaal met hetzelfde commando. Het kan rechten, eigenaarschap, tijdstempels en symbolische links precies behouden. Het kan bestanden op de bestemming verwijderen die niet langer op de bron bestaan, zodat de twee kanten echt overeenkomen. En als de verbinding halverwege een enorme overdracht wegvalt, kan het verdergaan waar het gebleven was in plaats van opnieuw te beginnen.
Het commando leest van links naar rechts, net als cp: het laatste argument is de bestemming, en alles daarvoor is een bron.
$ rsync -a Documents/ /backup/Documents/
Het gereedschap dat alleen kopieert wat veranderd is. Achter die eenvoudige belofte schuilt een slim verschil-algoritme, een kleine maar scherpe set regels over afsluitende schuine strepen, en genoeg opties om alles te draaien van een backup van een regel tot een volledige servermigratie.
Dit artikel begint met de eenvoudigste lokale kopie en bouwt op naar overdrachten op afstand via SSH, spiegelen met verwijderingen, bestanden uitsluiten, en de delta-transfer-truc waarmee rsync een groot bestand kan bijwerken door slechts een paar kilobytes te versturen. Aan het einde begrijp je niet alleen hoe je rsync draait, maar ook waarom het zo weinig werk doet.
Naar bovenHet juiste denkmodel:
rsync"kopieert geen bestanden", het synchroniseert twee locaties. Elke keer stelt het dezelfde vraag, "wat is er anders?", en verplaatst alleen dat. Het gevaar zit, net als bijcp, altijd bij de bestemming.
2. Waar komt de naam vandaan?
De naam rsync is een samentrekking van remote (op afstand) en sync (kort voor synchronise, synchroniseren). Het werd vanaf het begin ontworpen om bestanden gesynchroniseerd te houden tussen een lokale en een externe machine, en de naam zegt precies dat.
rsync = Remote SYNC
Het verving een ouder, dommer gereedschap genaamd rcp ("remote copy"), dat hele bestanden over het netwerk kopieerde zonder enige slimheid. De extra letters in rsync zijn een kleine belofte: dit is niet zomaar een kopie op afstand, het is een synchronisatie op afstand die let op wat er al is. De naam is bijna dertig jaar blijven hangen omdat hij het gereedschap nog steeds perfect beschrijft.
3. Een korte geschiedenis
Anders dan cp en ls, die teruggaan tot de eerste dagen van Unix, is rsync een relatief modern gereedschap. Andrew Tridgell en Paul Mackerras brachten de eerste versie uit in 1996. Het hart ervan is het rsync-algoritme, een methode om een bestand over een trage netwerkverbinding bij te werken door alleen de veranderde stukken te versturen. Tridgell beschreef het in een technisch rapport uit 1996 en later in zijn proefschrift. Dat algoritme is nog steeds wat rsync vandaag de dag de moeite waard maakt.
| Periode | Mijlpaal |
|---|---|
| 1996 | Andrew Tridgell en Paul Mackerras brengen rsync uit, als vervanging van rcp |
| Eind jaren 90 | Het rsync-delta-transfer-algoritme wordt gepubliceerd en verfijnd |
| 2008 | rsync 3.0 voegt incrementele recursie toe: het begint met overdragen voordat de hele boom is gescand |
| 2020 | rsync 3.2 voegt snellere checksums (xxhash) en betere compressie (zstd) toe |
| Nu | rsync 3.2.x, protocol 31, wordt met vrijwel elke Linux-distributie meegeleverd |
Omdat het algoritme het interessante deel was, werd rsync meer dan een commando: het is ook een lichtgewicht protocol. Je komt het tegen als een gewone lokale kopie, als een overdracht getunneld via SSH, en als een netwerkdienst (een "rsync-daemon") die openbare mirrors gebruiken om software te verspreiden. Dit artikel richt zich op de twee die je het meest zult gebruiken: lokale kopieen en kopieen via SSH.
Naar bovenDe meeste klassieke Unix-gereedschappen doen een taak op een plek.
rsyncis ongewoon omdat het ook een netwerkprotocol en een verschil-algoritme in een enkel commando draagt, en daarom kan een gereedschap een laptop backuppen, een website uitrollen en een archief spiegelen.
4. Eenvoudige toepassingen
4.1 De eenvoudigst mogelijke synchronisatie
Geef rsync een bron, een bestemming en de optie -a, en het kopieert de bron naar de bestemming. In de voorbeelden hieronder is de regel die met $ begint wat je typt; de regels eronder zijn wat rsync teruggeeft.
$ rsync -a project/ /backup/project/
Er wordt niets afgedrukt, wat de normale Unix-manier is om "het is gelukt" te zeggen. De optie -a (kort voor archive, archief) is de optie die je bijna elke keer zult gebruiken. Het betekent "kopieer recursief en houd alles zoals het is": submappen, rechten, tijdstempels en symbolische links. Behandel rsync -a voorlopig als het dagelijkse startpunt; sectie 5 opent het verder.
4.2 De regel van de afsluitende schuine streep
Dit is de ene regel over rsync die iedereen moet leren, want hij verandert stilletjes waar je bestanden terechtkomen. Een afsluitende schuine streep op de bron betekent "de inhoud van deze map". Geen afsluitende schuine streep betekent "deze map zelf".
$ rsync -a src/ dst/ # copies the CONTENTS of src into dst
$ rsync -a src dst/ # copies the DIRECTORY src, giving dst/src
Je kunt het jezelf in een paar seconden bewijzen:
$ rsync -a src/ dst1/
$ ls dst1
a.txt b.txt sub
$ rsync -a src dst2/
$ ls dst2
src
Het eerste commando vult dst1 met de bestanden die in src zaten. Het tweede plaatst src als een submap in dst2. Wanneer een backupscript op mysterieuze wijze backup/project/project oplevert, is een ontbrekende of extra schuine streep bijna altijd de reden. De schuine streep op de bestemming maakt niet op dezelfde manier uit; het is de schuine streep op de bron die de indeling bepaalt.
Hier is een valkuil waar ik zelf in trapte, toen ik mijn eigen home-map naar een externe schijf backupte, en hij kan een backup stilletjes ruineren. Het is verleidelijk om naar een jokerteken te grijpen in plaats van een afsluitende schuine streep, en dat is precies wat ik deed:
$ rsync -av /home/peter/* /media/peter/writable/ # looks right, is not
Het probleem is dat de * wordt uitgevouwen door de shell, voordat rsync ook maar draait, en een kale * matcht geen namen die met een punt beginnen. Dus elk verborgen bestand en elke verborgen map in de home-map (.bashrc, .ssh, .config, .gnupg) wordt stilletjes weggelaten. Je kunt het zien gebeuren met echo:
$ echo /home/peter/*
/home/peter/Documents /home/peter/notes.txt # notice: no .bashrc, no .ssh
Wat dit gevaarlijk maakt, is dat het lijkt alsof het gelukt is. De zichtbare bestanden en mappen komen prima over, en verborgen bestanden binnen die mappen gaan ook mee, want rsync daalt af in elke map die de shell wel heeft doorgegeven. Alleen de verborgen bestanden op het bovenste niveau verdwijnen, en dat zijn precies de bestanden met je instellingen, sleutels en inloggegevens. In mijn geval eindigde de externe schijf met al mijn documenten maar geen enkele van mijn configuratiebestanden, en ik merkte het pas later. De oplossing is de vorm met afsluitende schuine streep, die de map zelf aan rsync doorgeeft en het de hele boom laat doorlopen, verborgen bestanden en al:
$ rsync -av /home/peter/ /media/peter/writable/ # copies EVERYTHING, dotfiles included
Wanneer je "een hele map" kopieert, geef dan de voorkeur aan source/ boven source/*. De afsluitende schuine streep vraagt rsync om de bestanden te kiezen; het jokerteken vraagt de shell, en de shell verbergt je verborgen bestanden.
4.3 Kijken voor je springt: -v en -n
Omdat rsync kan verwijderen en overschrijven, is het de moeite waard om te zien wat het gaat doen voordat het het doet. Twee opties maken het spraakzaam en voorzichtig.
De optie -v (kort voor verbose, uitgebreid) somt elk bestand op terwijl het wordt overgedragen:
$ rsync -av src/ dst/
sending incremental file list
./
a.txt
b.txt
sub/
sub/c.txt
sent 308 bytes received 88 bytes 792.00 bytes/sec
total size is 17 speedup is 0.04
De optie -n (kort voor dry-run, proefdraai) is het vangnet. Het toont precies wat er zou gebeuren, maar verandert niets. Combineer het met -v en je krijgt een voorvertoning:
$ rsync -avn src/ dst/
sending incremental file list
a.txt
b.txt
sub/c.txt
sent 163 bytes received 32 bytes 390.00 bytes/sec
total size is 17 speedup is 0.09 (DRY RUN)
Let op de markering (DRY RUN) aan het einde. Maak er een gewoonte van om elk nieuw of riskant rsync-commando eerst met -avn te draaien, de lijst te lezen, en pas dan de n weg te halen. Deze ene gewoonte voorkomt de meeste rsync-ongelukken.
4.4 Leesbare groottes: -h
Ruwe byte-aantallen in de samenvatting zijn lastig te lezen. De optie -h (kort voor human-readable, mensleesbaar) verandert ze in K, M en G:
$ rsync -ah --stats bigfolder/ /backup/bigfolder/
...
Total file size: 1.42G bytes
Total transferred file size: 12.043M bytes
Dat tweede getal is het punt van rsync in een regel: de map is 1,42 GB, maar er is maar 12 MB echt veranderd, dus er is maar 12 MB verstuurd.
5. Gemiddelde toepassingen
5.1 Wat -a echt betekent
De archief-optie is geen toverij; het is een bundel kleinere opties. Weten wat erin zit helpt je te begrijpen wat rsync behoudt en wat het laat vallen.
-a = -rlptgoD
| Letter | Kort voor | Behoudt |
|---|---|---|
-r |
recursive | Daalt af in elke submap |
-l |
links | Kopieert symbolische links als links, niet als hun doelwit |
-p |
perms | Behoudt rechten (de mode-bits) |
-t |
times | Behoudt wijzigingstijden |
-g |
group | Behoudt de groep |
-o |
owner | Behoudt de eigenaar (vereist root) |
-D |
devices | Behoudt apparaatbestanden en speciale bestanden (vereist root) |
Tijdstempels behouden is belangrijker dan het lijkt. Bij de volgende keer bepaalt rsync of een bestand is veranderd door grootte en wijzigingstijd te vergelijken. Als -t de tijd niet zou behouden, zou elk bestand de volgende keer nieuw lijken en zou rsync alles opnieuw kopieren, waarmee het zijn belangrijkste voordeel weggooit. Daarom zou je bijna altijd -a (of op zijn minst -t) moeten opnemen in plaats van een kale -r.
Een ding om op te merken: -a bevat niet -A (ACL's), -X (uitgebreide attributen) of -H (hard links). Die zijn apart, en sectie 6 behandelt ze.
5.2 Kopieren over het netwerk: SSH
De "r" in rsync staat voor remote (op afstand), en hier blinkt het uit. Om naar een andere machine te kopieren, zet je user@host: voor het pad op afstand. Standaard tunnelt rsync de overdracht via SSH, dus het is net zo veilig als een normale SSH-login.
$ rsync -a site/ Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken. :/var/www/site/ # push to a server
$ rsync -a Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken. :/var/www/site/ site/ # pull from a server
Welke kant ook het voorvoegsel host: heeft, dat is de kant op afstand. Om opties aan SSH door te geven, zoals een niet-standaard poort of een specifieke sleutel, gebruik je de optie -e (kort voor rsh, de remote shell):
$ rsync -a -e "ssh -p 2222" site/ Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken. :/var/www/site/
5.3 De overdracht comprimeren: -z
De optie -z (kort voor compress, comprimeren) knijpt de gegevens samen voordat het ze over de lijn stuurt. Op een traag of gelimiteerd netwerk kan dit overdrachten van tekst, code en andere samendrukbare bestanden flink versnellen.
$ rsync -az site/ Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken. :/var/www/site/
Gebruik -z voor overdrachten op afstand. Sla het over voor lokale kopieen en voor mappen vol al gecomprimeerde bestanden (JPEG's, video's, ZIP's, de meeste media): ze nog eens comprimeren verbrandt alleen maar CPU zonder winst.
5.4 Hervatten en voortgang volgen: -P
Een grote overdracht over een wankele verbinding kan halverwege mislukken. De optie -P zet twee hulpjes tegelijk aan: --partial (bewaar het half overgedragen bestand zodat de volgende keer het kan afmaken) en --progress (toon een live voortgangsregel per bestand).
$ rsync -aP bigfile.iso Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken. :/data/
bigfile.iso
1,048,576 32% 12.4MB/s 0:00:04
Zonder --partial begint een onderbroken overdracht van een groot bestand de volgende keer weer bij nul. Met de optie houdt rsync vast wat het al verstuurd heeft en gaat verder. Voor elke overdracht die meer dan een paar seconden duurt, is -P een vriend.
De voortgangsregel van -P toont een balk per bestand. Wanneer je duizenden bestanden kopieert en een enkele balk voor de hele klus wilt, gebruik dan --info=progress2:
$ rsync -a --info=progress2 src/ dst/
10,000,025 100% 1.16GB/s 0:00:00 (xfr#6, to-chk=0/8)
De to-chk=0/8 aan het einde telt hoeveel bestanden er nog te controleren zijn, zodat je de run naar nul kunt zien aflopen.
5.5 De bestemming precies laten overeenkomen: --delete
Standaard voegt rsync alleen toe en werkt bij; het verwijdert nooit iets van de bestemming. Dus als je een bestand op de bron verwijdert, blijft de oude kopie stilletjes op de bestemming hangen. De optie --delete maakt van de bestemming een echte spiegel door bestanden te verwijderen die niet langer op de bron bestaan.
$ rsync -avn --delete src/ dst/
sending incremental file list
deleting old-report.txt
...
(DRY RUN)
Dit is krachtig en scherp. --delete plus een verkeerd pad of een ontbrekende afsluitende schuine streep kan bestanden wissen die je wilde behouden. Draai het altijd eerst met -n en lees de deleting-regels voordat je het vertrouwt. Zorgvuldig gebruikt is het precies hoe je een backup of een uitgerolde website perfect gelijk houdt met de bron.
6. Gevorderde toepassingen
6.1 Dingen weglaten: --exclude
Echte projecten bevatten dingen die je niet wilt kopieren: caches, logs, mappen met afhankelijkheden, tijdelijke bestanden. De optie --exclude slaat alles over wat op een patroon matcht, en je kunt het meer dan eens opgeven.
$ rsync -a --exclude '*.log' --exclude 'cache/' src/ dst/
Voor een lange lijst houd je de patronen in een bestand en lees je ze met --exclude-from:
$ rsync -a --exclude-from='ignore.txt' src/ dst/
De patronen werken veel als .gitignore-regels: een afsluitende schuine streep betekent "een map", een schuine streep aan het begin verankert het patroon aan de top van de overdracht, en * matcht binnen een padniveau. Er is een bijpassende --include voor het zeldzamere geval waarin je bijna alles wilt uitsluiten maar een paar dingen wilt behouden.
6.2 Extra metadata: -A, -X en -H
De archief-optie -a behoudt de alledaagse metadata, maar drie belangrijke dingen worden bewust weggelaten omdat ze extra werk kosten.
| Optie | Kort voor | Behoudt |
|---|---|---|
-A |
acls | Access control lists (fijnmazige rechten) |
-X |
xattrs | Uitgebreide attributen (SELinux-contexten, eigen metadata) |
-H |
hard-links | Hard links, zodat gedeelde bestanden gedeeld blijven in plaats van gedupliceerd |
Wanneer je een heel systeem backupt of een server migreert en wilt dat de kopie echt getrouw is, is het gebruikelijke recept rsync -aAXH. Voor een gewone map met documenten is een kale -a genoeg.
6.3 Vergelijken op inhoud, niet op klok: -c
Standaard beslist rsync dat een bestand ongewijzigd is wanneer zowel de grootte als de wijzigingstijd overeenkomen. Dat is snel, maar het kan voor de gek gehouden worden: een bestand dat is bewerkt en binnen dezelfde seconde met dezelfde grootte is opgeslagen, of een bestand waarvan de tijdstempel is teruggezet, kan erdoorheen glippen. De optie -c (kort voor checksum, controlegetal) laat rsync in plaats daarvan elk bestand aan beide kanten lezen en een sterke checksum vergelijken.
$ rsync -avc src/ dst/ # compare by checksum, ignore size and time
Dit is trager, omdat het alle gegevens moet lezen, maar het is de eerlijke manier om de vraag "zijn deze twee mappen echt identiek?" te beantwoorden. Het is goed om te kennen voor verificatieruns, al is het niets voor dagelijkse synchronisaties.
6.4 De itemized-uitvoer lezen: -i
De optie -i (kort voor itemize-changes, wijzigingen opsommen) drukt naast elk bestand een compacte code af die je precies vertelt waarom het is overgedragen. Het ziet er eerst cryptisch uit, maar een minuut studie betaalt zich terug.
$ rsync -ain src/ dst/
>f+++++++++ newfile.txt
>f..t...... changed.txt
.d..t...... sub/
Lees de reeks van links naar rechts. Het eerste teken is de actie: > betekent dat een bestand wordt ontvangen (naar de bestemming gestuurd), en . betekent dat het item zelf niet wordt bijgewerkt, alleen een attribuut. Het tweede teken is het type: f voor een bestand (file), d voor een map (directory). De rest zijn de redenen: c checksum, s grootte (size), t tijd (time), p rechten (permissions), o eigenaar (owner), g groep (group). Een rij van +++++++++ betekent dat het bestand splinternieuw is. Dus >f..t...... lees je als "stuur dit bestand omdat de tijd verschilt", en >f+++++++++ lees je als "dit bestand is nieuw".
6.5 Een goede buur zijn: --bwlimit en --stats
Een rsync op volle snelheid kan een netwerkverbinding verzadigen en al het andere vertragen. De optie --bwlimit begrenst de overdrachtssnelheid, wat beleefd is op een gedeelde of productieverbinding.
$ rsync -az --bwlimit=5m site/ Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken. :/var/www/site/ # cap at 5 MB/s
De optie --stats drukt aan het einde een gedetailleerd rapport af, wat handig is in scripts en logs om te zien hoeveel er echt is verplaatst:
$ rsync -a --stats src/ dst/
Number of files: 5 (reg: 3, dir: 2)
Number of regular files transferred: 3
Total file size: 25 bytes
Total transferred file size: 25 bytes
...
6.6 Ter plekke schrijven en sparse-bestanden: --inplace en -S
Standaard schrijft rsync elk bijgewerkt bestand naar een tijdelijke kopie en hernoemt het dan over het oude heen. Dat is veilig, want een onderbroken overdracht laat nooit een half geschreven bestand achter, maar het heeft ruimte nodig voor beide versies en het breekt eventuele hard links die naar het origineel wijzen. De optie --inplace schrijft de wijzigingen in plaats daarvan direct in het bestaande bestand. Het bespaart ruimte, houdt hard links intact, en werkt goed samen met het delta-algoritme voor grote bestanden die maar een beetje veranderen, zoals database-dumps, VM-images en logs waar alleen aan wordt toegevoegd.
$ rsync -a --inplace bigdb.sql Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken. :/backups/
De afweging is veiligheid: als de overdracht wordt onderbroken, blijft het bestemmingsbestand gedeeltelijk bijgewerkt achter, dus gebruik --inplace alleen waar dat risico aanvaardbaar is.
De optie -S (kort voor sparse, ijl) behandelt bestanden die lange reeksen nulbytes bevatten, zoals schijf-images en sommige databasebestanden. Het schrijft die reeksen als echte "gaten" in het bestandssysteem in plaats van als blokken nullen, zodat de kopie veel minder ruimte kan innemen dan de schijnbare grootte van het bestand. (Oudere rsync-versies, van voor 3.1.3, weigerden -S met --inplace te combineren; huidige versies staan het toe.)
6.7 Verder dan SSH: de rsync-daemon
SSH is de gebruikelijke manier om een andere machine te bereiken, maar rsync kan ook praten met een speciale rsync-daemon die aan de andere kant draait. Dit is de modus die de grote openbare mirrors gebruiken om Linux-distributies aan duizenden mensen tegelijk uit te delen. Je herkent het aan een dubbele dubbele punt (of een rsync://-URL) en een modulenaam in plaats van een pad in het bestandssysteem:
$ rsync -av rsync://mirror.example/debian/ /srv/mirror/debian/
$ rsync -av mirror.example::debian/ /srv/mirror/debian/ # same thing
Een enkele dubbele punt (host:pad) betekent "verbind via SSH"; een dubbele dubbele punt (host::module) betekent "verbind met de rsync-daemon". De daemon luistert op poort 873 en wordt geconfigureerd in /etc/rsyncd.conf, waar elke module een naam koppelt aan een map en de toegangsregels ervan. De daemon kan sneller zijn dan SSH omdat het de versleutelings-overhead overslaat, maar dat betekent ook dat het verkeer onversleuteld is, dus het past veel beter bij openbare, alleen-lezen mirrors dan bij privebackups. Voor alles wat gevoelig is, blijf bij SSH.
7. Iets wat de meeste gebruikers niet weten
7.1 Het delta-transfer-algoritme: alleen de wijzigingen versturen
Hier is het idee dat rsync beroemd maakt, en dat de meeste mensen elke dag gebruiken zonder te weten dat het bestaat. Wanneer rsync een bestand bijwerkt dat al op de bestemming bestaat, verstuurt het niet het hele bestand opnieuw. Het stuurt alleen de veranderde stukken, zelfs binnen een enkel groot bestand.
Het werkt zo. De ontvangende kant splitst zijn bestaande kopie in blokken van vaste grootte en berekent twee checksums voor elk blok: een snelle "rollende" checksum en een sterke. Die stuurt het naar de verzender. De verzender schuift dan byte voor byte een venster door zijn eigen nieuwere versie van het bestand, en gebruikt de goedkope rollende checksum om plekken te vinden die overeenkomen met een blok dat de ontvanger al heeft. Waar een blok overeenkomt, stuurt rsync alleen een korte verwijzing "dit blok heb je al". Alleen de echt nieuwe bytes reizen over het netwerk.
Dit is waarom een regel toevoegen aan een logbestand van 1 GB en het dan synchroniseren maar een paar kilobytes kan versturen.
rsyncontdekte dat bijna elk blok ongewijzigd was en stuurde er verwijzingen naar in plaats van de gegevens.
Er zit een verrassende wending in: dit slimme algoritme staat uit voor lokale kopieen. Wanneer beide kanten op dezelfde machine staan, is het hele bestand lezen om checksums te berekenen meestal trager dan het gewoon kopieren, dus rsync gebruikt lokaal standaard --whole-file (-W) en schrijft het bestand simpelweg weg. Het delta-algoritme verdient zijn plek op trage netwerkverbindingen, precies waarvoor het is ontworpen.
7.2 Snapshot-backups met --link-dest
Dit is de truc achter veel backupsystemen in "time machine"-stijl, en het voelt de eerste keer als toverij. De optie --link-dest wijst rsync naar een eerdere backup. Elk bestand dat sindsdien niet is veranderd, wordt helemaal niet gekopieerd: in plaats daarvan maakt rsync een hard link naar het bestand in de oude backup, wat in wezen geen extra ruimte kost.
$ rsync -a --delete --link-dest=/backups/monday \
src/ /backups/tuesday/
Het resultaat is een map tuesday die eruitziet als een complete, volledige backup van alles. Maar op schijf nemen alleen de bestanden die sinds maandag echt zijn veranderd nieuwe ruimte in; al het andere is een gedeelde hard link terug naar de backup van maandag. Je kunt een maand lang dagelijkse snapshots bewaren, elk te doorbladeren als een volledige kopie, terwijl je nauwelijks meer ruimte gebruikt dan een enkele kopie plus de wijzigingen. Verwijder een oude snapshot en alleen de unieke bestanden ervan worden vrijgemaakt, omdat de rest nog vanuit nieuwere is gelinkt.
7.3 Weten waar rsync stopt
Een deel van vakmanschap is weten wanneer een ander gereedschap beter past. rsync is voortreffelijk in het synchroniseren van mapbomen, maar het is niet het antwoord op alles.
| Behoefte | Gebruik | Waarom |
|---|---|---|
| Een snelle eenmalige lokale kopie | cp |
Minder te typen, en geen checksum-overhead voor een enkele kopie |
| Een enkel bestand naar een server, eenmalig | scp |
Eenvoudig als er niets te vergelijken of te hervatten is |
| Een boom in een archief bundelen | tar |
Verpakt de hele structuur in een enkel bestand voor opslag of overdracht |
| Versiegeschiedenis van een project | git |
Volgt elke wijziging door de tijd heen, niet alleen de laatste stand |
| Een hele schijf of partitie klonen | dd |
Kopieert ruwe blokken, inclusief het bestandssysteem zelf |
| Gededupliceerde, versleutelde backups | borg / restic |
Slaan elk uniek blok een keer op en versleutelen het, zodat een maand aan snapshots klein blijft |
| Synchroniseren naar cloudopslag | rclone |
Spreekt de API's van S3, Google Drive en tientallen andere providers, met een rsync-achtig gevoel |
| Doorlopende tweerichtingssynchronisatie | Syncthing |
Houdt mappen op meerdere apparaten automatisch op de achtergrond gelijk, in beide richtingen |
De laatste drie zijn moderne gereedschappen gebouwd voor taken waar rsync nooit voor bedoeld was: rsync is eenrichting en zonder geheugen, dus het dedupliceert niet over backups heen, spreekt geen cloud-API's, en voegt geen wijzigingen van twee kanten samen. Leer rsync toch. Zodra je er vertrouwd mee bent, vervangt het stilletjes een hele plank aan kopieerscripts, want het is hetzelfde commando of je nu een laptop backupt, een website uitrolt, of een server naar nieuwe hardware verhuist.
8. Best practices
- Bekijk het eerst met
-avn. Draai elk nieuw of riskant commando, vooral met--delete, eerst als een proefrun, lees de lijst, en haal pas dan denweg. - Beheers de afsluitende schuine streep.
src/betekent "de inhoud",srcbetekent "de map zelf". Deze ene regel bepaalt waar elk bestand terechtkomt. - Gebruik
-aals je standaard, en voeg-ztoe voor overdrachten op afstand,-Pvoor grote, en-AXHwanneer je een echt getrouwe systeemkopie nodig hebt. - Wees voorzichtig met
--delete. Het laat de bestemming precies overeenkomen met de bron, inclusief het verwijderen van bestanden. Een verkeerd pad kan echte gegevens wissen, dus draai het elke keer als proefrun. - Behoud tijdstempels. Behoud altijd de wijzigingstijden (onderdeel van
-a), anders verstuurtrsyncde volgende keer alles opnieuw en verliest het zijn hele voordeel. - Grijp zonder aarzelen naar de handleiding. De
rsync-handleiding is lang omdat het gereedschap diep is.man rsynctypen zodra er een vraag opkomt is de gewoonte die beginners van professionals scheidt.
$ man rsync # the full manual page (long, and worth it)
$ rsync --help # a quick flag summary
Naar boven9. Veelgemaakte fouten
9.1 Drie veelvoorkomende mythes
| Mythe | Werkelijkheid |
|---|---|
"rsync src dst en rsync src/ dst zijn hetzelfde." |
De afsluitende schuine streep op de bron verandert de indeling: de inhoud versus de map zelf. |
"rsync verwijdert verwijderde bestanden automatisch." |
Het verwijdert nooit tenzij je --delete toevoegt. Standaard voegt het alleen toe en werkt het bij. |
"rsync verstuurt altijd alleen de veranderde bytes." |
Het delta-algoritme staat uit voor lokale kopieen en voor splinternieuwe bestanden, die in hun geheel worden verstuurd. |
"rsync dir/* dst/ kopieert alles in dir." |
De shell vouwt * uit en slaat verborgen bestanden op het bovenste niveau over. Gebruik dir/ zodat rsync zelf de bestanden kiest, verborgen bestanden inbegrepen. |
9.2 Andere valkuilen om te vermijden
- De dubbele-nesting-verrassing. Een ontbrekende afsluitende schuine streep op de bron levert
dst/srcop in plaats vandstte vullen. Bekijk het met-nals je twijfelt. - Een home-map backuppen met
*.rsync -a /home/peter/* dst/laat stilletjes elk verborgen bestand op het bovenste niveau vallen (.bashrc,.ssh,.config), omdat de shell de*uitvouwt en verborgen namen nooit matcht. Gebruik in plaats daarvan de vorm met afsluitende schuine streep/home/peter/. --deletedraaien met een typefout. Als het bronpad verkeerd of leeg is, kan--deletede bestemming kaal strippen. Draai altijd eerst een proefrun.-avergeten en een kale-rgebruiken. Zonder behouden tijden en rechten kopieert de volgende synchronisatie alles opnieuw en komen de bestanden met de verkeerde eigenaar aan.- Al gecomprimeerde gegevens comprimeren.
-ztoevoegen aan een overdracht van video's of ZIP-bestanden verspilt CPU voor bijna geen besparing. Bewaar-zvoor tekst en code over het netwerk. - Een synchronisatie op dezelfde schijf als backup vertrouwen. Als de schijf kapotgaat, gaan bron en bestemming samen ten onder. Een echte backup staat op aparte opslag, het liefst op een andere locatie.
10. Samenvatting
Het commando rsync lijkt op een chiquere cp, maar het is eigenlijk een kleine synchronisatiemotor die toevallig op een commandoregel past.
rsyncbetekent "remote sync". Het laat een bestemming overeenkomen met een bron en verstuurt alleen wat is veranderd, en daarom zijn herhaalde synchronisaties snel.- Het stamt uit 1996 en draagt een verschil-algoritme en een netwerkprotocol in een enkel gereedschap.
- Het laatste argument is de bestemming. Een afsluitende schuine streep op de bron (
src/) kopieert de inhoud; geen streep (src) kopieert de map zelf. Geef de voorkeur aansrc/bovensrc/*, anders laat de shell je verborgen bestanden vallen. -a(archive) is de alledaagse optie: het betekent-rlptgoD, dus het kopieert recursief en behoudt links, rechten, tijden en eigenaarschap.- Voeg
-ztoe om overdrachten op afstand te comprimeren,-Pom te hervatten en voortgang te tonen, en-e "ssh ..."om de SSH-verbinding te sturen. --deletemaakt van een kopie een echte spiegel door bestanden te verwijderen die niet langer op de bron bestaan. Bekijk het elke keer met-avn.--excludeslaat ongewenste bestanden over;-A,-Xen-Hvoegen ACL's, uitgebreide attributen en hard links toe voor een getrouwe systeemkopie.- Het delta-transfer-algoritme verstuurt alleen de veranderde stukken van een bestand over het netwerk, en
--link-destbouwt ruimtebesparende snapshot-backups met hard links. - Verder dan SSH kan
rsyncpraten met een daemon (host::module, poort 873) voor openbare mirrors, en--inplacemet-Swerkt grote of sparse-bestanden efficient bij. - Weet waar
rsyncstopt:cpenscpvoor eenmalige kopieen,tarvoor archieven,gitvoor geschiedenis,ddvoor hele schijven, enborg,rcloneofSyncthingvoor gededupliceerde, cloud- of tweerichtingssynchronisatie. - Bij twijfel, typ
man rsync.
Dit is de snelle referentie die het bewaren waard is:
rsync -a src/ dst/ sync contents of src into dst
rsync -a src dst/ copy the folder src into dst (dst/src)
rsync -avn src/ dst/ dry run: show what would change
rsync -aP big.iso host:/data/ resume-friendly copy with progress
rsync -a --info=progress2 s/ d/ one overall progress bar for the whole job
rsync -az src/ user@host:/dst/ compressed copy over SSH
rsync -a --delete src/ dst/ mirror: also remove extra files in dst
rsync -a --exclude '*.log' s/ d/ skip files matching a pattern
rsync -aAXH src/ dst/ faithful copy with ACLs, xattrs, hard links
rsync -a --link-dest=/prev src/ /new/ space-saving snapshot backup
Kleine commando's zoals rsync houden stilletjes serieuze infrastructuur overeind: de backups die elke nacht draaien, de deployments die een website live zetten, de migratie die een bedrijf naar een nieuwe server verhuist. Als je servers ertoe doen en je wilt ze laten backuppen, uitrollen en onderhouden door iemand die begrijpt wat er echt onder de motorkap gebeurt, dan is dat precies het soort werk waar ik graag bij help.


Peter is Joomla specialist en Linux admin voor snelle, veilige en schaalbare websites.


