Essentieel in de gereedschapskist van elke serieuze Linux gebruiker

Rsync is het soort tool waarvan je achteraf denkt: goh, had ik dit maar eerder ontdekt! Het maakt niet uit of je één systeem onder je hoede hebt of tienduizend, rsync maakt het leven van de systeembeheerder en de gebruiker een stuk makkelijker. Je kunt bestanden heen en weer schuiven, back-ups maken en garanderen dat data op twee plaatsen identiek is. Dat allemaal encrypted en volledig geautomatiseerd, mocht je dit willen. In dit artikel kijken we naar een paar veel voorkomende ‘use cases’ van rsync.

Geschiedenis & Wat is
Zoals de naam al aangeeft, is rsync bedoeld voor het synchroniseren van bestanden en mappen van de ene locatie naar een andere. Het doet dit op een hele slimme manier: in plaats van complete bestanden heen en weer te sturen, stuurt het alleen de veranderingen door (ook wel ‘delta encoding’ genoemd). Zo bespaart rsync een hoop dataverkeer en rekenkracht, zeker als je twee bestanden hebt die heel erg op elkaar lijken. Stel dat je een .iso bestand van 1Gb hebt gekopieerd en je besluit daarna dat je 0.01% van dat bestand (bijvoorbeeld in de metadata) wilt veranderen. In plaats van dat je het hele bestand opnieuw moet kopiëren, stuurt rsync alleen maar de veranderde 0.01% aan data. Dat scheelt!

Lokaal kopiëren
Laten we beginnen met een simpel voorbeeld: het kopiëren van data tussen twee mappen. Bijvoorbeeld van een USB stick naar een map op een harde schijf. In plaats van het standaard ‘cp –R’ commando, dat bestanden één voor één compleet overschrijft, gebruiken we het veel efficiëntere rsync:

Listing 1

$ rsync -av /usbdisk/ /local/disk/

Met de -a optie geven we aan dat we de attributen van de bestanden (bijvoorbeeld de tijdstempels en permissies) willen behouden en met -v zien we de resultaten van de operatie op het scherm.

Stel dat we nu per ongeluk de USB stick tijdens de operatie uit de computer trekken, moeten we dan weer opnieuw beginnen? Nee, we geven simpelweg hetzelfde commando en rsync kopieert alleen de verschillen. Met andere woorden, het gaat exact door waar het gebleven was.

Dry runs en de trailing slash
Rsync heeft ontzettend verschillende opties (de -a code is bijvoorbeeld een afkorting voor -rlptgoD) en het kan dus voorkomen dat je af en toe een foutje maakt. Om ernstige gevolgen te voorkomen, kunnen we een dry run doen door de -n optie mee te geven. In plaats van het commando daadwerkelijk uit te voeren, vertelt rsync ons dan alleen maar wat het zou hebben gedaan, zonder ook maar een byte te verplaatsen. Wanneer je er zeker van bent dat je commando juist is, haal je de -n optie weg en voer je het commando echt uit.

Een goed voorbeeld van waar dit erg handig is, is de trailing slash (/): als de slash is meegegeven, dan wordt alleen de inhoud van de map gekopieerd; zonder slash wordt de complete map gekopieerd. Zie hier het verschil:

Listing 2

$ rsync -n -av /tmp/photos .

sending incremental file list

photos/

photos/photo1.jpg 

$ rsync -n -av /tmp/photos/ .

sending incremental file list

./

 

Remote kopiëren
Tot nu toe hebben we alleen lokaal bestanden gekopieerd. De echte kracht van rsync komt pas tot uiting wanneer we bestanden kopiëren tussen twee aparte locaties. Stel dat we een back-up van onze home directory op een aparte machine willen back-uppen.

Listing 3

$ rsync -avz /home/linmag linmag@apartemachine:/backups/

 

In feite doen we dus hetzelfde als een ‘scp –r’ commando, maar dan op de rsync manier. De -z optie is nieuw vergeleken met het vorige voorbeeld. Daarmee wordt data gecomprimeerd voordat we het versturen, waardoor we minder netwerkverkeer gebruiken. Net als bij scp kunnen we de data ook van de server “pullen”:

Listing 4

$ rsync -avz linmag@apartemachine:/backups/ /home/linmag

Stel dat we in onze home map een hoop bestanden hebben verwijderd, hoe zorgen we dan dat ze ook op de aparte machine worden verwijderd? Simpel, we geven de –delete optie mee:

Listing 5

$ rsync -avz –delete /home/linmag linmag@apartemachine:/backups/

 

