Backup facili

con rsnapshot non avete più scuse

Fare i backup è un’attività complessa, lunga e noiosa. E fondamentale.
Rsnapshot è uno strumento semplice, ma efficace per tutte le esigenze!

Se solo avessi fatto un backup!” è una delle frasi che viene spontaneo pensare quando, disgraziatamente, perdiamo dei dati. Siano le foto delle vacanze al mare sul PC di casa o i dati di un’azienda, la mancanza di un backup ci costringe a dire addio ai nostri dati in maniera definitiva e, purtroppo, la maggior parte delle volte si pensa a quest’attività solo una volta che il danno è fatto.
Le motivazioni di un mancato backup, possono essere le più disparate: dal costo dei supporti su cui effettuarlo, a quello dei software per automatizzarlo, dallo spazio necessario per replicare i dati alla convinzione che “tanto a noi non può succedere”.
Una buona strategia di backup deve tener conto di una serie di fattori: supporti di destinazione affidabili (magari dislocati in un luogo diverso da quello dei dati originali), semplicità nell’effettuare il ripristino dei dati ed una frequente e veloce esecuzione.
Questo porta a pensare che mettere insieme tutte queste caratteristiche implichi la necessità di avere a disposizione software e hardware molto costosi e complessi da gestire, ma in realtà non è così! In questo articolo parleremo di rsnapshot, una soluzione semplice ed efficace.

rsnapshot

Rsnapshot è uno script Perl che permette di fare copie dei nostri dati in maniera intelligente, sfruttando contemporaneamente i risparmi di spazio offerti dall’utilizzo degli hard link (si veda il riquadro 1) su filesystem Linux e la velocità d’esecuzione offerta da rsync.
In sostanza, rsnapshot permette di creare una struttura di directory con all’interno una “fotografia” di tutti i nostri dati in un particolare momento. Ad esempio: supponiamo di voler fare un backup dei nostri dati contenuti nella directory src_dir/ con dentro file1, file2 e file3 rispettivamente di 1, 2 e 3 Mb, per un totale complessivo di 6 Mb. Inoltre immaginiamo di voler fare un backup completo tutti i giorni della settimana su un disco esterno, in cartelle separate, ad esempio una per ogni giorno. A fine settimana, in situazioni normali, avremo un peso totale di 42Mb (6 Mb x 7 giorni), mentre con rsnapshot possiamo ottenere lo stesso risultato occupando poco più degli originali 6 Mb! Dopo 7 giorni, infatti, la struttura che ci troveremo di fronte eseguendo il comando du –h all’interno della directory dest_dir/ sarà esattamente questa:

 [...]
12K ./daily.0
[...]
12K ./daily.1
[...]
12K ./daily.2
[...]
12K ./daily.3
[...]
5.9M ./daily.4
[...]
12K ./daily.5
[...]
12K ./daily.6
6.0M . 

Per evitare confusione, vi consiglio di pensare a daily.0/ come al “backup di 0 giorni fa” (cioè oggi), a daily.1/ come quello di “1 giorno fa” (cioè ieri) e così via.
Cosa è successo veramente? Le operazioni che esegue rsnapshot sono sempre le stesse tutti i giorni:

  • rimuove la directory di più vecchia (secondo il parametro di retention che vedremo più avanti come configurare), se esiste. Nel nostro esempio questa directory è daily.6/;
  • innesca un processo di rinomina delle directory che sposta tutte le directory indietro di un giorno: daily.5/ diventa daily.6/, daily.4/ diventa daily.5/ e così via fino a daily.1/ che diventa daily.2/;
  • a questo punto viene copiato il contenuto della directory daily.0/ in una nuova directory daily.1/ con il comando cp -al (hard link mode, cioè non copia realmente i file, ma crea degli hard link, operazione molto più rapida e con minimo consumo di spazio su disco);
  • viene utilizzato rsync per sincronizzare la src_dir/ con daily.0/ che quindi è aggiornata ad oggi.

Entriamo nel dettaglio e vediamo cosa accade passo per passo.

Giorno 1

La directory sorgente src_dir/ contiene i dati da archiviare e si trova in questa situazione:

 /src_dir # ls -lR
-rw-r--r-- 1 root root 1024000 Dec 10 17:09 file1
-rw-r--r-- 1 root root 2048000 Dec 13 14:58 file2
-rw-r--r-- 1 root root 3072000 Dec 10 17:12 file3 

La directory dest_dir/ dove invece andremo ad archiviare i nostri dati ovviamente è ancora vuota. Eseguiamo per la prima volta il comando rsnapshot daily ed andiamo a vedere come è cambiata la directory dest_dir/ con il comando ls -lRi (l’opzione –i ci permette di visualizzare l’inode del file, ci tornerà utile più avanti per capire cosa effettivamente stia succedendo):

 /dest_dir # ls -lRi
[...]
./daily.0/localhost/src_dir:
154614 -rw-r--r-- 1 root root 1024000 Dec 10 17:09 file1
154615 -rw-r--r-- 1 root root 2048000 Dec 13 14:58 file2
154616 -rw-r--r-- 1 root root 3072000 Dec 10 17:12 file3 

Come possiamo notare, la dimensione dei file sincronizzati è di 6 MB e tutto sembra andare bene. Verifichiamo ora il peso delle directory con il comando du, con l’opzione -l (conta anche il peso degli hard link) e senza.
Il risultato di du –slh è 5.9M e quello di du –sh (senza l’opzione -l) è perfettamente identico, 5.9M. In questa prima fase i risultati sono identici perché, essendo la prima volta che eseguiamo rsnapshot, tutti i dati presenti nella directory src_dir/ sono stati copiati nella nostra directory di destinazione.