Il Backup perfetto con Linux

Il backup in ambiente Linux è una di quelle procedure che va impostata bene una sola volta, per poi dimenticarsene completamente. Trovo molto utile la guida scritta da Saverio Bolognani che spiega dettagliatamente come implementare il “Backup Perfetto” in ambienti Linux. Ovviamente la procedura quì descritta può essere applicata anche sui sistemi Ubuntu Linux.

Penso che il backup perfetto (in qualsiasi sistema operativo) debba soddisfare i seguenti requisiti.

Completamente automatico

L’utente non deve fare nulla dopo aver configurato il suo sistema di backup la prima volta. Il tutto deve essere automatico da quel momento in poi. Altrimenti la “qualità” del backup dipenderebbe dall’attenzione dell’utente e dalla sua scrupolosità, il che non è accettabile.

Separazione fisica dei supporti

Il backup deve essere contenuto in un supporto fisico che sia completamente separato e distante dal supporto sul quale sono memorizzati i dati originali. Il significato di “separato e distante” dipende dal livello di affidabilità che si richiede:

  • vuoi essere al sicuro nel caso di cancellazioni accidentali di file? allora una cartella separata o meglio ancora una partizione dedicata sul tuo hard disk è sufficiente
  • vuoi essere al sicuro nel caso di malfunzionamenti dell’hardware? allora hai bisogno almeno di un disco fisso separato per il tuo backup
  • vuoi essere al sicuro nel caso di malfunzionamenti del sistema nel suo complesso (tipo scarica elettrica) o anche nel caso di furti? allora un hard disk esterno è la scelta migliore (soluzione consigliata)
  • tenete presente che avere un computer e il backup su un hard disk esterno non è abbastanza per essere sicuri nel caso in cui, ad esempio, dei ladri entrano in casa oppure nel caso di eventi quali alluvioni o incendi. Per questo potreste voler tenere il backup in un altro edificio, per esempio al lavoro e non a casa.
  • volete addirittura essere sicuri anche nel caso di eventi geograficamente localizzati (grandi alluvioni, terremoti, guerra)? Le banche ad esempio lo vogliono. In questo caso dovete fare il backup in qualche altra parte del mondo, ad esempio su un server remoto in un altro paese.

Potreste pensare che tutto ciò sia oltre le vostre necessità, ed effettivamente a voi basterà un hard diskesterno sulla vostra scrivania. In ogni caso dipende dall’importanza dei vostri dati: non vorreste mai perdere la tesi di dottorato che avevate praticamente finito solo perché dei ladri sono entrati in casa vostra e hanno portato via sia il notebook che l’hard disk esterno…

Recupero dei file semplice

Recuperare i file di cui avete fatto il backup deve essere facilissimo! In particolare dovete avere la possibilità di recuperare anche solo alcuni dei vostri file, oppure di recuperare tutto in un colpo solo.

Inoltre, non deve essere necessario alcun software per poter ripristinare i propri file! Non è accettabile che il proprio backup dipenda da una certa software house, o scoprire che il proprio backup vecchio di 5 anni non è più recuperabile perché il software che avete usato non esiste per la nuova versione del sistema operativo (chiedete agli utenti di Win98 se riescono ad accedere ai backup che hanno fatto in quegli anni con il tool di backup ufficiale della Microsoft, quello incluso tra gli Accessori del computer…).

Backup con rsync

Lo strumento principale con il quale si riesce a fare quello che secondo me è il backup perfetto è RSync, un programma open source che permette di fare trasferimento incrementale e rapido di files. La ragione per la quale questa utility è così importante è perché permette di copiare il contenuto di una serie di cartelle in un’altra posizione trasferendo in realtà solo i file che sono cambiati dall’ultima “sincronizzazione”.

C’è un bell’articolo che spiega come utilizzare questo programma per eseguire il backup dei propri files. L’idea principale è quella di fare regolarmente delle copie di tutti i propri dati sul supporto di backup. Rsync rende questa cosa veloce proprio per le caratteristiche che ho appena esposto.

In realtà si può fare anche di meglio: si possono tenere delle “fotografie”, degli “snapshots” dei propri dati, per esempio ogni settimana, così non solo si ha un backup dei propri files, ma si hanno a disposizioni le versioni precedenti.

