Automatizzare i backup con rsync su Linux

  • Rsync consente backup efficienti trasferendo solo le modifiche, preservando autorizzazioni e metadati sia localmente che tramite SSH.
  • La combinazione di script, cron o timer systemd trasforma rsync in un sistema di backup automatico, a rotazione e praticamente esente da manutenzione.
  • Le buone pratiche, come le esclusioni, l'uso oculato dell'opzione --delete, il monitoraggio e i test di ripristino, fanno la differenza in termini di affidabilità effettiva del backup.

Automazione dei backup con rsync su Linux

Se gestisci server Linux o semplicemente hai un computer con dati che non puoi permetterti di perdere, imparare a usare rsync per automatizzare i backup È praticamente obbligatorio. Non c'è bisogno di installare una suite costosa o di affidarsi a strumenti proprietari: con pochi comandi ben studiati, è possibile avere un sistema di backup solido, efficiente e di facile manutenzione.

In questa guida vedrai Dalle nozioni di base di rsync alla modifica avanzataBackup locali, backup remoti tramite SSH, backup in stile Time Machine con snapshot, script pronti per la produzione, cron, timer systemd, esclusioni, rotazioni e verifica. Vedi il nostro Confronto dei metodi di backup per decidere una strategia. L'idea è che alla fine dell'articolo tu abbia un piano chiaro e delle istruzioni che puoi concretamente copiare e adattare al tuo contesto.

Cos'è rsync e perché viene utilizzato così tanto per i backup?

Rsync è uno strumento da riga di comando progettato per sincronizzare file e directory tra due posizioni, sia sullo stesso computer che tra macchine diverse, di solito tramite SSH o con il proprio demone rsyncd.

Il vantaggio di rsync rispetto a un semplice cp o scp è che implementa un algoritmo intelligente di trasferimento a blocco differenzialeConfronta il file di origine e quello di destinazione e invia solo le modifiche, non l'intero file ogni volta. Se si dispone di una grande quantità di dati e si modificano solo piccole porzioni, il risparmio di tempo e di banda è enorme.

Inoltre, rsync può conservare praticamente tutti i metadatiPermessi, proprietari, gruppi, timestamp, collegamenti simbolici, dispositivi... Ecco perché è così utile per i backup "seri", dove non conta solo il contenuto, ma anche la configurazione del file system.

Un altro vantaggio importante è che rsync funziona sia in locale che da remotoÈ possibile utilizzarlo per sincronizzare due cartelle sullo stesso server, per trasferire dati da un server remoto alla macchina di backup o per inviare dati a un NAS o VPS remoto tramite SSH.

rsync su Linux

Installa e testa rsync su diverse distribuzioni

Anche se molte distribuzioni hanno già rsync installato, è una buona idea Verifica l'installazione e aggiorna a una versione recente. sia sulla macchina di origine che su quella di destinazione prima di montare i backup automatici.

Sui sistemi basati su Debian o Ubuntu, puoi fare qualcosa di semplice come:

rsync --version
sudo apt update
sudo apt install rsync

In distribuzioni come RHEL, CentOS, Rocky Linux o altri derivati, la procedura sarebbe molto simile, cambiando il gestore di pacchetti ma con la stessa idea di Assicurati che rsync sia disponibile e aggiornato. in entrambi gli estremi.

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

Opzioni base di rsync che userai sempre

Sebbene rsync disponga di un buon arsenale di parametri, in pratica per i backup passerete il 90% del tempo a utilizzare... un piccolo insieme di opzioni che va memorizzato.

La struttura generale del comando è piuttosto semplice, ma c'è un dettaglio che aggiunge molte possibilità: la barra finale nei percorsi ne modifica il comportamento.

Sintassi generica:

rsync ORIGEN DESTINO

La differenza fondamentale sta nel modo in cui si gestisce la directory di origine:

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

# Copiare SOLO il contenuto della directory nella destinazione
rsync -av /source/dir/ /backup/

Alcune delle opzioni di backup più comunemente utilizzate sono particolarmente pratiche perché Riescono a combinare molte cose in un breve testo.:

  • -a: modalità file. Equivalente a -rlptgoD (ricorsivo, preserva i collegamenti simbolici, i permessi, i timestamp, il gruppo, il proprietario e i file speciali).
  • -vModalità "Dettagliata". Mostra cosa sta facendo e a quali file sta accedendo.
  • -z: comprime i dati durante il trasferimento, ideale per copie remote su Internet.
  • -h: rende le dimensioni "belle" (MB, GB…), perfette per gli esseri umani.
  • -P: combina i file di avanzamento e quelli parziali, per visualizzare lo stato di avanzamento e poter riprendere il lavoro.
  • -Elimina: elimina nella destinazione i file che non esistono più nell'origine, lasciando una copia esatta.
  • -n / –prova a secco: simula l'esecuzione senza toccare nulla, fantastico per non combinare pasticci.
  • –escludi / –escludi-da: consente di escludere modelli o un elenco completo di percorsi che non si desidera copiare.
  • –link-dest: crea collegamenti fisici con una copia precedente, alla base dei backup incrementali di tipo Time Machine.