Wees echter wel voorzichtig met deze optie, want als je om wat voor reden dan ook bijvoorbeeld je /home niet hebt gemount, dan wordt de gehele back-up verwijderd! Een dry run is in dit geval waarschijnlijk dus een verstandig idee.

Incrementele back-ups
Voor een back-up binnen een bedrijf wil je in veel gevallen meer dan af en toe een map kopiëren: je wilt een incrementele back-up hebben, waarbij elke verandering wordt opgeslagen. In dat geval gebruiken we de –backup optie tezamen met –backup-dir:

Listing 6

rsync –backup –backup-dir=`date +%Y.%m.%d` -avz \

/home/linmag linmag@apartemachine:/backups/

Bij elke verandering aan een bestand in /home/linmag ten opzichte van wat zich al op de aparte machine bevindt, wordt een nieuwe map met de numerieke waarden voor JAAR.MAAND.DAG aangemaakt waar de veranderde bestanden worden opgeslagen.

Veiligheid
Bij de voorgaande voorbeelden gebruikten we steeds het rsh protocol voor het versturen van bestanden tussen locaties. Om veiliger te zijn, is het beter om SSH (Secure SHell) te gebruiken:

Listing 7

$ rsync -avz -e ‘ssh -ax’ /home/linmag linmag@apartemachine:/backups/

De -a en -x optie voor SSH zorgen er respectievelijk voor dat we geen shell toegang en geen X11 forwarding gebruiken, want dat heeft rsync niet nodig.

SSH Keys
Als we dat doen, moeten we wel elke keer ons SSH wachtwoord ingeven. Dat is verder geen probleem, tenzij we rsync automatisch willen uitvoeren, bijvoorbeeld als cronjob. Om ervoor te zorgen dat we geen wachtwoord hoeven op te geven, gebruiken we SSH keys. Maak eerst een public-private key pair aan op de lokale machine en kopieer vervolgens je public key naar de aparte machine:

Listing 8

lokaal$ ssh-keygen -N ” -C backup1 -t rsa -f ~/.ssh/backup

lokaal$ scp ~/.ssh/backup.pub linmag@apartemachine:.ssh

Op de aparte machine geven we nu aan dat de nieuwe public key toegestaan is:

Listing 9

apartemachine$ cd ~/.ssh

apartemachine$ cat backup.pub >> authorized_keys

apartemachine$ rm backup.pub

 

Om ervoor te zorgen dat de key alleen te gebruiken is voor rsync, moeten we het uit te voeren commando toevoegen vóór de sleutel in authorized_keys. Het commando verkrijgen we door :

Listing 10

$ rsync -avz -e ‘ssh -v -ax’ /home/linmag linmag@apartemachine:/backups/ | grep “Sending command”

Je ziet nu zoiets als:

Listing 11

debug1: Sending command: rsync –server -vnlogDtprze.iLsf

–delete . /backups/

Plaats dat commando nu als volgt in je authorized keys bestand:

Listing 12

command=”rsync –server -vnlogDtprze.iLsf –delete . /backups/”,no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB….

 

Als het goed is, kan je nu back-ups maken zonder dat je je SSH wachtwoord hoeft op te geven!

Automatische back-ups
Nu we geen wachtwoord meer hoeven op te geven, kunnen we de back-ups helemaal automatisch laten plaatsvinden. Creëer een shellscript met de naam nightly-backup.sh met daarin ons rsync commando:

Listing 13

#! /bin/bash

rsync -avz -e ‘ssh -ax’ /home/linmag linmag@apartemachine:/backups/ >> /var/log/nightly-backup.log

 

Laten we zeggen dat we nu elke nacht om 04:00 uur de back-up willen laten draaien. We hebben dan de volgende regel voor onze cron job:

 

Listhing 14

 

0 4 * * * * /locatie/van/nightly-backup.sh

Voeg de regel toe via het commando ‘crontab -e’. Vanaf nu worden elke nacht automatisch backups gemaakt van onze home directory!

Nog meer
We hebben in dit artikel slechts een tipje van de sluier opgelicht. Rsync is een enorm krachtige tool voor het verschuiven van bestanden en voor het maken van backups. Je kunt rsync bijvoorbeeld in daemon mode draaien, waarmee je precies kunt bepalen wie vanuit welke mappen wel of niet mag synchroniseren: kortom, een belangrijk aspect voor de beveiliging. Je kunt ook het ‘grsync’ programma installeren, om rsync grafisch uit te voeren. Rsync is een echte power tool: het biedt een breed scala aan mogelijkheden en is een essentieel onderdeel van de gereedschapskist van elke serieuze Linux gebruiker.