Kosmous beyond the clouds: Sviluppo, Formazione e Consulenza Informatica

Backup e restore II

Questo secondo articolo sul backup, mostrerà i comandi presenti in un sistema Linux tipo che permettono di effettuare il backup dei dati, con il successivo ripristino.
Esistono sul mercato diverse applicazioni commerciali che fanno questo, offrendo una serie di opzioni e features molto interessanti, e spesso anche accattivanti (ma lente...) interfacce grafiche.
Sta inoltre rapidamente facendo proseliti un bel programma, AMANDA, rilasciato sotto licenza BSD, ricco di features (tra cui il backup via rete di server Microsoft), che utilizza i comandi standard di *nix.
Quest'articolo però non si occuperà minimamente di programmi commerciali (e per il momento neppure di Amanda), ma si concentrerà sui comandi presenti in ogni versione di *nix, con particolare attenzione a tar.
Con un terzo e conclusivo articolo verrà presentata e commentata la prima versione di uno script di shell per il backup e restore di dati, scritto dall'autore dell'articolo.


Il comando più semplice: cp

Il modo più semplice per fare il backup dei dati è copiarli in altra locazione, ad esempio in una partizione apposita, o in server dedicato.
Questo naturalmente è un sistema decisamente troppo semplice, e presenta diversi inconvenienti:
  1. implica ogni volta la copia di tutti i dati da salvare (backup completo)
  2. di conseguenza, non permette la realizzazione di strategie di backup
  3. non permette di conservare, assieme ai file, la struttura gerarchica delle directory: se intendo salvare la directory foo sotto /home/bar, conservando la posizione originale della directory, dovrò per forza di cose copiare tutta la struttura /home, o rassegnarmi ad avere solamente la directory bar, senza alcuna indicazione della struttura originaria delle directory
  4. non possiede meccanismi di controllo dei dati salvati
  5. non possiede la capacità di controllare la grandezza del media sul quale si sta effettuando la copia dei dati (se lo spazio è insufficiente, l'esecuzione della copia si blocca)
In effetti cp è un comando di copia di dati, non un comando di backup. Vediamo ora dei comandi più adatti.


Cpio

E' un comando piuttosto datato.
Possiede tre modalità operative:
  1. copia (creazione di un archivio): cpio -o
    in questa modalità, cpio copia files in un archivio. Legge una lista di files dallo e standard input (solitamente generata con find) e scrive l'archivio sullo standard output.
  2. estrazione (ripristino) di un archivio: cpio -i
    cpio copia (estrae) i file dall'archivio (o dagli archivi) o ne mostra il contenuto (opzione -t, o --list) sullo standard output
  3. copia ed estrazione (backup e ripristino): cpio -p
    combina le due modalità precedenti in una sola
Oltre a queste tre modalità operative, cpio possiede naturalmente diverse opzioni, che non tratteremo in dettaglio (per approfondimenti: man cpio).
Da ricordare soltanto che cpio supporta diversi formati di archivio:
dal formato binario (obsoleto) al formato tar di POSIX (dalla pagina man di cpio, l'elenco dei formati supportati: binary, old ASCII, new ASCII, crc, HPUX binary, HPUX old ASCII, old tar, and POSIX.1 tar).
Da ultimo, cpio posside una caratteristica fondamentale che lo accomuna agli altri programmi di backup (che invece cp non possiede): se i dati da salvare sono più grandi del media cui sono destinati, l'archivio viene automaticamente diviso in parti di grandezza massima pari alla capacità del supporto.


Dump

dump è un programma estremamente interessante, superiore per certi versi a tutti i programmi di backup che possiamo trovare su una macchina Linux ) c'è da dire che dump è un programma creato in maniera specifica per il backup, laddove tar e cpio sono invece più propriamente programmi di archiviazione).
Vediamolo un poco nel dettaglio (senza dimenticare comunque che l'articolo è incentrato su tar).
Innanzitutto la sintassi (presa da man dump, naturalmente):

dump [-0123456789ackMnqSu] [-A file] [-B records] [-b blocksize]
     [-d density] [-e inode numbers] [-E file] [-f file] [-F script]
     [-h level] [-I nr errors] [-j compression level] [-L label]
     [-Q file] [-s feet] [-T date] [-z compression level]
     files-to-dump

Tra le opzioni più interessanti, ricordiamo: la possibilità di escludere dal backup un inode (-e); la scelta del livello di compressione dell'archivio, sia usando le zlib che con le bzlib (opzioni -z e -j, come in tar).
Ma la feature più interessante di dump è la possibilità di specificare un livello di backup (cosa che con tar bisogna invece fare con appositi script di shell).
Che significano i livelli di backup? E' presto detto: indicano quali dati, tra quelli indicati, vanno effettivamente inseriti nel backup.
Un livello 0 indica un backup completo (full backup), mentre i livelli superiori indicano un backup incrementale: dump salva i dati creati o modificati dall'ultimo backup di livello inferiore (il livello di default è 9).
Indubbiamente molto utile (per maggiori dettagli, vedere la Guida del SysAdmin del ILDP).
Vedremo poi come implementare un backup incrementale (per quanto più semplice, con soli due livelli) con degli script di shell che usano tar.




Tar

E veniamo infine al principe dei comandi di backup in *nix.
Vediamo (man tar) la sintassi del comando:

tar  [ - ] A --catenate --concatenate | c --create | d --diff
	 --compare | r --append | t --list | u --update | x 
	 -extract --get [  --atime-pre- serve  ]  [  -b,  
	 --block-size  N  ] [  -B, --read-full-blocks ] [ -C, 
	 --directory DIR ] [ --checkpoint    ] [ -f, --file  
	 [NOME_HOST:]F  ]  [ --force-local    ]  [ -F, 
	 --info-script F --new-volume-script F ] [ -G, 
	 --incremental ] [ -g, --listed-incremental F ] [ -h, 
	 --dereference ]  [ -i,  --ignore-zeros ] 
	 [ --ignore-failed-read ] [ -k, 
	 --keep-old-files ] [ -K, --starting-file F ] [ -l, 
	 --one-file-system ] [ -L, --tape-length N  ]  [ -m, 
	 --modification-time ] [ -M, --multi-volume ] [ -N, 
	 --after-  date DATA, --newer DATA ] [ -o, --old-archive, 
	 --portability  ]  [  -O, --to-stdout  ] [ -p, 
	 --same-permissions, --preserve-permissions ] [ -P, 
	 --absolute-paths ] [  --preserve ]  [  -R,  
	 --record-number  ]  [ --remove-files  ] [ -s, 
	 --same-order, --preserve-order
	 ] [ --same-owner ] [ -S, --sparse ]
	 [ -T, --files-from F ] [ --null     ] [ --totals   ]
	 [  -v, --verbose ] [ -V, --label NAME ] [ --version  ]
	 [ -w, --interac- tive, --confirmation ] [ -W, --verify
	 ] [ --exclude  FILE  ]  [  -X, --exclude-from  FILE  ]
	 [ -Z, --compress, --uncompress ] [ -z, --gzip,
	 --ungzip      ] [ --use-compress-program PROG ] 
	 [ --block-compress ]  [
	 -[0-7][lmh]     ]
	   
	 nomefile1 [ nomefile2, ... nomefileN ]
	   
	 directory1 [ directory2, ...directoryN ]

Un discreto numero di opzioni, senza dubbio...
Tar richiede obbligatoriamente l'indicazione, come primo argomento, del tipo di operazione da compiere sull'archivio:
  1. creazione di un archivio o aggiunta di file ad un archivio esistente, cancellazione dei file (backup: opzioni -c, -A, --delete, -r, -u)
  2. lista dei file in archivio e confronto tra file in archivio e file originale (verifica del backup" opzioni -t, -d)
  3. estrazione di file dall'archivio (ripristino: opzione -x)
L'ultimo argomento di tar deve invece essere la lista dei file e/o directory da salvare in archivio.
L'archivio può essere scritto direttamente su un supporto da backup (nastro, floppy, cd o altro), e tar stesso si occuperà di dividere l'archivio in parti di grandezza non superiore alla capacità del supporto, oppure su filesystem. L'archivo può essere compresso sia usando le zlib (opzione -z), sia con le più moderne bzlib (opzione -j, mi pare non documentata nella man ma solo nella pagina info). C'è, volendo, anche il vecchio compress...(opzione -Z).
Vediamo quindi qualche esempio:
1. creazione di una copia di backup completo della directory /home; l'archivio è compresso con gzip (il -v serve perchè tar mostri a video le operazioni che compie
# tar cvzf home20030908.tgz /home

2. verifica dell'archivio
# tar tf home20030908.tgz

3. estrazione dell'archivio appena creato
# tar xvzf home20030908.tgz

3. creazione di un backup incrementale (solo i file salvati dalla data dell'ultimo backup): la data va indicata nel formato americano - AAAA-MM-GG HH:MM:SS.
# tar cvzf home20030909.tgz --newer 'data_ultimo_backup' /home
L'articolo per ora si conclude qua.
Nei prossimi giorni verrà pubblicata la terza ed ultima puntata di questa serie di articoli, contenente il sorgente di uno script che implementa alcune delle tecniche di backup qui descritte, e che usa il comando tar.
Lo script è ancora in una versione alpha, e verrà sviluppato progressivamente.
Vi invitiamo ad inviarci commenti, eventuali segnalazioni di errore e quant'altro.
Commenti (0)2003-10-07