Manuale, copie locali e primi esempi

Il primo passo prima di automatizzare qualsiasi cosa è avere comandi di copia manuale chiari e collaudatiAnalizziamo alcuni casi tipici che utilizzeremo in seguito negli script.

Se vuoi clonare la tua directory home in un disco di backup localeIl comando minimo sarebbe il seguente:

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

Questo rsync esegue la scansione del tuo pagina iniziale completa mantenendo permessi, date e strutturae copia solo ciò che manca o è cambiato dall'ultima volta, il che rappresenta già una copia incrementale molto ordinata senza complicare le cose.

Un altro esempio classico è la sincronizzazione dati, foto o documenti del progetto tra due cartelle sullo stesso server o anche su dischi diversi, per avere sempre una seconda partita locale aggiornata.

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

Quando si tratta di dati di sistema sensibili, come ad esempio /etc o /var/wwwÈ normale desiderare una copia che sia una replica esatta, eliminando dal backup ciò che scompare nell'originale. Ed è qui che entra in gioco la famosa opzione di eliminazione.

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

rsync linux

Backup remoti sicuri con SSH

Dove rsync dà il meglio di sé è quando lo si combina con Tramite SSH è possibile inviare copie dal server.In questo modo, puoi archiviare i tuoi dati su un altro nodo della tua rete, un NAS o un VPS su Internet. Così facendo, non dipendi da un singolo dispositivo e rispetti parte della famosa regola 3-2-1 (almeno una copia fuori sede).

Idealmente, sarebbe opportuno configurare l'autenticazione tramite chiave pubblica anziché inserire manualmente le password ogni volta. Una volta copiata la chiave sul server di backup, i comandi diventano molto intuitivi.

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

# Trasferimento dei dati da un server remoto alla macchina di backup
rsync -avz backup@remote-server:/var/www/ /backups/www/

In scenari leggermente più raffinati, è possibile regolare Crittografia SSH, porta o compressione È possibile utilizzare l'opzione -e di rsync stesso, ad esempio se il server è in ascolto su una porta diversa o se si desidera ottimizzare una connessione lenta.

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

Un trucco utile quando ci sono connessioni deboli o reti condivise è usare –bwlimit per evitare di sovraccaricare il collegamento e non lasciare nessuno senza internet mentre avvii un backup completo.

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

Backup completi, differenziali e incrementali con rsync

Sebbene rsync esegua già trasferimenti differenziali a livello di blocco, da una prospettiva di strategia di backup vale la pena considerare tre tipi di copie: completa, differenziale e incrementaleche puoi implementare direttamente con le opzioni di rsync.

Una copia completa è semplice: ricrea tutto il contenuto della sorgente nella destinazione, ideale come backup iniziale o per avere un riferimento pulito.

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

La copia differenziale si basa su queste fondamenta e si concentra sul mantenere la destinazione allineata con la sorgente, copiando le modifiche e rimuovendo ciò che non esiste più. È ciò che di solito si intende quando si parla di... avere uno specchio del sistema.

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

La parte più succosa è il backup incrementale "reale", in cui oltre alla sincronizzazione, È possibile salvare la cronologia per data senza duplicare i dati.È qui che entra in gioco l'opzione –link-dest, che crea collegamenti fisici a una copia precedente per i file che non sono stati modificati.

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

Con questo approccio, ogni cartella di backup appare come una copia completa, ma internamente I file identici condividono i blocchi sul discoCiò riduce notevolmente lo spazio utilizzato e consente una facile navigazione tra le istantanee storiche.

Backup in stile Time Machine con snapshot e collegamenti fisici

Molte persone vogliono replicare in Linux la comodità di Time Machine di macOS con le sue istantanee per dataCon rsync è perfettamente possibile combinando --link-dest, un po' di shell e un po' di organizzazione.

L'idea è di mantenere una directory corrente che punti all'ultimo backup valido e allo stesso tempo creare cartelle con data e ora che rappresentano ogni istantanea. I file non modificati sono collegati tramite hard link all'istantanea precedente e i nuovi blocchi vengono scritti solo quando ci sono differenze effettive.

Un comando tipico in questo schema potrebbe essere qualcosa del genere:

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

Successivamente, uno script si occupa di aggiornare il collegamento simbolico. corrente in modo che punti sempre all'istantanea più recentee per mantenere un piccolo archivio storico organizzato per data. In questo modo, è possibile sfogliare le copie più vecchie semplicemente accedendo alla cartella di interesse.

L'automazione viene naturale: si salva lo script in qualcosa come /usr/local/bin/rsync-time-machine e programmarne l'esecuzione giornaliera tramite cron all'orario che preferisci.

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

Automatizza i backup giornalieri con cron.

