Backup con rsync e git

Scritto da Federico E. Galli

Abbiamo la necessità di eseguire il backup tra due server e desideriamo ottenere un backup ad alte prestazioni senza utilizzare strumenti complicati? Una combinazione di rsync e git può essere la soluzione!

Metodo 1: Veloce per chi vuole tutto e subito

Identifichiamo la macchina da backuppare come macchina remota, la macchina che riceverà il backup come macchina locale e assicuriamoci di aver installato su entrambe rsync e sulla locale git.
Salviamo il seguente script configurando le directory sorgente e destinazione ed eseguiamo!

#!/bin/bash

SCRIPT=`readlink -f $0`
BASEDIR=$(dirname $SCRIPT)
cd $BASEDIR

rsync -az --delete -e ssh rsync@remote.com:/dir/to/backup/ /local/copy
# Add as many directory as you wish.
# rsync -az --delete -e ssh rsync@remote.com:/other/dir/ /other/local/dir

if [ ! -d ".git" ]; then
  git init .
fi

git add -A
git commit -m "`date --rfc-3339=seconds`"
git gc

Git viene automaticamente inizializzato e si preoccupa di mantere la storia degli aggiornamenti. È possibile inserire diverse chiamate a rsync per recuperare tutte le directory da inserire nel backup. Per automatizzare basta poi aggiungere il tutto agli script di cron.

Non sai come utilizzare git? Scorri l'articolo e leggi il terzo capitolo!

Metodo 2: Client-Server over VPN (dettagliato e raffinato)

Rsync è un pacchetto disponibile per tutte le distribuzioni linux e ne esiste anche un port per Windows, scaricabile direttamente dal sito di rsync.

Rsync a differenza di scp trasferisce solo i byte che sono cambiati dall'ultimo trasferimento; inoltre ha la possibilità di rimuovere i file che sono scomparsi dall'host sorgente. Può essere utilizzato anche senza trasporto scp/ssh, come demone sulla porta TCP 873: è interessante per l'utilizzo attraverso VPN

Supponiamo di avere già due macchine (macchina sorgente di backup e macchina ricevente) collegate in vpn tra loro e non voler quindi incapsulare il traffico ssh dentro la vpn al fine di mantenere alte le prestazioni.
Vogliamo quindi strutturare al meglio le directory del nostro backup per poterle agilmente copiare via rsync.

Sulla macchina remota (quella di cui vogliamo effettuare il backup) creiamo un file di configurazione rsyncd.conf sotto /etc

#/etc/rsyncd.conf
motd file = /etc/rsyncd.motd
read only = yes
list = yes
uid = nobody
gid = nobody

[intranet-users]
comment = homes directories
path = /home/intranet

[conf]
comment = etc directory
path = /etc

avendo cura di scegliere UID e GID abilitati alla lettura dei contenuti che vogliamo trasferire.
Rsync è prodotto dagli stessi autori di samba e quindi la struttura dei file di configurazione è identica. Nel nostro esempio abbiamo definito due semplici condivisioni che intendiamo replicare (da sostituire, nel reale, con le directory di cui si intende fare il backup!)
Avviamo quindi il demone rsyncd sulla macchina remota tramite

rsyncd --daemon
#oppure, a seconda della distribuzione
/etc/init.d/rsync

(su distribuzioni basate su debian potrebbe essere necessario decommentare una riga di avviamento nel file /etc/default/rsync)

Se volessimo provare se fino a qui tutto funziona...

rsync -avz rsync@remote.host.com::intranet-users /home/rsync/intranet
dovremmo trovare in /home/rsync/intranet il contenuto della dir indicata in [intranet-users] sotto rsyncd.conf

Sulla macchina locale, quella che riceverà i backup, creiamo la directory backup, ad esempio /home/backup e creamo all'interno il file rsync.sh che si preoccuperà effettivamente di eseguire la copia dei file via rsync e di gestire i cambiamenti nel tempo grazie a git.

#!/bin/bash

SCRIPT=`readlink -f $0`
BASEDIR=$(dirname $SCRIPT)
cd $BASEDIR

rsync -az --delete rsync@remote.host.com::etc etc/
rsync -az --delete rsync@remote.host.com::intranet-users intranet/

if [ ! -d ".git" ]; then
  git init .
fi

git add -A
git commit -m "`date --rfc-3339=seconds`"
git gc

le righe di rsync indicano di copiare i file dai punti prima definiti, mentre git init si preoccupa di inizializzare la directory destinazione con git se non lo si è mai fatto prima. Infine, git add -A aggiunge e rimuove i file modificati dall'ultimo rsync e tramite git commit finalizziamo le modifiche salvando la data.


Come tocco finale linkiamo ad esempio sotto /etc/cron.daily (ln -s /home/backup/rsync.sh /etc/cron.daily/rsync) il nostro rsync.sh per iniziare ad eseguire i nostri backup con profitto!

Uso di GIT:

Ora che il nostro sistema di backup è attivo vediamo come usare git per visualizzare quando i file sono stati modificati o visualizzare i dati così com'erano in precedenza.

Se siamo digiuni di git il modo più sempice è utilizzare un programma che ci permetta di navigare all'interno della storia di git: alcune alternative sono gitg per sistemi GNU/Linux, GitX per Mac OS e Git Extensions per MS Windows.

Se preferite invece la riga di comando o sapete già usare git, ricordo di seguito alcuni comandi utili

git log --oneline path/to/file  # mostra quando ci sono state modifiche a un filegit show <rev>:./path/to/file # mostra com'era un file ad una certa revisione (il checksum che abbiamo visto con git log)

e se volessimo ritornare indietro nel tempo con l'intera directory (se non vi sentite confidenti nell'uso di git fatelo su una copia del backup, e in qualunque caso ricordate di segnarvi l'ultima revisione ottenuta con "git log HEAD | head -n 1")

git reset --hard <rev>  # dove rev è un qualche punto nel tempo individuato sempre con git log

per riportare tutto al presente rieseguite lo stesso comando con la revisione salvata in precedenza.

blog comments powered by Disqus