Si potrebbe pensare che conservare una serie di backup settimanali sia molto oneroso in termini di spazio, ma non è vero! Sfruttando gli hard link del filesystem Ext3, ci sarà bisogno solo dello spazio necessario a memorizzare i file che sono cambiati da uno snapshot al successivo. E il backup che si ottiene è semplicemente una serie di cartelle, contenenti tutti i propri dati “fotografati” in momenti diversi del passato. Gli hard link sono completamente “trasparenti” all’utente, cioè non c’è modo per accorgersi che si tratta di hard links e non di copie aggiuntive degli stessi file.

Tutte queste cose sono fatte in automatico ed in modo efficiente da un bellissimo programmino opensource: rsnapshot.

Rsnapshot

Rnapshot è un programma opensource che implementa quello che secondo me è il “backup perfetto”. Quello che fa è di fare degli “snapshot” dei propri file alla frequenza desiderata (ad esempio ogni settimana). Poi queste copie vengono immagazzinate da rsnapshot sul proprio supporto di backup in modo veloce ed efficiente grazie a rsync.

Tutti gli snapshot acquisiti nel passato sono quindi accessibili come normalissime cartelle, anche se in realtà non occupano lo spazio di una serie di copie quasi uguali – solo le differenze sono effettivamente memorizzate.

In più, si può risparmiare ancora più spazio diradando la frequenza dei backup nel passato. Per esempio si possono fare snapshot settimanali, salvare gli ultimi 4, e poi tenere uno snapshot per mese per i backup più vecchi di 4 settimane. La rotazione di queste immagini è fatta automaticamente.

Un’altra caratteristica importante è che si può fare il backup non solo delle proprie cartelle sul disco fisso, ma anche di cartelle condivise (anche su un PC windows), cartelle remote (SSH, FTP, …), ecc.

Ultimo ma non meno importante, per accedere ai propri backup basta avere un computer che riesca a leggere il filesystem Ext3, cioè praticamente ogni computer Linux, ma anche ogni computer Windows se si installa un piccolo driver, completamente gratuito.

L’unica cosa che richiede un attimo di tempo è configurare rsnapshot la prima volta. C’è un sacco di documentazione online sul sito ufficiale, anche un HOW TO con istruzioni passo passo, insieme a un sacco di guide non ufficiali in giro per internet. Qui semplicemente vi descrivo la mia configurazione, così chi vuole può usarla e adattarla alle proprie necessità. Per informazione, io uso ubuntu, ma tutti i passaggi che spiego dovrebbero funzionare per praticamente ogni distribuzione Linux.

Il file di configurazione più importante per rsnapshot (l’unico) è /etc/rsnapshot.com. È pieno di commenti dettagliati, quindi non dovreste avere problemi a configurarlo semplicemente scorrendolo e leggendo i commenti delle varie sezioni (una volta che avete letto la brevissima guida sul sito ufficiale). Qui riporto solo le sezioni che ho modificato per le mie esigenze specifiche.

Per chi non mastica l’inglese ho tradotto velocemente i commenti.

Snapshot root directory

# All snapshots will be stored under this root directory.
# Tutti gli snapshot vengono salvati in questa cartella.

snapshot_root /media/LACIE_ext3/

If no_create_root is enabled, rsnapshot will not automatically create the snapshot_root directory. This is particularly useful if you are backing up to removable media, such as a FireWire or USB drive.
Se no_create_root è settato a 1, rsnapshot non creerà automaticamente la cartella snapshot_root. Ciò è particolarmente utile per fare backup su supporti rimovibili, come hard disk USB o FireWire.

no_create_root 1

Il significato di queste opzioni è banale, e ben spiegato dai commenti. /media/LACIE_ext3 è la mia partizione Ext3 su un hard disk esterno LaCie.

External program dependencies

In questa sezione non ho modificato nulla.

Backup intervals

The interval names (hourly, daily, …) are just names and have no influence on the length of the interval. The numbers set the number of snapshots to keep for each interval (hourly.0, hourly.1, …).
The length of the interval is set by the time between two executions of rsnapshot <interval name>, this is normally done via cron.
Feel free to adapt the names, and the sample cron file under /etc/cron.d/rsnapshot to your needs. The only requirement is that the intervals must be listed in ascending order.
I nomi degli intervalli (weekly = settimanale, monthly = mensile, …) sono solo nomi e non hanno nessun effetto sulla reale lunghezza dell’intervallo. I numeri impostano il numero di snapshot da conservare per ogni intervallo (weekly.0, weekly.1, …).
La lunghezza dell’intervallo viene impostato dall’intervallo temporale tra due esecuzioni di rsnapshot <nome intervallo>, generalmente tramite cron. Sentitevi liberi di adattare i nomi degli intervalli, e di conseguenza il file /etc/cron.d/rsnapshot secondo le vostre esigenze.
L’unica vincolo è che gli intervalli devono essere elencati in ordine ascendente.

