Capitolo successivo Capitolo precedente Indice

73. Copie di sicurezza

L'amministrazione di un sistema Unix è da sempre un grosso problema sotto tutti i punti di vista. Il primo tra tutti è quello della salvaguardia dei dati e, al rischio della loro perdita, si pone rimedio solo attraverso una corretta gestione delle copie di sicurezza.

73.1 Scelta del sistema di copia

Gli strumenti a disposizione per eseguire copie di sicurezza sono molti e si possono distinguere due estremi possibili:

La copia di una partizione o di un disco può avere il vantaggio di permettere l'archiviazione della situazione esatta in cui si trova, problemi inclusi. Inoltre, non avendo un processo di lettura sui file, la data di lettura di questi non viene modificata. Lo svantaggio fondamentale di questo tipo di copia è che questa è riferita a un particolare disco (o a una particolare partizione di un disco) di una macchina particolare: è molto poco probabile che si possano recuperare dati archiviati in questo modo in un disco fisso diverso. Questa tecnica, più che per eseguire delle copie di sicurezza, viene utilizzata per archiviare dischetti nel loro stato originale.

La copia di file e directory non tiene conto del supporto fisico in cui si trovano e nemmeno del tipo di filesystem utilizzato. Questo comporta una serie di conseguenze:

In generale, dal momento che una copia di file e directory è portabile, mentre una copia di un intero dispositivo non lo è (a meno che non si tratti di un dispositivo standard come i dischetti), dovrebbe essere preferibile la prima di queste due soluzioni.

Archiviazione

È intuitiva la ragione per la quale le copie di sicurezza non vanno fatte archiviando un intero dispositivo come se fosse un unico file. La copia pura e semplice dei file e delle directory è una tecnica possibile, ma richiede particolari condizioni:

Di solito si preferisce la tecnica dell'archiviazione dei dati in un unico file (che rappresenta l'archivio), assieme a tutte le informazioni necessarie per riprodurre i file e le directory originali. In questo modo si possono utilizzare unità di memorizzazione di qualunque tipo, eventualmente suddividendo l'archivio in spezzoni più piccoli contenibili al loro interno.

Archiviazione di file speciali

Gli oggetti contenibili in un filesystem possono essere di vario tipo ( file puri e semplici, directory, file di dispositivo, link, ...) e così pure i loro attributi (permessi, date, ...).

Il sistema di archiviazione che si utilizza deve essere in grado riprodurre correttamente tutti i dati del tipo di filesystem che si utilizza.

Per esempio, non sarebbe possibile archiviare i dati di un filesystem Unix in un archivio .zip che è nato per gli ambienti Dos.

Percorsi assoluti o relativi

