Het automatiseren van back-ups met rsync op Linux

  • Rsync maakt efficiĆ«nte back-ups mogelijk door alleen de wijzigingen over te dragen, waarbij machtigingen en metadata zowel lokaal als via SSH behouden blijven.
  • De combinatie van scripts, cron of systemd-timers maakt van rsync een automatisch, roulerend en vrijwel onderhoudsvrij back-upsysteem.
  • Goede werkwijzen zoals uitsluitingen, oordeelkundig gebruik van --delete, monitoring en hersteltesten maken een verschil in de daadwerkelijke betrouwbaarheid van de back-up.

Het automatiseren van back-ups met rsync op Linux

Als u Linux-servers beheert of gewoon een computer hebt met gegevens die u zich niet kunt veroorloven te verliezen, dan is het leren gebruiken van essentieel belang. rsync om back-ups te automatiseren Het is praktisch onmisbaar. Je hoeft geen dure softwarepakketten te installeren of afhankelijk te zijn van propriƫtaire tools: met een paar goed doordachte commando's heb je een solide, efficiƫnt en gemakkelijk te onderhouden back-upsysteem.

In deze gids ziet u: Van de basisprincipes van rsync tot geavanceerd bewerken.Lokale back-ups, back-ups op afstand via SSH, back-ups in Time Machine-stijl met snapshots, productieklare scripts, cron, systemd-timers, uitsluitingen, rotaties en verificatie. Bekijk onze Vergelijking van back-upmethoden Een strategie bepalen. Het idee is dat je het artikel afsluit met een duidelijk plan en concrete opdrachten die je praktisch kunt kopiƫren en aanpassen aan je eigen omgeving.

Wat is rsync en waarom wordt het zo veel gebruikt voor back-ups?

Rsync is een commandoregelprogramma dat is ontworpen voor Bestanden en mappen synchroniseren tussen twee locaties., hetzij op dezelfde computer of tussen verschillende machines, meestal via SSH of met behulp van een eigen rsyncd-daemon.

Het voordeel van rsync ten opzichte van een simpele cp of scp is dat het een slim algoritme implementeert. differentiƫle blokoverdrachtHet vergelijkt de bron en de bestemming en verzendt alleen de wijzigingen, niet het hele bestand elke keer. Als je veel data hebt en slechts kleine delen wijzigt, zijn de tijds- en bandbreedtebesparingen enorm.

Daarnaast kan rsync vrijwel alle metadata behoudenMachtigingen, eigenaren, groepen, tijdstempels, symbolische links, apparaten... Daarom is het zo handig voor "serieuze" back-ups, waarbij niet alleen de inhoud belangrijk is, maar ook hoe het bestandssysteem is opgezet.

Een ander belangrijk voordeel is dat rsync werkt. zowel lokaal als op afstandJe kunt het gebruiken om twee mappen op dezelfde server te synchroniseren, om gegevens van een externe server naar je back-upmachine te halen, of om gegevens via SSH naar een externe NAS of VPS te verzenden.

linux rsync

Installeer en test rsync op verschillende distributies.

Hoewel veel distributies al met rsync worden geleverd, is het een goed idee om het toch te installeren. Controleer de installatie en update naar een recente versie. zowel op de bron- als op de doelmachine voordat u uw automatische back-ups instelt.

Op Debian- of Ubuntu-gebaseerde systemen kunt u iets heel eenvoudigs doen, zoals:

rsync --version
sudo apt update
sudo apt install rsync

In distributies zoals RHEL, CentOS, Rocky Linux of andere afgeleiden is de procedure vrijwel hetzelfde: de pakketbeheerder wordt aangepast, maar het principe blijft hetzelfde. Zorg ervoor dat rsync beschikbaar en up-to-date is. in beide uitersten.

rsync --version
sudo dnf install rsync # En sistemas modernos
sudo yum install rsync # En sistemas mƔs antiguos

Basisopties voor rsync die je constant zult gebruiken

Hoewel rsync over een breed scala aan parameters beschikt, zul je in de praktijk bij back-ups 90% van je tijd besteden aan het gebruik van... een kleine reeks opties Dat moet je uit je hoofd leren.