interval weekly 4
interval monthly 36

Quest sezione configure la struttura dei backup nel tempo. Nel mio caso ho decido di conservare 4 backup nel passato, distanziati di una settimana (quindi che coprono l’ultimo mese). Quando i backup sono più vecchi di un mese, viene conservato solo un backup al mese. Per esempio se guardo i miei backup oggi che è il 10 Febbraio 2008, appaiono così:

drwxr-xr-x 3 root root 4096 2008-02-03 11:03 weekly.0
drwxr-xr-x 3 root root 4096 2008-02-03 10:05 weekly.1
drwxr-xr-x 3 root root 4096 2008-01-28 21:04 weekly.2
drwxr-xr-x 3 root root 4096 2008-01-27 00:04 weekly.3
drwxr-xr-x 3 root root 4096 2008-01-22 20:18 monthly.0
drwxr-xr-x 3 root root 4096 2008-01-06 13:04 monthly.1
drwxr-xr-x 3 root root 4096 2007-12-07 16:03 monthly.2
drwxr-xr-x 3 root root 4096 2007-11-05 15:04 monthly.3
drwxr-xr-x 3 root root 4096 2007-10-29 10:04 monthly.4
drwxr-xr-x 3 root root 4096 2007-10-08 20:04 monthly.5
drwxr-xr-x 3 root root 4096 2007-09-02 10:03 monthly.6
drwxr-xr-x 3 root root 4096 2007-08-05 17:34 monthly.7

Fate attenzione che i nomi che assegnate ad ogni backup non hanno nessuna conseguenza sulla frequenza del backup! Servono solo all’utente come etichette. La reale frequenza dei backup dipende da come viene chiamata l’utility rsnapshot (vedi sotto).

L’unico effetto di queste righe di setup è quindi fare in modo che quando l’utente esegue
rsnapshot weekly
allora rsnapshot fa ruotare tutti i backup settimanali (weekly), cancellando l’ultimo (weekly.3), e rinominando gli altri (weekly.1 diventa weekly.2 e così via) e ovviamente creando un nuovo weekly.0 con il backup di oggi. Quando invece viene eseguito
rsnapshot monthly
allora rsnapshot rinomina tutti i backup mensili (monthly) (monthly.1 diventa monthly.2 e così via) e rinomina l’ultimo backup settimanale (weekly.3) in monthly.0.

Global options

Anche qui non ho cambiato nulla.

Backup points / scripts

# LOCALHOST
backup /home/saverio/ localhost/
backup /etc/ localhost/

