News Ticker

Rsnapshot: backup incrementale sincronizzato

rsnapshot Effettuare il backup di dati, siano questi parte di una rete e quindi condivisi, siano questi personali, è sempre un tema delicato ed importante. Molte volte però, il singolo backup non è sufficiente. In alcuni ambiti ci si può trovare nella condizione non solo di recuperare un dato corrotto o cancellato, ma di recuperarlo relativamente ad una precisa data. Nasce quindi l'esigenza di avere uno strumento che permetta di archiviare i dati organizzandoli in una forma incrementale e facilmente reperibile. Questo articolo spiega come utilizzare il software opensource rsnapshot per la schedulazione di backup incrementali realizzati attraverso l'utilizzo del software rsync ed il meccanismo degli snapshot.

Concetto di snapshot

Lo snapshot di un file rappresenta una versione dello stesso in un determinato tempo. Sostanzialmente, al file attuale corrispondono altre versioni associate a periodi ben definiti, che generalmente sono ore, giorni o mesi.
Attraverso lo snapshot è quindi possibile non solo recuperare un file danneggiato o addirittura cancellato (in questo caso senza una versione attuale), ma anche effettuare un confronto tra quello che è il file attuale ed una sua versione precedente.

Installazione di rsnapshot

rsnapshot è presente in tutte le maggiori distribuzioni, nel caso relativo a quest’articolo il sistema di riferimento è Debian Etch e l’installazione è effettuabile attraverso apt-get:

$ apt-get install rsnapshot
Lettura della lista dei pacchetti in corso... Fatto
Generazione dell'albero delle dipendenze in corso... Fatto
I seguenti pacchetti verranno inoltre installati:
  rsync
I seguenti pacchetti NUOVI (NEW) saranno installati:
  rsnapshot rsync
0 aggiornati, 2 installati, 0 da rimuovere e 1 non aggiornati.
E' necessario prendere 391kB di archivi. 
Dopo l'estrazione, verranno occupati 969kB di spazio su disco.
Continuare [S/n]? 
...
...

E’ da notare come l’installazione richieda come dipendenza rsync, software che in pochissime parole si occupa di sincronizzare una sorgente (sia essa un file, più file o una directory) con una destinazione.

Configurazione di rsnapshot

Le impostazioni di rsnapshot sono contenute nel file /etc/rsnapshot.conf, delle opzioni configurabili in esso contenute quelle che interessano per iniziare ad utilizzare il programma sono le seguenti:

snapshot_root	/backups/

snapshot_root indica dove risiederanno i backup archiviati, in questo caso la directory “/backups/”

backup	/etc/		localhost/