De algemene structuur van het commando is vrij eenvoudig, maar er is ƩƩn detail dat veel mogelijkheden toevoegt: de schuine streep aan het einde van de paden verandert het gedrag.

Algemene syntaxis:

rsync ORIGEN DESTINO

Het belangrijkste verschil zit hem in de manier waarop je de bronmap behandelt:

# Copia el directorio como tal dentro del destino
rsync -av /source/dir /backup/

# Kopieer ALLEEN de inhoud van de map naar de bestemming
rsync -av /bron/dir/ /backup/

Sommige van de meest gebruikte back-upopties zijn bijzonder praktisch omdat Ze combineren veel dingen in een korte tekst.:

  • -a: bestandsmodus. Equivalent aan -rlptgoD (recursief, behoudt symbolische links, machtigingen, tijdstempels, groep, eigenaar en speciale bestanden).
  • -v: "Uitgebreide" modus. Laat zien wat het doet en welke bestanden het opent.
  • -z: comprimeert gegevens tijdens de overdracht, ideaal voor het kopiĆ«ren op afstand via internet.
  • -h: zorgt ervoor dat groottes er "mooi" uitzien (MB, GB…), perfect voor mensen.
  • -P: combineert voortgangs- en gedeeltelijke bestanden, zodat je kunt zien hoe het ervoor staat en indien nodig verder kunt gaan.
  • –VerwijderenVerwijdert op de bestemming de bestanden die niet meer op de bronlocatie bestaan, en laat een exacte kopie achter.
  • -n / –dry-run: simuleert de uitvoering zonder iets aan te raken, fantastisch om fouten te voorkomen.
  • -uitsluiten / -uitsluiten vanHiermee kunt u patronen of een volledige lijst met routes uitsluiten die u niet wilt kopiĆ«ren.
  • –link-destHiermee worden harde links naar een eerdere kopie gemaakt, de basis voor incrementele back-ups zoals die van Time Machine.

Handmatige lokale kopieƫn en eerste voorbeelden

De eerste stap voordat je iets automatiseert, is het hebben van... Duidelijke en beproefde handmatige kopieeropdrachtenLaten we een aantal typische voorbeelden bekijken die we later in scripts zullen gebruiken.

Als je je thuismap wilt klonen naar een lokale back-upschijfDe minimale opdracht zou er als volgt uitzien:

rsync -av /home/usuario/ /mnt/disco_backup/usuario/

Deze rsync scant je De homepage is compleet, met behoud van toestemmingen, data en structuur.en kopieert alleen wat ontbreekt of is gewijzigd sinds de laatste keer, wat al een zeer nette incrementele kopie is zonder de zaken onnodig ingewikkeld te maken.

Een ander klassiek voorbeeld is synchronisatie. projectgegevens, foto's of documenten Tussen twee mappen op dezelfde server of zelfs op verschillende schijven, zodat je altijd een tweede, lokaal gespeeld spel hebt dat altijd actueel is.

rsync -av /media/fotos/ /backup/fotos/

Als het gaat om gevoelige systeemgegevens, zoals /etc of /var/wwwHet is normaal om een ​​exacte kopie te willen, waarbij alles wat in het origineel verdwijnt, uit de back-up wordt verwijderd. Dat is waar de bekende verwijderingsoptie van pas komt.

rsync -av --delete /var/www/ /backup/www/

rsync linux

Beveiligde back-ups op afstand met SSH

Waar rsync echt in uitblinkt, is wanneer je het combineert met SSH om kopieƫn van de server te verzendenOp deze manier kunt u uw gegevens opslaan op een andere node in uw netwerk, een NAS of een VPS op internet. Zo bent u niet afhankelijk van ƩƩn enkel apparaat en voldoet u aan een deel van de bekende 3-2-1-regel (minimaal ƩƩn kopie op een externe locatie).

Idealiter zou u authenticatie met een publieke sleutel moeten configureren in plaats van steeds handmatig wachtwoorden in te voeren. Zodra de sleutel naar de back-upserver is gekopieerd, worden de commando's zeer intuĆÆtief.

# Empujar datos locales a un servidor remoto de backup
rsync -avz /etc/ backup@servidor-remoto:/backups/etc/

# Gegevens van een externe server naar uw back-upmachine overbrengen
rsync -avz backup@remote-server:/var/www/ /backups/www/

