Kosmous beyond the clouds: Sviluppo, Formazione e Consulenza Informatica

Backup e restore III

Ed eccoci al terzo ed ultimo articolo della serie dedicata al backup.
In questa scritto verra' presentato e commentato, in alcuni suoi passaggi, uno script Bash che implementa delle semplici operazioni di backup.
Lo script in questione ha uno scopo essenzialmente didattico, ed e' in una versione che potremmo definire "pre-alpha".
E' prevista la possibilita', per ora, di fare un backup completo, differenziale o incrementale, ma non di operare il ripristino.
Non e' stata implementata inoltre nessuna specifica gestione degli errori.
Ripeto: lo script viene pubblicato ora soltanto a corredo degli articoli, per cui non ha pretese particolari.
In seguito verra' comunque modificato, sino a diventare uno strumento realmente utilizzabile.

Ma vediamone brevemente alcuni dettagli.
Lo script ha una sintassi piuttosto semplice:
backup.sh -t [ -o ] [ -p prefisso ] filesystem
dove
  1. -t indica la tipologia del backup (completo, incrementale, differenziale (obbligatorio)
  2. -o indica la directory di destinazione, dove sara' creato il file di backup (opzionale: default /tmp)
  3. -p indica il prefisso da usare per i nomi dei file creati (opzionale: default "backup")
  4. filesystem indica il file | directory | filesystem di cui fare la copia (obbligatorio)
La parte principale dello script, dopo aver settato alcune variabili su valori di default, recupera i parametri passati, effettua una serie di semplici controlli (sul numero dei parametri e sull'esistenza, e relativi permessi, delle directory di origine e destinazione) e infine chiama la funzione relativa alla tipologia di backup prescelta (righe 74 - 118).

La parte iniziale dello script raccoglie una serie di funzioni molto semplici, che fanno l'effettivo lavoro di creazione del file di backup.
Le tre funzioni hanno un nome simile, formato dal prefisso "backup_", seguito dal nome inglese della tipologia di backup che effettuano.
Vediamole in maggior dettaglio:
18.	function full_backup(){
19.	  local source_dir=$1
20.	  local dest_dir=$2
21.	  local data=$( /bin/date '+%d-%m-%Y' )
22.	  cd $source_dir
23.	  /bin/tar czf $dest_dir/${PREFIX}_full-$data.tgz .
24.	  return
25.	}

Effettua il backup di tipo completo. Richiede due parametri: la directory-file-filesystem di cui fare la copia, e la directory dove effettuare tale copia.
Si limita a creare un file d'archivio compresso nella directory $dest_dir: il nome del file e' datto dalla stringa ${PREFIX}_full, seguita dalla data in formato italiano. Tutto molto semplice.

30.	function differential_backup(){
31.	  # recupero data e ora dell'ultimo backup completo
32.	  local dt=$( /bin/ls -lr --sort=time $DEST_DIR |
	  /bin/grep "${PREFIX}_full*" | awk -F" " 
	  '{ print $6." "$7." "$8.":00" }' | /usr/bin/head -1 )
33.	  get_month $( echo $dt | awk -F" " '{print $2}' )
34.	  local last="$( /bin/date +'%Y')-$mese-$( echo $dt |
	  awk -F" " '{print $1}') 
	  $( echo $dt | awk -F" " '{print $3}')"
35.	  cd $BACK_DIR
36.	  /bin/tar czf ${DEST_DIR}${PREFIX}-$( date +'%A' ).tgz
	  --newer "$last" .
37.	  exit
38.	}

Funzione piu' lunga ma solo apparentemente piu' complessa della precedente. La differenza principale e' data dalla necessita' di recuperare la data dell'ultimo backup di tipo completo, prima di procedere alla copia.
Viene quindi recuperata tale data (riga 32) con una istruzione piu' lunga che complessa, quindi si ottiene il valore numerico del mese tramite la chiamata ad una funzione apposita (riga 33: get_mont() definita alle righe 53 - 67) e si compone la stringa contenente la data dell'ultimo backup full.




Infine, tale stringa viene passata come parametro all'opzione --newer di tar, che crea cosi' un file contenente solamente i file modificati da tale data.

43.	function incremental_backup(){
44.	  # recupero data e ora dell'ultimo backup 
	  completo o incrementale)
45.	  local dt=$( /bin/ls -lr --sort=time $DEST_DIR |
	  /bin/grep "${PREFIX}*" | 
	  awk -F" " '{ print $6." "$7." "$8.":00" }' | 
	  /usr/bin/head -1 )
46.	  get_month $( echo $dt | awk -F" " '{print $2}' )
47.	  local last="$( /bin/date +'%Y')-$mese-$( echo $dt |
	  awk -F" " '{print $1}') 
	  $( echo $dt | awk -F" " '{print $3}')"
48.	  cd $BACK_DIR
49.	  /bin/tar czf ${DEST_DIR}${PREFIX}-$( date +'%A' ).tgz
	  --newer "$last" .
50.	  exit
51.	}

E' identica alla precedente: la sola differenza e' costituita dalla data di riferimento passata all'opzione --newer di tar, che in questo caso e' la data dell'ultimo backup di tipo completo o incrementale disponibile.

Come si e' visto, lo script e' piuttosto semplice, e facilmente migliorabile con:
  1. gestione degli errori (anche solo nei parametri passati)
  2. possibilita' di effettuare il ripristino
  3. possibilita' di indicare piu' percorsi contemporanei da salvare

Tutte queste cose, e diverse altre, sono gia' previste per le prossime versioni dello script. Tornate a visitarci, quindi.
Vi invitiamo ad inviarci commenti, eventuali segnalazioni di errore e quant'altro.
Commenti (0)2003-10-07