Arriva un punto in cui fare copie a mano non ha più senso; la cosa normale da fare è Pianifica i backup con cron in modo che vengano eseguiti automaticamente durante le ore non di punta (ad esempio, la mattina presto) e tu possa dimenticartene, limitandoti a controllare i registri di tanto in tanto.

La procedura è sempre la stessa: si prepara uno script che crea una copia completa con tutte le opzioni (esclusioni, log, ecc.), gli si assegnano i permessi di esecuzione e lo si inserisce nel crontab dell'utente appropriato o di root se si tratta di intervenire sull'intero sistema.

Un esempio di script semplice per la copia locale potrebbe essere:

#!/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 "Avviato il backup locale" >> "$LOG_FILE"

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

se ; allora
echo » Backup completato con successo» >> «$LOG_FILE»
altro
echo » Backup con errori» >> «$LOG_FILE»
fi

Una volta inserito lo script, ad esempio, /usr/local/bin/rsync-local-backup.sh Una volta contrassegnato come eseguibile, lo si aggiunge a cron in modo che venga eseguito a un orario specifico.

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

All'interno di crontab potresti inserire qualcosa del genere:

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

Timer di systemd: un'alternativa moderna a cron

Nei sistemi moderni spesso vale la pena Utilizza i timer di systemd al posto di cron.soprattutto se si desidera integrare meglio i servizi, gestire le dipendenze di rete o avere log centralizzati in journalctl.

L'idea è quella di definire un servizio che esegua lo script di backup e un timer che indichi quando eseguirlo. Il servizio potrebbe essere qualcosa del genere:


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

Tipo=oneshot
ExecStart=/usr/local/bin/rsync-remote-backup.sh
Utente=root
Output standard = journal
Errore standard=journal
TimeoutSec=7200

WantedBy = multi-user.target

E il timer associato verrebbe definito come segue, per un backup giornaliero alle 2 del mattino con un po' di casualità in modo da non sovraccaricare tutto in una volta:


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

OnCalendar=*-*-* 02:00:00
Persistente=vero
RandomizedDelaySec=10min

WantedBy=timers.target

Con ciò, non resta che ricaricare systemd, attivare il timer e verificare che venga programmato correttamente e che Il registro di servizio mostra che le copie vengono avviate quando è il momento.

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

Organizza backup a rotazione: giornalieri, settimanali e mensili.

Se desideri qualcosa di un po' più elaborato di una singola copia statica, puoi impostare una struttura di Backup a rotazione: giornalieri, settimanali e mensiliUtilizzare collegamenti fisici per risparmiare spazio e trovare per eliminare i file obsoleti.

Un modello classico prevede di avere una directory corrente che viene aggiornata ogni volta con rsync e quindi di clonare quella struttura ad albero con collegamenti fisici a cartelle giornaliere, settimanali e mensili a seconda del giorno.

#!/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=»$CORRENTE» \
«$SOURCE_DIR/» «$CURRENT/»

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

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

Con questo sistema hai una finestra storica abbastanza ragionevole senza riempire il disco con copie complete, e ogni snapshot rimane navigabile come una normale cartella.

Se i dati cambiano rapidamente o sono molto voluminosi, è possibile regolare i periodi di conservazione, le frequenze o persino combinare questa soluzione con gli snapshot LVM o ZFS per garantire la coerenza dei database o delle macchine virtuali.

Monitora, verifica e scopri se i tuoi backup sono utili.

Avere attività di backup in esecuzione quotidianamente è fantastico, ma se nessuno controlla il risultato Non ti sarà di grande aiuto. È importante impostare un monitoraggio di base per sapere se e quando è stato effettuato l'ultimo backup.

Una tattica semplice consiste nel lasciare un piccolo indicatore nella cartella di destinazione ogni volta che un backup viene completato con successo, ad esempio un file .last-backup-success con la data. In seguito, uno script esterno, o anche un controllo di Nagios/Icinga, può avvisarti se quel file è troppo vecchio.

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

Un'altra sana abitudine è controllare il Controlla i log di rsync per individuare errori o velocità di trasferimento insolite.Uno script che estrae statistiche come "Numero di file", "Dimensione totale", "Accelerazione" e simili ti fornisce una rapida panoramica dell'andamento del processo.

E, naturalmente, ciò che fa davvero la differenza è abituarsi di tanto in tanto. per fare un vero restauroPrendete un file specifico, ripristinate una versione di ieri o della settimana scorsa e verificate che si apra correttamente. Questo è l'unico modo per essere certi che, se un giorno qualcosa dovesse andare storto, i vostri backup saranno in grado di risolvere il problema.

Se consolidi tutti questi elementi—un rsync ben configurato, l'automazione con cron o systemd, una rotazione sensata, il monitoraggio e il test di ripristino—otterrai un sistema di backup Linux robusto, flessibile ed economicoche sfrutta appieno i vantaggi del software libero senza costringerti a rinunciare alla comodità o all'affidabilità.

Articolo correlato:
Guida completa per eseguire backup incrementali in Windows

Aggiungi come fonte preferita in Google