In iets complexere scenario's kunt u aanpassingen maken. SSH-versleuteling, poort of compressie Je kunt rsync zelf gebruiken met -e, bijvoorbeeld als je server op een andere poort luistert of als je een trage verbinding wilt optimaliseren.

rsync -avz \
-e "ssh -p 2222 -c -o Compression=no" \
/origen/ backup@servidor-remoto:/destino/

Een handige truc bij zwakke verbindingen of gedeelde netwerken is om gebruik te maken van –bwlimit om overbelasting van de link te voorkomen en ervoor zorgen dat niemand zonder internet komt te zitten terwijl je een enorme back-up maakt.

rsync -avz --bwlimit=5000 /datos/ backup@servidor-remoto:/backups/datos/

Volledige, differentiƫle en incrementele back-ups met rsync

Hoewel rsync al differentiƫle overdrachten op blokniveau uitvoert, is het vanuit het oogpunt van een back-upstrategie de moeite waard om dit te overwegen. drie soorten kopieƫn: volledige, differentiƫle en incrementele kopieƫndie je direct kunt implementeren met rsync-opties.

Een volledige kopie is eenvoudig: alle inhoud van de bron wordt op de bestemming gereproduceerd, ideaal als eerste back-up of om een ​​schone referentie te hebben.

# Copia completa de un Ɣrbol de directorios
rsync -a /ruta/origen/ /ruta/destino/

Differentieel kopiƫren bouwt voort op die basis en richt zich op het synchroniseren van de bestemming met de bron, het kopiƫren van wijzigingen en het verwijderen van wat niet meer bestaat. Dat is wat je meestal bedoelt als je het hebt over... een spiegelkopie van het systeem hebben.

# Copia diferencial, manteniendo el destino idƩntico al origen
rsync -a --delete /ruta/origen/ /ruta/destino/

Het meest interessante onderdeel is de "echte" incrementele back-up, waarbij naast het synchroniseren ook Je bewaart de geschiedenis op datum zonder gegevens te dupliceren.Hier komt de optie –link-dest van pas, waarmee harde links naar een eerdere kopie worden gemaakt voor bestanden die niet zijn gewijzigd.

# Copia incremental apoyada en una copia previa
rsync -a --link-dest=/ruta/a/copiaprevia \
/ruta/origen/ /ruta/destino-incremental/

Met deze aanpak lijkt elke back-upmap een volledige kopie te zijn, maar intern is dat niet het geval. Identieke bestanden delen blokken op de schijf.Dit reduceert de benodigde ruimte aanzienlijk en maakt het eenvoudig om door historische momentopnamen te navigeren.

Back-ups in de stijl van Time Machine met snapshots en harde links.

Veel mensen willen het gemak van macOS Time Machine met momentopnamen op datumMet rsync is dit perfect mogelijk door --link-dest te combineren met een beetje shell-commandovoering en wat organisatie.

Het idee is om een ​​actuele directory bij te houden die verwijst naar de laatst goede back-up, en tegelijkertijd een directory te creĆ«ren. mappen met tijdstempel (datum-tijd) die elke momentopname vertegenwoordigen. Onveranderde bestanden zijn gekoppeld met harde links naar de vorige momentopname, en nieuwe blokken worden alleen geschreven wanneer er daadwerkelijke verschillen zijn.

Een typisch commando in dat schema zou er bijvoorbeeld zo uit kunnen zien:

rsync -avPh --delete \
--link-dest="$TARGETDIR/current" \
"$SOURCEDIR/$USER/" \
"$TARGETDIR/$USER-$TIMESTAMP"

Vervolgens zorgt een script ervoor dat de symbolische link wordt bijgewerkt. actueel, zodat het altijd naar de meest recente momentopname verwijsten om een ​​kleine geschiedenis bij te houden, geordend op datum. Daarmee kunt u door oudere kopieĆ«n bladeren door simpelweg de map te openen waarin u geĆÆnteresseerd bent.

Automatisering gaat vanzelf: je slaat het script op in zoiets als /usr/local/bin/rsync-time-machine en plan het zo in dat het dagelijks wordt uitgevoerd met cron op het tijdstip dat jou het beste uitkomt.