Quando si intende archiviare una porzione di filesystem, e quindi solo ciò che si trova a partire da una certa directory in poi, è importante sapere come si comporta il programma di archiviazione al riguardo della registrazione dei percorsi (path). Se si vuole archiviare la directory /home/paperoga/esempi/, il programma di archiviazione potrebbe registrare il suo contenuto in uno dei tre modi seguenti.

  1. /home/paperoga/esempi/*
  2. home/paperoga/esempi/*
  3. ./*

Naturalmente, ciò dipende anche dal modo in cui vengono date le istruzioni al programma stesso.

Nel primo caso, quando dovesse rendersi necessario il recupero dei dati, questi verrebbero collocati esattamente nella directory indicata, in modo assoluto. Nel secondo, verrebbero collocati in modo relativo a partire dalla directory corrente, ottenendo così la directory ./home/paperoga/esempi/*. Nel terzo caso si avrebbe il recupero del contenuto di quella directory senza informazioni sul percorso precedente.

73.2 Strategia nelle copie

Le copie di sicurezza permettono di conservare la situazione dei dati in un determinato istante, ma i dati sono soggetti a continui aggiornamenti. Per questo occorre una procedura attraverso la quale si possa avere una gestione ordinata e ragionevolmente sicura delle copie.

A parte i rischi connessi con il tipo di supporto utilizzato per le copie e il luogo in cui queste vengono conservate, vanno almeno considerate le modalità sequenziali con qui queste possono essere eseguite. È importante rispettare un paio di regole elementari:

  1. non si riutilizzano i supporti contenenti la copia effettuata la volta precedente;
  2. non si utilizzano supporti in cattive condizioni.

Generazioni delle copie

Per distinguere una copia effettuata in un momento rispetto a quella fatta in un altro, si parla di ``generazione''. In pratica, l'ultima copia di sicurezza effettuata è l'ultima generazione, mentre le altre sono tutte generazioni precedenti.

Questo termine si riferisce naturalmente a copie fatte sullo stesso insieme di dati.

Il buon senso suggerisce di utilizzare almeno tre generazioni di copie: l'ultima, quella precedente e quella ancora precedente.

Livelli delle copie

La copia di un intero filesystem comporta solitamente un impegno consistente, sia in termini di tempo che di supporti impiegati. Il programma che si utilizza per le copie, oppure un opportuno gruppetto di script di shell, potrebbe permettere di effettuare la copia successiva dei soli file che sono stati modificati nel frattempo.

Quando si esegue una copia dei soli file che risultano diversi rispetto all'ultima copia completa, si parla di copia di ``primo livello''; quando se ne esegue un'altra in un momento successivo per le variazioni avvenute dopo quella di primo livello, si parla di ``secondo livello'' e così di seguito.

A parte le difficoltà legate alla conservazione dell'informazione sullo stato dei file (di solito si tratta della data di modifica e di creazione), si pongono poi dei problemi nel momento in cui dovesse essere necessario un ripristino dalle copie. Si dovrebbe ripristinare l'ultima copia completa, seguita da tutte quelle aggiuntive dei soli file modificati, nello stesso ordine in cui sono state fatte: dalla più vecchia alla più recente.

Sotto questo aspetto, quando non si vuole ripetere una copia completa troppo frequentemente, si cerca almeno di eseguire copie successive sempre di primo livello (si hanno quindi più generazioni di copie di primo livello). In tal modo, un eventuale recupero richiederebbe solo il ripristino dell'ultima generazione di copia completa e dell'ultima generazione di copia di primo livello.

Questo sistema potrebbe non tenere conto dei file cancellati dopo l'ultima generazione di copia completa: in tal modo, un eventuale recupero dalle copie di sicurezza potrebbe comportare il ripristino di file che non servono più.

Distribuire le responsabilità

In un sistema monoutente, l'unico utilizzatore è anche l'amministratore del proprio sistema, e di conseguenza anche l'unico responsabile. Sarà quindi lui (o lei) a sapere esattamente cosa ha fatto e cosa è necessario copiare per sicurezza.

In un sistema multiutente o comunque quando si condividono dati in gruppo, anche se a prima vista potrebbe sembrare conveniente la gestione delle copie in modo centralizzato, è comunque utile affidarla in parte anche alla responsabilità dei singoli:

Nel momento in cui dovesse essere necessario, si dovrebbero recuperare i dati dalle copie generali fatte dall'amministratore, e quindi, di seguito, da quelle particolari dei singoli utenti.

Se determinate attività vengono svolte in gruppo, si potrebbe ugualmente eleggere un ``capo'' all'interno di questo che si occupi delle copie di quell'attività.

Il vantaggio di questo metodo sta nell'alleggerimento delle responsabilità dell'amministratore e nella più facile soluzione di piccoli problemi locali:

73.3 Supporti

La scelta del supporto di conservazione della copia è importante e comporta alcune conseguenze:

Il supporto tradizionalmente più economico e più diffuso nel passato è il nastro magnetico. Questo ha però lo svantaggio fondamentale di essere un mezzo di memorizzazione sequenziale: non è possibile estrarre un file se prima non si scorre tutto il nastro (o tutti i nastri) che c'è prima di quel dato. Un altro svantaggio importante sta nella necessità di rileggere il suo contenuto, dopo la copia, per verificare che i dati siano stati registrati correttamente.

Da alcuni anni si possono trovare dischi rimovibili di grandi capacità a prezzi ragionevolmente bassi. Questi hanno il vantaggio di poter essere utilizzati come dischi normali e come tali, il recupero di dati parziali diventa molto più facile, anche quando la copia di sicurezza avviene per mezzo di una archiviazione tradizionale.

Quando i dati da archiviare sono pochi, può convenire l'utilizzo dei soliti dischetti: sono sicuramente una scelta economica e le unità a dischetti sono disponibili ovunque. Per quanto riguarda la facilità di estrazione dei dati, questo dipende dal modo con cui questi vengono usati: se si registrano i dati al loro interno senza fare uso di alcun filesystem, si ottiene un comportamento equivalente ai nastri; se si utilizzano con filesystem, è necessario che l'archivio sia contenibile all'interno di un singolo dischetto.

73.4 Compressione

Il problema della dimensione dei dati da archiviare può essere parzialmente ridotto con l'aiuto della compressione. La tecnica della compressione può essere applicata all'archiviazione in due modi possibili:

La differenza è enorme.

La compressione introduce un elemento di rischio maggiore nella perdita di dati: se una copia di sicurezza viene parzialmente danneggiata, l'effetto di questo danno si riflette in una quantità di dati maggiore (spesso è compromesso tutto l'archivio).

Compressione prima dell'archiviazione

I programmi di archiviazione compressa maggiormente diffusi negli ambienti Dos (sia shareware che freeware) utilizzano la tecnica della compressione prima dell'archiviazione. È questo il caso degli archivi .zip, .arj, .lzh e di altri ancora.

Questa ha il vantaggio di permettere una facile scansione dell'archivio alla ricerca di file da estrarre (e decomprimere) o un ampliamento dell'archivio in un momento successivo alla sua creazione. Un altro vantaggio è la minore sensibilità alla perdita dei dati: se una parte dell'archivio è danneggiato, dovrebbe essere possibile ripristinare almeno il resto.

Lo svantaggio principale è che la compressione fatta in questo modo, a piccoli pezzi, non è molto efficiente.

Compressione dopo l'archiviazione

La compressione fatta dopo l'archiviazione elimina ogni possibilità di accedere ai dati in esso contenuti e di poterlo ampliare, se non dopo averlo prima decompresso. Questo significa anche che un danneggiamento parziale dell'archivio implica la perdita di tutti i dati da quel punto in poi.

Ci sono programmi di archiviazione che si comportano così anche se non subiscono compressioni successive.

Un altro tipo di problema deriva dalla difficoltà di distribuire un archivio compresso suddividendolo su più unità di memorizzazione.

In questo caso però, l'efficienza della compressione è massima.

Negli ambienti Unix, di fatto, è questa la scelta preferita.

73.5 Archiviazione e recupero attraverso tar e gzip

La coppia tar e gzip rappresenta lo standard nella archiviazione dei dati: tar genera un archivio non compresso che può comprendere anche link simbolici e file speciali; gzip lo comprime generando un archivio più piccolo.

La coppia funziona così bene che tar è in grado di utilizzare gzip direttamente senza dover far uso di pipeline, purché il risultato della archiviazione non debba essere suddiviso su più supporti.

L'origine del nome tar è Tape ARchive, ma questo programma permette ugualmente di gestire qualunque altro tipo di sistema di memorizzazione.

La versione GNU di tar (quella normalmente utilizzata nelle distribuzioni Linux), non memorizza percorsi assoluti.

I programmi tar e gzip sono descritti rispettivamente nelle sezioni tar e gzip. Nelle sezioni seguenti sono riportati alcuni esempi.

<!>   Negli esempi seguenti si immagina di dover archiviare il contenuto della directory ~/lettere/, equivalente a /home/paperoga/lettere/, e delle eventuali discendenti.

Archiviazione diretta su dispositivi di memorizzazione

L'archiviazione attraverso la registrazione diretta sui dispositivi utilizza completamente il supporto di memorizzazione destinatario, anche se la quantità di dati da archiviare è molto piccola.

Quello sotto indicato è un esempio di archiviazione in un singolo nastro magnetico: l'opzione -c sta per Create; -f sta per File e permette di definire la destinazione della archiviazione; -z attiva la compressione attraverso gzip. Dal momento che si utilizza la compressione, l'archiviazione multivolume non è ammissibile.

# tar -c -z -f /dev/ftape ~/lettere

I dischetti possono essere utilizzati come i nastri, in modo sequenziale, ma questo lo si fa solo quando l'archivio generato non è contenibile in un solo dischetto: si ha quindi una copia multivolume, e in tal caso non è ammissibile l'uso della compressione.

# tar -c -M -f /dev/fd0H1440 ~/lettere

In questo caso, l'opzione -M sta proprio per Multivolume indicando quindi la possibilità che il supporto di destinazione non sia in grado di contenere l'intero archivio. In tal modo, tar si prende cura di sospendere l'archiviazione ogni volta che viene raggiunta la capienza massima. tar non è in grado di determinare da solo questa capacità: in questo caso, il dispositivo del dischetto è stato indicato in modo da riconoscerne la geometria, ma in alternativa si poteva utilizzare l'opzione -L seguita dalla dimensione, come nell'esempio seguente.

# tar -c -M -f /dev/fd0 -L 1440 ~/lettere

Quando si utilizzano i dischetti in questo modo, questi non contengono un filesystem e di conseguenza non possono essere montati. La lettura del loro contenuto avviene nello stesso modo della scrittura, attraverso il nome del dispositivo.

<!>   L'archiviazione su dischetti, attraverso il dispositivo, richiede comunque che questi siano già stati inizializzati (a basso livello) secondo il formato che viene indicato. Non conta che siano vuoti: è importante che ci siano le tracce e i settori come previsto.

Archiviazione normale su file

Quando l'archiviazione può essere fatta su dischi (con filesystem ) di dimensione sufficiente a contenere l'intero archivio, invece di utilizzare l'opzione -f per specificare un file di dispositivo, si può indicare direttamente un normalissimo file al loro interno, come nell'esempio seguente.

$ tar -c -f /mnt/mo1/lettere.tar ~/lettere

In pratica, nel caso appena visto, si utilizza un disco montato nella directory /mnt/mo1/ e si crea il file lettere.tar al suo interno.

L'archiviazione compressa, con l'utilizzo di gzip, può essere ottenuta semplicemente con l'opzione -z, come nell'esempio seguente.

$ tar -c -z -f /mnt/mo1/lettere.tar.gz ~/lettere

In tal caso l'estensione standard utilizzata (ma non obbligatoria) è .tar.gz che rende esplicito il fatto che la compressione è stata fatta dopo l'archiviazione. In alternativa si può usare anche .tgz, diffusa nei sistemi Dos.

Archiviazione e percorsi

Gli esempi seguenti, pur archiviando gli stessi dati, mostrano un modo diverso di registrare i percorsi all'interno dell'archivio. La directory di lavoro nel momento in cui si avvia il comando, è /home/paperoga, corrispondente alla directory home dell'utente.

/home/paperoga$ tar -c -z -f /mnt/mo1/lettere.tar.gz ~/lettere

/home/paperoga$ tar -c -z -f /mnt/mo1/lettere.tar.gz /home/paperoga/lettere

/home/paperoga$ tar -c -z -f /mnt/mo1/lettere.tar.gz lettere

/home/paperoga$ tar -c -z -f /mnt/mo1/lettere.tar.gz ./lettere

Nei primi due esempi, viene archiviata l'indicazione del percorso precedente e pur essendo stato dato in modo assoluto (/home/paperoga/lettere), questo viene reso relativo da tar, eliminando la prima barra inclinata che si riferisce alla radice.

Questo comportamento riguarda almeno il programma tar di GNU.

Negli ultimi due esempi, viene archiviata l'indicazione della sola directory lettere e in modo relativo.

Archiviazione di periodi

I file sono forniti di informazioni orarie. In base a queste è possibile eseguire delle copie di sicurezza riferite a periodi.

Le copie di sicurezza a più livelli possono essere ottenute in modo semplificato attraverso l'uso dell'opzione -N seguita da una data di partenza: si ottiene l'archiviazione di quanto variato a partire da una certa data; di solito si utilizza quella dell'ultima archiviazione completa.

Il concetto di variazione, in questo caso, si deve intendere come variazione del contenuto o degli attributi. Quindi si tratta della data di modifica o della data di creazione.

$ tar -c -z -N 19970801 -f /mnt/mo1/lettere.tar.gz ~/lettere

In questo caso, la data che segue l'opzione -N rappresenta la mezzanotte del primo agosto 1997.

$ tar -c -z -N "19970801 15:30" -f /mnt/mo1/lettere.tar.gz ~/lettere

Quest'ultimo esempio aggiunge alla data l'indicazione di un ora particolare, 15.30, e per evitare che sia interpretato in maniera errata, il gruppo data-orario viene racchiuso tra virgolette.

Archiviazione limitata a una unità

Quando si eseguono delle copie di sicurezza, è probabile che si voglia archiviare solo la situazione di una certa unità di memorizzazione (partizione o directory condivisa in rete). In tal caso si deve indicare precisamente questo limite con l'opzione -l (Limit).

Estrazione dei percorsi

Quando si accede all'archivio per estrarne il contenuto o per compararlo con i dati originali, entra in gioco il problema dei percorsi.

I dati vengono normalmente estratti nella directory corrente, oppure vengono comparati utilizzando come punto di partenza la directory corrente. Quindi, se l'archivio contiene la directory degli esempi precedenti, registrata a partire dalla radice (ma come già spiegato, senza l'indicazione della radice stessa), questi verranno estratti in ./home/paperoga/lettere/, oppure comparati con i dati contenuti in questo percorso.

Se in fase di estrazione o comparazione si vuole fare riferimento a percorsi assoluti, si può utilizzare l'opzione -P. In questo modo si afferma esplicitamente che i percorsi indicati nell'archivio vanno considerati come discendenti dalla directory radice.

Questo particolare della gestione dei percorsi è molto importante quando si fanno le copie di sicurezza: spesso si hanno dischi montati su mount point provvisori, e in tal caso, non è molto conveniente memorizzare anche il percorso su cui sono montati.

Recupero

Per poter effettuare un recupero di dati da un archivio è necessario conoscere in particolare il modo in cui questo era stato creato: normale, compresso, multivolume.

In generale per recuperare dati da un archivio si utilizza l'opzione -x (eXtract) al posto di -c, e a essa si devono eventualmente aggiungere -z nel caso di estrazione da un archivio compresso con gzip o -M nel caso di un archivio multivolume.

Durante il recupero di una copia di sicurezza è però importante fare in modo che i dati riprodotti mantengano gli stessi attributi originali (permessi e proprietà). Per questo si aggiungono le opzioni -p (riproduce i permessi) e --same-owner (riproduce le proprietà: UID e GID).

L'esempio seguente mostra un recupero da un archivio multivolume su dischetti.

~$ tar -x -M -p --same-owner -f /dev/fd0H1440

L'esempio seguente mostra un recupero con percorso assoluto: i percorsi indicati all'interno dell'archivio vengono aggiunti alla directory radice.

$ tar -x -z -P -p --same-owner -f /mnt/mo1/lettere.tar.gz

Recupero parziale

Il recupero parziale del contenuto di un archivio tar può essere fatto per singoli file o directory, oppure attraverso l'uso di caratteri jolly. In quest'ultimo caso però, occorre fare attenzione a evitare che la shell esegua l'espansione: è compito di tar determinare a cosa corrispondano all'interno dei suoi archivi.

Questo è un po' quello che accade a find con l'opzione -nome: è find stesso ad analizzare i caratteri jolly.

Valgono le regole solite: l'asterisco rappresenta un qualunque insieme di caratteri; il punto interrogativo rappresenta un qualsiasi carattere; le parentesi quadre permettono di definire insiemi o intervalli di valori.

Quando si indicano nomi di file o directory, o quando si utilizzano i caratteri jolly, occorre tenere presente che si sta facendo riferimento ai dati contenuti nell'archivio, con i percorsi originariamente memorizzati. Inoltre, se con i caratteri jolly si ottiene la corrispondenza con una directory, si ottiene l'estrazione del contenuto complessivo di quella.

L'esempio seguente mostra in che modo potrebbero essere recuperate le lettere contenute nella directory home/paperoga/lettere/nuove/.

$ tar -x -z -P -p --same-owner -f /mnt/mo1/lettere.tar.gz home/paperoga/lettere/nuove

L'esempio seguente mostra l'estrazione di tutti i file e delle directory corrispondenti a home/paperoga/lettere/ve*. Le virgolette sono necessarie per evitare che intervenga la shell a espandere l'asterisco.

$ tar -x -z -P -p --same-owner -f /mnt/mo1/lettere.tar.gz "home/paperoga/lettere/ve*"

Elenco e controllo

Per ottenere un elenco del contenuto di un archivio e per compararne il contenuto con i dati originali, valgono le stesse regole del recupero dei dati. In particolare, al posto dell'opzione -x si deve utilizzare -t (lisT) per gli elenchi e -d (Diff) per la comparazione.

73.6 Archiviazione di un filesystem

L'archiviazione di un intero filesystem va fatta considerando le caratteristiche di questo, in particolare della sua struttura fisica: partizioni e condivisione attraverso la rete.

In generale dovrebbe essere conveniente l'archiviazione separata per ogni partizione e per ogni filesystem condiviso in rete.

Oltre a questo occorre evitare di archiviare anche l'archivio che si sta creando: quando la destinazione dell'archiviazione è un file su disco, questo deve essere montato da qualche parte e per questo si potrebbe creare un circolo vizioso.

Ci sono directory che, per la loro natura, non conviene o non devono essere archiviate: per /tmp/ non conviene; con /proc/ non si deve. In questi casi, si deve solo ricordare di ripristinare queste directory, nel momento in cui fosse necessario il recupero.

Non bisogna dimenticare i permessi: /tmp 777 e /proc 555.

Strumenti per il recupero

L'archiviazione di copie di sicurezza non è sufficiente a garantirsi contro gli incidenti: in che modo si può avviare un computer in cui è appena stato sostituito il disco fisso? Evidentemente, occorre essere più previdenti e predisporre in anticipo gli strumenti necessari per preparare le partizioni di un nuovo disco fisso e per recuperare i dati precedentemente archiviati.

Questo argomento viene trattato nei prossimi capitoli.

 

1997.10.26 - Scritto da Daniele Giacomini   daniele@calion.com   (vedi copyright: Appunti Linux).


Capitolo successivo Capitolo precedente Indice