Backups automàtics a Linux amb rsync i cron
Els backups no són un projecte. Són part del dia a dia, com actualitzar paquets o revisar logs. I tanmateix, en massa sistemes, són l’últim que s’automatitza bé. Sovint s’escriuen a sobre sense control de versions, mai es revisen fins que fallen, o només s’executen quan algú s’enrecorda.
Per què rsync?
Perquè està a tot arreu, no requereix dimonis, és ràpid en copiar només el que ha canviat, i es comporta de forma predictible si es configura bé. I a diferència d’eines més complexes, no imposa una estructura tancada ni requereix formats propietaris. Això importa quan necessites restaurar una cosa ràpida sense dependre de configuracions antigues o programari addicional.
Què anem a veure
- Quin tipus de backup té sentit amb rsync.
- Com evitar sobrescriure sense voler.
- Com organitzar el destí i mantenir versions.
- Com integrar-lo amb cron de forma neta.
- Com rotar backups antics sense escriure scripts des de zero.
- Quins són el errors més comuns.
1. Quin tipus de backup convé amb rsync
rsync és molt bo per a còpies d’arbre d’arxius, ja sigui locals o per SSH. Pots fer:
- Backups locals d’ un directori a un altre disc o punt de muntatge.
- Backups remots via SSH (pull o push).
- Còpies incrementals simples (basades en hard links).
- Sincronitzacions unidireccionals amb exclusions.
No serveix per:
- Bases de dades en calent (sense fer dump).
- Backups amb control de canvis a nivell de bloc.
- Versionat d’ arxius binaris com imatges de disc.
Per a backups diaris d’arxius de configuració, llocs web, directoris d’usuaris o dumps de base de dades, és més que suficient.
2. Estructura bàsica: un script clar i controlat
No posis directament el comandament rsync a cron. Fes servir un script. Així pots controlar millor l’entorn, el logging i els errors. Aquí va una plantilla base comentada:
#!/bin/bash
SRC="/etc"
DEST="/backups/servidor01/etc"
DATE=$(date +%F)
LOG="/var/log/backup_etc.log"
EXCLUDES="/opt/scripts/excludes.txt"
mkdir -p "$DEST/$DATE"
rsync -aAXv \
--delete \
--exclude-from="$EXCLUDES" \
"$SRC/" "$DEST/$DATE/" >> "$LOG" 2>&1
echo "$(date +'%F %T') Backup de $SRC completat" >> "$LOG"
Notes clau:
- -aAX manté permisos, ACLs i atributs estesos (útil en backups locals).
- –delete esborra arxius en el destí que ja no estan en l’origen. Compte amb això si t’equivoques a la ruta.
- “${SRC}/” amb la barra final és deliberat: sense ella, rsync crea un subdirectori dins del destí amb el nom del directori font.
- El destí és per data (2025-06-29, per exemple), per mantenir versions.
- L’ arxiu d’ exclusions permet ignorar cachés, temporals, muntatges externs, etc.
Exemple de excludes.txt:
/proc/
/sys/
/dev/
/run/
/tmp/
/mnt/
/media/
/var/cache/
3. Configurar cron sense sorpreses
Edita el crontab del root o de l’usuari que tingui accés a tots els arxius als que necessites copiar:
sudo crontab -e
Exemple de línia:
0 2 * * * /opt/scripts/backup_etc.sh
Això executa el backup cada dia a les 2:00 AM.
Consideracions pràctiques:
- Assegura’t de fer servir rutes absolutes a l’script (/usr/bin/rsync, no rsync) si hi ha dubtes sobre l’entorn.
- Redirigeix logs dins l’ script, no a la línia del crontab. Així tot queda al mateix arxiu.
- Fes servir flock si el backup pot trigar més del previst, per evitar solapaments:
0 2 * * * /usr/bin/flock -n /var/lock/backup_etc.lock /opt/scripts/backup_etc.sh
4. Rotar backups antics sense reinventar la roda
Tenir un backup per dia està bé, però sense control acabes omplint el disc. Hi ha diverses formes de rotar backups:
Opció A: rotar amb tmpreaper o find
Una solució simple: esborra carpetes de backup que tinguin més de N dies. Pots posar-lo com a part de l’script o com un altre job en cron.
find /backups/servidor01/etc/* -maxdepth 0 -type d -mtime +14 -exec rm -rf {} \;
Aquest comandament esborra carpetes amb més de 14 dies d’antiguitat. S’ executa en un cron a banda o al final de l’ script.
Precaució: assegura’t de no tenir comodins mal posats. Sempre prova el find amb echo o ls abans d’ aplicar rm.
Opció B: esquema de rotació amb hard links
Si necessites conservar versions però sense duplicar espai, pots fer servir –link-dest. Això permet backups “incrementals” que només ocupen espai addicional si l’arxiu ha canviat.
Estructura:
# Dia 1 rsync -aAX --delete /etc/ /backups/etc/2025-06-28/ # Dia 2 (incremental amb hard links) rsync -aAX --delete --link-dest=/backups/etc/2025-06-28/ /etc/ /backups/etc/2025-06-29/
Aquest patró requereix més control en l’ script, però redueix ús de disc i permet rotació manual. rsnapshot automatitza això, tot i que no sempre és necessari si saps el que fas.
5. Backups remots via SSH
Fer un pull des d’ un servidor central:
rsync -aAX -e "ssh -i /root/.ssh/id_ed25519" user@192.168.1.10:/etc/ /backups/servidor01/etc/
O fer un push des del servidor que es copia:
rsync -aAX -e "ssh -i /root/.ssh/id_ed25519" /etc/ backup@192.168.1.100:/backups/servidor01/etc/
Consideracions:
- Fes servir claus SSH sense passphrase per a automatització, però restringeix el seu ús amb command=”rsync …”, from=”ip”, etc. en ~/.ssh/authorized_keys.
- Limita permisos de l’ usuari backup en el servidor receptor.
- Controla l’ample de banda amb –bwlimit=5000 si necessites evitar saturació.
6. Errors comuns
- Sense barra final en l’origen: Acabes amb /backups/etc/etc/ en lloc de /backups/etc/.
- Mal ús de –delete: Si el destí està mal apuntat, podries esborrar dades bones.
- Backups al mateix disc: Serveixen davant d’errors lògics, però no davant fallades físiques. No els anomenis “backup” si estan en el mateix punt de muntatge.
- Permisos trencats en restaurar: Si no fas servir -aAX, perds ACLs, xattrs o duels. Especialment crític en /etc, /home, o backups de contenidors.
- No revisar logs: Si rsync falla per permisos, ruta mal escrita o destí no muntat, i no revises el log, només ho sabràs quan necessitis restaurar.
- No muntar el disc: Si el backup s’escriu a /mnt/backup i aquest no està muntat, pots acabar omplint l’arrel del sistema. Fes servir alguna cosa com:
if mountpoint -q /mnt/backup; then
rsync ...
else
echo "No muntat: /mnt/backup" >> $LOG
fi
7. Restaurar no hauria de ser una incògnita
No hi ha backup útil si no saps restaurar-lo.
Si fas servir rsync, restaurar és copiar. Pots fer-ho amb rsync -a en sentit invers, o amb cp -a, depenent del cas.
Exemple:
rsync -a /backups/etc/2025-06-28/ /etc/
Fes proves periòdiques. Munta un contenidor o VM, copia el backup, arrenca serveis. No esperis a estar contra rellotge per a descobrir que et falta alguna cosa.
8. Val la pena fer servir rsnapshot, Borg, Restic o altres?
Sí, en molts casos. Però rsync continua sent una opció vàlida si:
- Tens pocs servidors.
- Prefereixes veure els teus backups com a carpetes normals.
- Necessites una cosa comprensible per a altres admins sense entrenament.
- Ja fas servir cron i vols control explícit.
Per a més compressió, xifrat, verificació automàtica i de-duplicació, eines com Borg i Restic ofereixen molt més. Però són una altra capa de complexitat. En entorns petits o intermedis, rsync ben muntat continua sent perfectament útil.