backup definisce di quali dati effettuare il backup (in questo caso /etc/) ed in quale sotto directory questi saranno posti (localhost/).
E’ da notare come al posto di “/etc/” possano essere anche passati indirizzi di tipo ssh (root@example.com:/etc/) e rsync (rsync://example.com/pub/).

interval	daily	7

interval definisce l’intervallo daily, al quale sono associate sette rotazioni. E’ da notare che il nome dell’intervallo definisce unicamente un identificativo arbitrario deciso dall’utente, e non vincola in alcuna maniera il funzionamento che è controllato unicamente dal numero di rotazioni.
Infatti alla configurazione di rsnapshot, coerentemente, andrà associata la configurazione del cron di sistema. Tale impostazione può essere abilitata de-commentando la riga relativa nel file /etc/cron.d/rsnapshot che è compilato con le impostazioni di default (tutte commentate):

# 0 */4		* * *		root	/usr/bin/rsnapshot hourly
30 3  	* * *		root	/usr/bin/rsnapshot daily
# 0  3  	* * 1		root	/usr/bin/rsnapshot weekly
# 30 2  	1 * *		root	/usr/bin/rsnapshot monthly

che prevede il lancio del comando rsnapshot con intervallo daily da parte dell’utente root alle 3:30 AM di OGNI giorno.

Come funziona rsnapshot

rsnapshot è configurato quindi per archiviare i dati nella cartella /backups/ al di sotto della quale vengono organizzati i dati relativamente agli intervalli definiti. Il meccanismo è piuttosto semplice e comprende l’impiego di tre componenti:

  1. il primo è il cron di sistema, attraverso il quale viene definito quando rsnapshot va lanciato,
  2. il secondo è rsync che è utilizzato da rsnapshot per effettuare il backup dei soli file modificati,
  3. il terzo è lo stesso rsnapshot che struttura le cartelle partendo dall’intervallo definito.

Dopo almeno una settimana (o comunque dopo almeno sette lanci manuali del comando) la cartella /backups/ avrà il seguente contenuto (ordinato cronologicamente):

$ ls -lrt /backups/
totale 28
drwxr-xr-x 3 root root 4096 2009-02-24 04:17 daily.6
drwxr-xr-x 3 root root 4096 2009-02-25 05:06 daily.5
drwxr-xr-x 3 root root 4096 2009-02-26 03:43 daily.4
drwxr-xr-x 3 root root 4096 2009-02-27 04:42 daily.3
drwxr-xr-x 3 root root 4096 2009-02-28 03:46 daily.2
drwxr-xr-x 3 root root 4096 2009-03-01 03:45 daily.1
drwxr-xr-x 3 root root 4096 2009-03-02 03:45 daily.0

All’interno della cartella “daily.0” ci sarà la copia attuale dei dati mentre nelle cartelle associate ai giorni precedenti ci saranno, se esistono, le versioni precedenti, altrimenti lo stesso identico file non avendo questo subito variazioni.
In sostanza ciascuna cartella rappresenta un intero snapshot del giorno.
Ecco qual’è la sequenza di operazioni eseguite da rsnapshot :

1
2
3
4
5
6
7
8
9
10
11
12
13
$ rsnapshot -v daily
echo 2614 > /var/run/rsnapshot.pid 
/bin/rm -rf /backups/daily.6/ 
mv /backups/daily.5/ /backups/daily.6/ 
mv /backups/daily.4/ /backups/daily.5/ 
mv /backups/daily.3/ /backups/daily.4/ 
mv /backups/daily.2/ /backups/daily.3/ 
mv /backups/daily.1/ /backups/daily.2/ 
/bin/cp -al /backups/daily.0 /backups/daily.1 
/usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded /etc 
    /backups/daily.0/localhost/ 
touch /backups/daily.0/ 
rm -f /var/run/rsnapshot.pid

La sequenza è piuttosto autoesplicativa:

  • linea 2: Viene settato il file relativo al pid del processo;
  • linea 3: Viene rimossa la directory più anziana che è daily.6;
  • linee 4-7: Vengono rinominate le altre directory in modo da ottenere la rotazione fino alla directory daily.2;
  • linea 8: La directory daily.0 viene copiata con le opzioni -al nella directory daily.1.
    Tali opzioni sono “-a” che consente di conservare nella copia tutto il possibile della struttura e degli attributi dei file originali (quindi permessi e proprietari) e “-l” che esegue collegamenti fisici (hard link) piuttosto che copie dei file. Entrambe le opzioni operano sui soli file, la struttura delle directory viene ricostruita tale e quale.
  • linea 9: Viene lanciato il comando rsync con sorgente la cartella originale /etc e destinazione la cartella /backups/daily.0
  • linea 10: Viene rimosso il file relativo al pid del processo;

La cosa interessante, che sta alla base del funzionamento di rsnapshot è il modo in cui le versioni vengono archiviate. Infatti la copia della directory daily.0 nella daily.1 avviene attraverso degli hard link, cioè file con lo stesso inode. Questo tipo di funzionamento favorisce l’ottimizzazione dello spazio su disco, archiviando di fatto per ogni directory, solo gli effettivi file variati.

Nota relativa agli hard link

Un hard link nel momento in cui è creato, è lo stesso file da cui deriva. Una modifica al link equivale ad una modifica sul file originale.
Un hard link è riconoscibile attraverso l’utilizzo dell’opzione “-l” del comando ls e fa riferimento alla seconda colonna del listato:

$ ls -l /backups/daily.0/localhost/etc/crontab 
-rw-r--r-- 7 root root 837 2009-02-04 12:59 /backups/daily.0/localhost/etc/crontab

l’output di “ls -l” indica come relativamente al file /backups/daily.0/localhost/etc/crontab esistano sette copie dello stesso (che fanno riferimento alle sette directory snapshot). Il valore di sette relativo a questo file indica oltretutto che negli ultimi sette giorni tale file non ha subito variazioni.

Conclusioni

rsnapshot è uno strumento di facile comprensione, rapido da installare e capire che può essere impiegato nei più svariati ambiti riguardanti i backup.
E’ facile capire come siano definibili tutta una serie di intervalli e schedulazioni per avere la gestione degli snapshot associata ad un numero sempre crescente di dati e situazioni.