0 5 * * * bash /usr/local/bin/rsync-time-machine

Automatiseer dagelijkse back-ups met cron.

Er komt een punt waarop handmatig kopiƫren niet meer zinvol is; de normale gang van zaken is Plan back-ups met cron. zodat ze automatisch draaien tijdens daluren (bijvoorbeeld 's ochtends vroeg) en je er verder geen omkijken naar hebt, behalve dat je af en toe de logboeken controleert.

Het proces is altijd hetzelfde: je maakt een script dat een volledige kopie maakt met alle opties (uitsluitingen, logboeken, enz.), je geeft het script uitvoerrechten en je voegt het toe aan de crontab van de betreffende gebruiker of aan root als het gaat om het aanpassen van het hele systeem.

Een voorbeeld van een eenvoudig script voor lokaal kopiƫren zou er als volgt uit kunnen zien:

#!/bin/bash
SOURCE_DIR="/home"
BACKUP_DIR="/backup/home"
LOG_FILE="/var/log/backup/rsync-local.log"
DATE=$(date +"%Y-%m-%d %H:%M:%S")

mkdir -p Ā«$BACKUP_DIRĀ» Ā«$(dirname Ā«$LOG_FILEĀ»)Ā»
echo "Lokale back-up gestart" >> "$LOG_FILE"

rsync -av –delete
–exclude='*.tmp' \
–exclude='.cache' \
–exclude='Downloads/*' \
Ā«$SOURCE_DIR/Ā» Ā«$BACKUP_DIR/Ā» >> Ā«$LOG_FILEĀ» 2>&1

als ; dan
echo Ā» Back-up succesvol voltooidĀ» >> Ā«$LOG_FILEĀ»
anders
echo Ā» Back-up met foutenĀ» >> Ā«$LOG_FILEĀ»
fi

Zodra je het script bijvoorbeeld hebt ingevoerd, /usr/local/bin/rsync-local-backup.sh En als je het als uitvoerbaar markeert, voeg je het toe aan cron zodat het op een specifiek tijdstip wordt uitgevoerd.

sudo chmod +x /usr/local/bin/rsync-local-backup.sh
sudo crontab -e

In crontab zou je zoiets kunnen zetten:

0 2 * * * /usr/local/bin/rsync-local-backup.sh

systemd-timers: een modern alternatief voor cron

In moderne systemen is het vaak de moeite waard Gebruik systemd-timers in plaats van cron.Vooral handig als u services beter wilt integreren, netwerkafhankelijkheden wilt beheren of gecentraliseerde logboeken in journalctl wilt hebben.

Het idee is om een ​​service te definiĆ«ren die je back-upscript uitvoert, en een timer die aangeeft wanneer dit script moet worden uitgevoerd. De service zou er bijvoorbeeld zo uit kunnen zien:


Description=Rsync Backup Service
After=network-online.target
Wants=network-online.target

Type=oneshot
ExecStart=/usr/local/bin/rsync-remote-backup.sh
Gebruiker=root
Standaarduitvoer=journaal
Standaardfout=journaal
TimeoutSec=7200

WantedBy = multi-user.target

En de bijbehorende timer zou als volgt worden gedefinieerd, voor een dagelijkse back-up om 2 uur 's nachts met een zekere mate van willekeurigheid, zodat niet alles tegelijk overweldigd raakt:


Description=Daily Rsync Backup Timer
Requires=rsync-backup.service

OpKalender=*-*-* 02:00:00
Persistent=waar
RandomizedDelaySec=10min

WantedBy=timers.target

Daarmee rest ons alleen nog systemd opnieuw te laden, de timer te activeren en te controleren of deze correct is geprogrammeerd en of Uit het servicelogboek blijkt dat de kopieƫn worden gestart wanneer dat nodig is..

sudo systemctl daemon-reload
sudo systemctl enable --now rsync-backup.timer
systemctl list-timers
journalctl -u rsync-backup.service

Plan roulerende back-ups in: dagelijks, wekelijks en maandelijks.

Als je iets uitgebreiders wilt dan een enkele statische kopie, kun je een structuur opzetten van Regelmatige back-ups: dagelijks, wekelijks en maandelijks.Harde links gebruiken om ruimte te besparen en de zoekfunctie gebruiken om oude bestanden op te ruimen.

Een klassiek patroon houdt in dat er een actuele map is die telkens wordt bijgewerkt met rsync, waarna die mapstructuur wordt gekloond met harde links naar dagelijkse, wekelijkse en maandelijkse mappen, afhankelijk van de dag.

#!/bin/bash
SOURCE_DIR="/var/www"
BACKUP_ROOT="/backup/www"
CURRENT="$BACKUP_ROOT/current"
DAILY="$BACKUP_ROOT/daily"
WEEKLY="$BACKUP_ROOT/weekly"
MONTHLY="$BACKUP_ROOT/monthly"
DATE=$(date +%Y%m%d)
DOW=$(date +%u)
DOM=$(date +%d)

mkdir -p Ā«$CURRENTĀ» Ā«$DAILYĀ» Ā«$WEEKLYĀ» Ā«$MONTHLYĀ»

rsync -av –delete –link-dest=Ā»$CURRENTĀ» \
Ā«$SOURCE_DIR/Ā» Ā«$CURRENT/Ā»

&& cp -al Ā«$CURRENTĀ» Ā«$DAILY/$DATEĀ»
&& cp -al Ā«$CURRENTĀ» Ā«$WEEKLY/$DATEĀ»
&& cp -al Ā«$CURRENTĀ» Ā«$MONTHLY/$DATEĀ»

find Ā«$DAILYĀ» -maxdepth 1 -type d -mtime +7 -exec rm -rf {} \;
find Ā«$WEEKLYĀ» -maxdepth 1 -type d -mtime +28 -exec rm -rf {} \;
find Ā«$MONTHLYĀ» -maxdepth 1 -type d -mtime +365 -exec rm -rf {} \;

Met dit systeem heb je een redelijk representatief historisch venster zonder de schijf te vullen met volledige kopieƫn, en elke momentopname blijft navigeerbaar als een normale map.

Als uw gegevens snel veranderen of erg groot zijn, kunt u de bewaartermijnen en frequenties aanpassen, of dit zelfs combineren met LVM- of ZFS-snapshots om de consistentie van databases of virtuele machines te waarborgen.

Controleer, verifieer en ontdek of uw back-ups bruikbaar zijn.

Het is geweldig om dagelijks back-uptaken uit te voeren, maar als niemand het resultaat controleert Dat zal je niet veel helpen. Het is belangrijk om een ​​basismonitor in te stellen om te weten of en wanneer de laatste back-up is gemaakt.

Een eenvoudige tactiek is om na een succesvolle back-up een klein markeringsbestand in de bestemmingsmap achter te laten, bijvoorbeeld een bestand met de naam .last-backup-success en de datum. Een extern script, of zelfs een controle in Nagios/Icinga, kan je dan waarschuwen als dat bestand te oud is.

MARKER="/backup/www/.last-backup-success"
if ; then
echo "Marcador de backup no encontrado"
exit 1
fi

Een andere gezonde gewoonte is om te controleren Controleer de rsync-logboeken op fouten of ongebruikelijke overdrachtssnelheden.Een script dat statistieken verzamelt zoals "Aantal bestanden", "Totale grootte", "Snelheidsverbetering" en dergelijke, geeft je een snel overzicht van de voortgang.

En wat echt het verschil maakt, is er natuurlijk aan wennen, zo nu en dan. om een ​​echte restauratie uit te voerenNeem een ​​specifiek bestand, herstel een versie van gisteren of vorige week en controleer of het correct opent. Dit is de enige manier om er zeker van te zijn dat, mocht er op een dag iets misgaan, uw back-ups nog steeds bescherming bieden.

Als je al deze onderdelen combineert – een goed geconfigureerde rsync, automatisering met cron of systemd, verstandige rotatie, monitoring en hersteltesten – krijg je uiteindelijk het volgende resultaat: een robuust, flexibel en voordelig Linux-backupsysteem, die optimaal profiteert van de voordelen van gratis software zonder dat dit ten koste gaat van gebruiksgemak of betrouwbaarheid.

Gerelateerd artikel:
Volledige handleiding voor het maken van incrementele back-ups in Windows

Toevoegen als voorkeursbron