In questa sezione specificate di quali cartelle volete fare il backup (nel mio caso solo la home directory e /etc. Il secondo argomento di ogni riga specifica sotto quale cartella vanno salvate le copie sul supporto di backup. Attenzione alle barre (/) alla fine dei percorsi!

Pianificare i backup

Il passo successivo consiste nel pianificare l’esecuzione dell’utility di backup. In Linux i comandi pianificati vengono gestiti da alcuni demoni (daemons, cioè programmi che girano in background). Io ho utilizzato cron, disponibile in Ubuntu e in moltissime altre distribuzioni. Sotto la cartella /etc ci sono una serie di sottocartelle per configurare cron:

/etc/cron.d
contiene una serie di file, uno per ogni comando pianificato
/etc/cron.daily
contiene una serie di eseguibili che vanno lanciati ogni giorno
/etc/cron.weekly
contiene una serie di eseguibili che vanno lanciati ogni settimana

e così via. La soluzione che ho scelto è quella di aggiungere un file nella cartella cron.d. Il file si chiama /etc/cron.d/rsnapshot e contiene solamente la riga:

3 * * * * root /usr/bin/nice /home/saverio/bin/rsnapshot_script

che, secondo lo standard crontab, significa che il comando rsnapshot_weekly deve essere eseguito ogni ora, quando i minuti valgono 03 (cioè alle 9.03, 10.03, 11.03, etc…). Il comando viene eseguito con privilegi di superutente (root) e in background (vedi “man nice”).

Diamo quindi un’occhiata al comando rsnapshot_weekly nella mia cartella /home/saverio/bin. È un piccolo script che ho scritto:

#! /bin/bash

# Esegue lo script di backup ogni Domenica se una Domenica è passata senza che il backup sia stato eseguito.
# Ogni mese esegue anche il backup mensile.

una_settimana=7
un_mese=31

timestamp_file_weekly=/home/saverio/.backup_timestamp_weekly
log_file=/home/saverio/.backup.log

date_di_oggi=`date “+%Y%m%d”`
giorno_della_settimana=`date “+%u”`
ora_attuale=`date “+%s”`

date >> $log_file

if [ -e $timestamp_file_weekly ]; then
date_del_backup=`stat –format=%y $timestamp_file_weekly |
… tr -d – | awk ‘{print $1}’`
ora_del_backup=`stat –format=%Y $timestamp_file_weekly`
echo Ultimo backup settimanale $data_del_backup >> $log_file
if (( $giorno_della_settimana % 7 >= $ora_attuale / 86400 –
…$ora_del_backup / 86400 )); then
echo “non sono passate Domeniche senza fare il backup, non
…faccio niente” >> $log_file
exit 0;
fi
echo “una Domenica e passata senza fare il backup: lo faccio ora!”
…>> $log_file
if (( $data_di_oggi – $data_del_backup >= $un_mese )); then
echo “e cominciato un nuovo mese: faccio il backup mensile” >>
…$log_file
/usr/bin/rsnapshot monthly && echo “backup mensile: FATTO!” >>
…$log_file
fi
fi

echo “facciamo un backup settimanale” >> $log_file
date > /home/saverio/.today

/usr/bin/rsnapshot weekly && touch $timestamp_file_weekly && echo
…”backup settimanale: FATTO!” >> $log_file

Ho aggiunto i puntini quando la riga viene spezzata, quindi non fate copia e incolla perché non funzionerebbe. Potete scaricare lo script rsnapshot_script cliccando sul link.

Quello che fa lo script, per chi non ha voglia di guardarne i dettagli, è di eseguire il backup settimanale ogni Domenica. Gestisce correttamente tutti i casi in cui, per esempio, l’hard disk esterno non è collegato al portatile. Inoltre, prevede la possibilità che una Domenica l’utente non accenda il PC, oppure non colleghi l’hard disk esterno. In questo caso lo script farà il backup non appena trova l’hard disk collegato nei giorni immediatamente successivi.

Esegue anche il backup mensile (che non è un backup, è solo la rotazione dei vecchi backup) la prima Domenica del mese.

Non dovete leggervi tutto lo script, l’unica cosa che dovete sapere è che ci sono due opzioni: timestamp_file_weekly che è un file vuoto che serve solo per tener traccia dell’ultimo backup. Potete creare questo file vuoto semplicemente eseguendo
touch timestamp_filename
Il secondo parametro che va impostato è il percorso per il log_file, che è il file dove verrà mantenuto il log di tutto quello che viene fatto (vedi sotto).

Log

Lo script che ho scritto tiene automaticamente un log di tutto quello che fa, per controllarne l’operato e per eventuale debugging. Questo è un esempio del log file sul mio PC (è in inglese perché lo script è in inglese):

Sat Feb 2 23:03:01 CET 2008
Ultimo backup settimanale 20080128
Non sono passate Domeniche senza backup, non faccio nulla
Sun Feb 3 10:03:01 CET 2008
Ultimo backup settimanale 20080128
una Domenica e passata senza fare il backup!
E cominciato un nuovo mese: ora di fare il backup mensile
facciamo un backup settimanale
Sun Feb 3 11:03:01 CET 2008
Ultimo backup settimanale 20080128
una Domenica e passata senza fare il backup!
E cominciato un nuovo mese: ora di fare il backup mensile
backup mensile: FATTO!
facciamo un backup settimanale
backup settimanale: FATTO!
Sun Feb 3 12:03:01 CET 2008
Ultimo backup settimanale 20080203
Non sono passate Domeniche senza backup, non faccio nulla

Ogni voce comincia con data e orario, e si può vedere come i backup vengono fatti correttamente. Poiché il file di log cresce continuamente (ma lentamente, visto che è solo testo), bisogna gestire la cosa. Il modo più facile è quello di usare logrotate, che è già disponibile su Ubuntu e su molte altre distribuzioni. In pratica è un programmino che viene eseguito periodicamente e comprime i file di log, mantenendoli piccoli in dimensione e cancellandoli quando sono vecchi. Tutto quello che dovete fare per dire a logrotate di occuparsi del vostro log è creare il file /etc/logrotate.d/backup con le seguenti righe

/home/saverio/.backup.log {
rotate 6
monthly
compress
missingok
}

che dice a logrotate di “ruotare” i log mensilmente, tenendone solo gli ultimi 6 e comprimendo con gzip. Non vengono dati errori se un file di log manca, ad esempio perché lo cancellate a mano.