Creare backup con tar: come funziona l’archiviazione

Il programma di archiviazione tar si basa su un vecchio metodo per la protezione dei dati, che è comunque tenuto in considerazione ancora oggi. Il nome tar è in realtà un acronimo e sta per Tape Archiver, quindi archiviazione su nastro. Anche se oggigiorno perlomeno gli utenti privati lo utilizzano solo raramente, il programma rimane sempre lo strumento più amato per l’archiviazione sui sistemi Unix. Grazie a questo pacchetto si possono anche creare backup incrementali di un server, a intervalli di tempo regolari. Vi spieghiamo come funziona tar e con quali comandi è possibile mettere in sicurezza i propri dati.

Come funziona tar?

tar è un programma per l’archiviazione su Linux e i sistemi imparentati. Stranamente per un programma simile tar non offre di default nessuna compressione, ma ciò nonostante è molto popolare. Infatti il maggiore vantaggio consiste nel poter raccogliere intere directory in un unico file. Questa tecnica è strettamente legata alla storia del programma: in un’unità nastro i dati vengono trasmessi uno dietro l’altro su un nastro magnetico. Così si spiega la memorizzazione lineare e sequenziale tipica del formato tar. I nuovi file vengono aggiunti alla fine nell’archivio. Il file che ne risulta viene anche chiamato “tarball” (in italiano “palla di catrame”), poiché i file sono praticamente “appiccicati” gli uni agli altri.

Per ottenere una compressione, tar viene spesso utilizzato in combinazione con gzip. I due programmi si completano perfettamente: infatti gzip può comprimere sempre solo dei file singoli e perciò viene utilizzato solitamente prima tar e poi gzip (o anche un altro programma di compressione). Così si formano infine dei file .tar.gz o .tzip.

Installare tar

Su Ubuntu tar dovrebbe già essere preinstallato. Se utilizzate un’altra distribuzione di Linux o Unix, installate questo utile programma:

sudo apt-get install tar tar-doc

Il pacchetto tar-doc è in questo caso opzionale, in quanto contiene solo la documentazione del programma di archiviazione.

Utilizzare tar

Se volete utilizzare tar, ricorrete semplicemente a questa sintassi:

tar opzione file

Le opzioni di tar sono le seguenti:

Opzione Descrizione Particolarità  
--help Mostra tutte le opzioni.    
--version Restituisce la versione utilizzata di tar.    
-c Genera un nuovo archivio. (create)  
-d Compara tra di loro i file presenti nell’archivio e nel file system. (diff)  
-f Scrive un archivio nel file indicato o estrapola i dati dal file indicato. (file) questa opzione va inserita per ultima, visto che tutti gli input successivi devono essere interpretati come file.  
-z Comprime o decomprime direttamente l’archivio con gzip. gzip deve già essere installato.  
-Z Comprime o decomprime direttamente l’archivio con compress. compress deve già essere installato. Fare attenzione ai caratteri maiuscoli.  
-j Comprime o decomprime direttamente l’archivio con bzip2. bzip2 deve già essere installato.  
-J Comprime o decomprime direttamente l’archivio con xz. xz deve già essere installato. Fare attenzione ai caratteri maiuscoli.  
-k Impedisce che i file sovrascrivano i file già esistenti al momento dell’estrazione dell’archivio.    
-p Mantiene i permessi di accesso al momento dell’estrazione.    
-r Aggiunge un file a un archivio già esistente. (recreate) Il file viene aggiunto alla fine. Funziona solo con un archivio non compresso.  
-t Indica il contenuto di un archivio. (table)  
-u Aggiunge solo file che sono più recenti rispetto alle versioni contenute nell’archivio.    
-v Indica i passaggi per l’archiviazione. (verbose)  
-vv Indica informazioni più dettagliate per l’archiviazione. (very verbose)  
-w Ogni azione deve essere confermata.    
-x Estrae i file dall’archivio. (extract) I file rimangono nell’archivio.  
-A Aggiunge i file di un archivio esistente a un altro. Fare attenzione ai caratteri maiuscoli.  
-C Indica il posto in cui i file devono essere estratti. Fare attenzione ai caratteri maiuscoli.  
-M Creare, mostrare o estrarre un archivio in più parti. Fare attenzione ai caratteri maiuscoli.  
-L Cambia il supporto a partire da una precisa dimensione del file. Le dimensioni vengono indicate in kilobyte. Fare attenzione ai caratteri maiuscoli.  
-W Verifica l’archivio dopo che è stato scritto. Fare attenzione ai caratteri maiuscoli.  
-P Archivia tutti i file a partire dalla root. Fare attenzione ai caratteri maiuscoli.  
--exclude Esclude i file o le cartelle. Viene indicato seguendo il comando per la creazione dell’archivio con la sintassi --exclude=<file/cartella>.  
-X Legge una lista con i file esclusi. Richiede una lista creata prima: -X <Lista>.list. Fare attenzione ai caratteri maiuscoli.  
-g Crea un log di tutte le directory comprensivo di checksum.    

Creando degli archivi tar avete inoltre la possibilità di mettere wildcard con un asterisco. Se create un nuovo archivio, indicate sempre prima le opzioni, dopo il nome del file dell’archivio che volete creare, e infine i file e le cartelle che vi devono essere contenute. Nel seguente esempio create un archivio (-c) a partire da due file testuali, li comprimete con gzip (-z) e li scrivete nel file archivio.tar.gz (-f):

  tar -czf archivio.tar.gz esempio_1.txt esempio_2.txt

Se volete raccogliere tutti i file testuali in un archivio, utilizzate la wildcard corrispondente:

tar -cf testo_archivio.tar *.txt

Possono essere raccolti in un archivio anche intere cartelle comprensive delle sottocartelle. Nel seguente esempio viene archiviata /cartella1 incluse tutte le sottocartelle e i file contenuti ad eccezione di /cartella1/sottocartella_x:

tar -cf archivio.tar --exclude="/cartella1/sottocartella_x" /cartella_1

Nel seguente esempio estraete (-x) l’archivio compresso (-z), che abbiamo creato nel primo esempio, in un’altra cartella (-C):

tar -xzf archivio.tar.gz -C /home/cartella1/archivio_cartella

Per aggiungere a un archivio (che deve essere decompresso) un altro file, date ad esempio il seguente comando:

tar -rf archivio.tar esempio_extra.txt

Come funziona un backup con tar?

I webmaster ricorrono spesso a tar per creare dei backup: così la struttura delle cartelle rimane invariata e la varietà delle funzioni del programma permette anche innumerevoli perfezionamenti, come è visibile dalle molte opzioni. Di seguito vi spieghiamo come creare un backup completo con tar e come effettuare dei backup incrementali con il programma.

Creare un semplice backup con tar

Per la vostra strategia di backup è utile creare uno script di backup per l’archiviazione del vostro sistema, al posto di generare semplicemente degli archivi manuali. Così potete archiviare automaticamente diverse cartelle, comprimerle e trasmetterle a un supporto di memoria esterno. È importante perciò che abbiate i permessi di scrittura e di lettura per le relative cartelle. Prima di tutto create nella vostra cartella home una cartella bin (nel caso in cui non sia già presente) e generate là lo script. Dovete adattare il seguente script di esempio alle vostre esigenze e alla struttura delle cartelle:

#!/bin/bash
  DATE=$(date +%Y-%m-%d-%H%M%S)
  BACKUP_DIR="/cartelladidestinazione/backup"
  SOURCE="$HOME/cartelladiorigine"
  tar -cvzpf $BACKUP_DIR/backup-$DATE.tar.gz $SOURCE

Per farvi comprendere come funziona precisamente questo script, ve lo spieghiamo ora riga per riga:

  1. La prima riga è la cosiddetta shebang, che comunica al sistema operativo quale interprete utilizzare. In questo caso viene utilizzato bash.
     
  2. Ogni backup con tar riceve una marca temporale, importante per poter distinguere chiaramente più backup. Alle variabili si dà ad esempio il seguente formato: anno-mese-giorno-oraminutisecondi, quindi 2017-09-07-152833.
     
  3. Qui definite la cartella in cui viene creato il backup. Non terminate l’ultima sottocartella con  “/“.
     
  4. In questa riga stabilite quali cartelle volete inserire nell’archivio. Qui si possono anche presentare diverse cartelle che vengono divise solo da uno spazio: SOURCE="$HOME/cartelladiorigine1 $HOME/ cartelladiorigine2 ". Anche in questo punto non annotate nessun  “/“ alla fine delle cartelle. Fate sempre attenzione ad aggiungere uno spazio prima delle virgolette conclusive.
     
  5. L’ultima riga dello script contiene infine il comando tar:
    • -cvzpf crea un archivio (-c), vengono così mostrati i passaggi (-v), viene compresso con gzip (-z), i permessi di accesso rimangono invariati (-p) e tutto viene riprodotto nel seguente file (-f). Soprattutto -v e -p sono quindi opzionali e avete inoltre la possibilità di aggiungere altre opzioni per poter pianificare diversamente il vostro backup.  
    • $BACKUP_DIR/backup-$DATE.tar.gz nomina la cartella ($BACKUP_DIR) e il file dove deve essere salvato il backup. Nel nostro esempio lo chiamiamo backup, seguito dalla marca temporale corrente. Il nome del file si conclude con l’indicazione del formato in cui è stato creato il file. Se volete utilizzare un’altra compressione, dovreste pensare a modificare sia il formato del file che l’opzione nel comando.
    • Infine con la variabile $SOURCE comunicate a tar cosa deve archiviare. Inoltre è possibile anche escludere le cartelle o i file, che non devono entrare a far parte del backup, con --exclude o –X.
Consiglio

In teoria l’estensione che date al file di script non gioca alcun ruolo su Linux e Unix. I sistemi estrapolano il tipo di file, comparando la struttura del file con un magic file. Si tratta quindi di un database che si può solitamente trovare su /etc/magic. Tuttavia si è affermata come prassi l’indicazione delle estensioni dei file, di modo che gli utenti riescano a mantenere facilmente la visione d’insieme.

Ora salvate il file con il nome backup nella cartella bin e aggiungete al relativo percorso la variabile PATH:

PATH=$PATH:$HOME/bin

Poi rendete eseguibile lo script di backup appena creato:

chmod u+x $HOME/bin/backup

In questo modo rendete eseguibile il file solo per voi (u). Potete anche assegnare i permessi a un gruppo (g), a un altro (o) o a tutti (a). In questo modo avete terminato e potete eseguire lo script:

sudo backup

Se volete ripristinare il backup, ovvero decomprimere l’archivio, basta un comando:

tar -xzf backup.tar.gz -C /

Lo script crea un backup completo. Ma nel caso di un backup dell’intero server, non sempre è la scelta migliore. Perciò dovreste riflettere se un backup incrementale con tar non risulti più sensato per i vostri scopi.

N.B.

Creando un archivio con indicazioni di percorso assolute tar comunica: “tar removing leading '/' from member names”. Non si tratta di un errore bensì di un suggerimento a stare attenti durante l’utilizzo: tar realizza da /home/sottocartella il percorso home/ sottocartella. Se quando estraete l’archivio non vi trovate nella root, tar crea una nuova struttura di cartella, ad esempio: /home/sottocartella/home/sottocartella. Così diminuisce la probabilità che per errore venga sovrascritto tutto il vostro sistema. Ricordatevi però che Unix non vi comunica niente in caso di sovrascrizione. Dovete quindi posizionarvi prima nella root, in caso vogliate sostituire davvero i contenuti già esistenti. Potete invece aggirarli tramite l’opzione -P

Che cos’è un backup incrementale?

I webmaster creano regolarmente dei backup per evitare una perdita di dati. Se il sistema vero e proprio dovesse impedire il corretto funzionamento del servizio, fosse compromesso o fosse stato eliminato, si può utilizzare in questo caso una versione funzionante ripristinata da un backup. Più spesso impostate dei punti di ripristino, meno dovrete fare i conti, in caso di emergenza, con perdite di dati. Se ogni volta salvate un backup completo, quindi archiviate tutti i dati del sistema, il processo richiederà molto tempo e sarà necessario un maggiore spazio sulla memoria. Al posto del backup completo potete affidarvi anche ai backup incrementali.

Un backup incrementale presuppone sempre una memorizzazione completa. Dovete prima di tutto archiviare almeno una volta il sistema completo (o almeno la parte che volete mettere in sicurezza). In seguito in un backup incrementale vengono messi in sicurezza soltanto i file nuovi o modificati. Ciò porta a un minore afflusso di dati, anche se richiede un impegno maggiore al momento del ripristino. Quando quindi ripristinate il backup, avete bisogno del backup completo e di ogni backup incrementale che avete creato a partire da una prima archiviazione completa. Se un file dovesse andare perduto (è oggigiorno meno probabile che ai tempi dei nastri magnetici), il backup presenterebbe delle lacune.

Creare un backup incrementale con tar

Con tar si possono creare dei backup incrementali a intervalli di tempo regolari. Anche per questo vi consigliamo di scrivere un vostro script di backup. In questo modo potete ad esempio stabilire che venga creato una volta al mese un backup completo e a seguire un backup incrementale giornaliero. Inoltre con il seguente script si ottiene che i vecchi backup vengano spostati regolarmente nelle cartelle ordinate per data.

A questo scopo, in aggiunta a tar, avete bisogno anche di cron. Questo demone (un programma che funziona in background) permette delle esecuzioni a tempo degli altri processi; di base cron è già compreso su Ubuntu. Prima di tutto aprite di nuovo un editor testuale e create il vostro script:

#!/bin/bash
BACKUP_DIR="/cartelladidestinazione/backup"
ROTATE_DIR="/cartelladidestinazione/backup/rotate"
TIMESTAMP="timestamp.dat"
SOURCE="$HOME/cartelladiorigine "
DATE=$(date +%Y-%m-%d-%H%M%S)

EXCLUDE="--exclude=/mnt/* --exclude=/proc/* --exclude=/sys/* --exclude=/tmp/*"

cd /

mkdir -p ${BACKUP_DIR}

set -- ${BACKUP_DIR}/backup-??.tar.gz
lastname=${!#}
backupnr=${lastname##*backup-}
backupnr=${backupnr%%.*}
backupnr=${backupnr//\?/0}
backupnr=$[10#${backupnr}]

if [ "$[backupnr++]" -ge 30 ]; then
mkdir -p ${ROTATE_DIR}/${DATE}
mv ${BACKUP_DIR}/b* ${ROTATE_DIR}/${DATE}
mv ${BACKUP_DIR}/t* ${ROTATE_DIR}/${DATE}
backupnr=1
fi

backupnr=0${backupnr}
backupnr=${backupnr: -2}
filename=backup-${backupnr}.tar.gz

tar -cpzf ${BACKUP_DIR}/${filename} -g ${BACKUP_DIR}/${TIMESTAMP} -X $EXCLUDE ${SOURCE]

Anche per questo script di backup vi spieghiamo passo per passo cosa succede:

  • Prima di tutto definite di nuovo l’interprete.
     
  • In seguito stabilite le variabili. Nuove sono la cartella per le rotazioni dei backup (una sorta di archivio dei backup) e un file per la marca temporale.
     
  • Nel nostro esempio vi illustriamo che non è sempre utile inserire tutte le directory nel backup. Abbiamo escluso in questo caso i contenuti della cartella (e non la cartella stessa, perciò la wildcard “*“) mnt, proc, sys e tmp. Infatti i dati presenti in queste directory sono temporanei o vengono creati di nuovo a ogni nuovo riavvio del sistema.
     
  • Per fare in modo che i percorsi vengano interpretati tutti in maniera corretta, lo script si sposta con cd / nella root.
     
  • Con mkdir create la cartella di backup, nel caso in cui non esista ancora.
     
  • Ora vengono inserite tutte le variabili. Visto che volete numerare i vostri backup, il blocco del codice individua il numero dell’ultimo backup. Ciò accade mentre lo script rimuove gli altri componenti del nome del file.
     
  • Inserite sempre solo 30 backup, poi lo script sposta tutti i file di archivio nella cartella di rotazione, che viene prima creata e poi con mv vengono spostati nella nuova cartella tutti i file che cominciano con le lettere b e t. La limitazione delle lettere si esplica con il fatto che ci dovrebbero essere dei file contrassegnati nella cartella, cioè backup e timestamp. Infine lo script imposta il numero del backup di nuovo su 1. Se lo script rileva che non sono ancora stati fatti 30 backup, aumenta il numero di file semplicemente di 1 (++).
     
  • Ora lo script torna indietro sui propri passi e su quello che aveva stabilito all’inizio: i comandi si occupano del fatto che il nome del file (ora con il nuovo numero) sia di nuovo completo.
     
  • Infine lo script esegue il comando tar vero e proprio: confrontato con il comando del semplice backup completo è stata aggiunta qui un’altra opzione. Con –g viene consentito il backup incrementale. Così tar estrapola la marca temporale di ogni file, la compara con i dati registrati finora nel timestamp.dat e può così decidere quali modifiche sono presenti dall’ultimo backup. Solo queste entrano a far parte del nuovo archivio.
N.B.

Lo script sposta (durante l’archiviazione giornaliera) ogni mese i file di backup in una nuova cartella di archivio, di modo che la cartella di backup vera e propria contenga solo i dati più recenti. Tuttavia non è integrata nessuna funzione che limiti il numero della cartella di archivio. Ciò significa che dovete eliminarla manualmente.

In questo modo lo script per la creazione di un backup incrementale è pronto: salvate il file come backup nella cartella bin. Anche qui dovete esportare il percorso e rendere eseguibile lo script:

PATH=$PATH:$HOME/bin
chmod u+x $HOME/bin/backup

Teoricamente ora potete avviare il vostro script di backup con sudo backup. L’idea dietro al backup incrementale è però quella che il procedimento venga automatizzato ed eseguito giornalmente. Per questo si ricorre a cron e si modificano le cosiddette crontab. Questa è la tabella che esegue le indicazioni basandosi su cron. Ha sei campi:

Minuti (0-59) Ore (0-23) Giorni (1-31) Mesi (1-12) Giorni della settimana (0-7) Incarico

Nei campi potete inserire dei numeri relativi alla fascia dei valori (indicati tra parentesi) o un asterisco (*). Quest’ultimo significa pressappoco “a ogni possibile valore”. Una particolarità è rappresentata dalla colonna dei giorni della settimana. Qui potete stabilire che un incarico venga eseguito ad esempio ogni lunedì (1) o solo nei giorni feriali (1-5). Si può indicare la domenica con due diversi valori: sia 0 che 7 si riferiscono alla domenica, visto che per alcune persone la settimana comincia con questo giorno e per altre termina con questo.

Nella riga di comando aprite la modalità editor di cron:

sudo crontab –e

Qui inserite la seguente riga:

30 7 * * * /home/bin/backup

In questo modo abbiamo autorizzato che il backup venga eseguito ogni giorno (e ogni mese, indipendentemente dal giorno della settimana) alle 7.30 di mattina. Salvate le vostre modifiche e il vostro backup incrementale giornaliero è pronto per l’uso.

N.B.

cron funziona solo quando il vostro sistema è attivato. Questo è il caso per i web server. Se però pianificate di utilizzare lo script per la sicurezza del vostro PC o del notebook, dovreste anche garantire che i dispositivi funzionino ogni giorno alle 7.30. Se il dispositivo non è attivato, il backup non verrà effettuato. Anacron offre una possibilità di aggirare questo impedimento: infatti il programma sposta su un sistema non funzionante la versione pianificata a un momento in cui il dispositivo è di nuovo attivo.

Ripristinare il sistema da un backup

Non lo si augura a nessuno, ma può succedere che a causa di un danno serio il vostro sistema debba essere ripristinato. Con tar è possibile facilmente e non c’è inoltre bisogno di uno script aggiuntivo. Non basta però un solo comando nel caso di un backup completo, poiché è insito nella natura dei backup incrementali che debbano essere decompressi più file. Inserite queste righe di comando nella console:

BACKUP_DIR=/cartelladidestinazione/backup
cd /
  for archive in ${BACKUP_DIR}/backup-*.tar.gz; do
  tar -xpzf $archive -C /
  done
N.B.

Ripristinando il sistema da un backup, vengono sovrascritte tutte le cartelle ed eventualmente anche i dati importanti.

Per evitare di dover estrarre singolarmente i file di archivio, utilizzate un ciclo for:

  1. Nel primo passaggio definite la cartella in cui si trovano i backup.
  2. Con cd / vi spostate nella root, di modo da assicurarvi che l’archivio venga estratto nel posto corretto.
  3. Ora avviate un ciclo for: questo comando ripete le azioni che si trovano tra do e done, fino a quando non sono state percorse tutte le possibilità. Per specificare il comando, indicate di nuovo il percorso del vostro backup con un asterisco come wildcard, perché volete estrarre tutti i file di archivio in questa cartella.
  4. Si specifica con il comando tar quanto segue: estraete (-x), mantenendo i permessi di accesso (-p), e decomprimete (-z) l’archivio (-f $archivio) nella root (-C /).
  5. Con done stabilite il punto finale del ciclo.

Visto che avete numerato l’archivio al momento della sua creazione, i backup vengono di nuovo riutilizzati l’uno dopo l’altro, partendo dal più vecchio. È importante sapere che negli archivi, che sono stati generati dopo il backup completo, si trovano le versioni più nuove dei file. Ciò significa che durante il ciclo viene estratta prima la versione vecchia per poi essere sovrascritta con una nuova versione nel ciclo successivo. Alla fine avrete sovrascritto il sistema completo con il backup e ripristinato la versione archiviata più recente di ogni singolo file.

Questo è il senso reale di un backup incrementale: il ripristino completo del sistema. Percorrendo una strada un po’ più lunga è però persino possibile proteggere solo un singolo file e recuperare l’ultima versione archiviata precedentemente. Per fare ciò procediamo in due passaggi:

BACKUP_DIR=/cartelladidestinazione/backup
  ls -l ${BACKUP_DIR}
  for archive in ${BACKUP_DIR}/backup-*tar.gz; do
  tar -tzf $archive | grep file-cercato;
  done

Anche in questo primo passaggio ricorrete a un ciclo for, che viene tuttavia utilizzato per la ricerca e non per l’estrazione:

  1. Definite di nuovo la cartella di backup.
  2. Con il comando ls vi vengono mostrati tutti i file e le cartelle nella cartella di backup. L’opzione –l consente di avere delle informazioni dettagliate.
  3. Iniziate un ciclo come accade per il ripristino dell’archivio completo.
  4. La modifica importante è riscontrabile nelle opzioni del comando tar: al posto di creare un archivio (c) o di estrarlo (x), potete farvi mostrare il contenuto degli archivi (t). Visto che però non volete cercare il file manualmente, canalizzate l‘output con una pipe (una lineetta verticale) al comando grep, che cerca in questo modo il file di cui siete alla ricerca all’interno dell’output (quindi il contenuto dell’archivio).
  5. Terminate il ciclo.

Ora il terminale vi indica il file ricercato e forse anche più di una volta, se l’avete modificato regolarmente e quindi appare in ogni backup incrementale. Segnatevi il percorso al file e create un altro ciclo, che ripristina l’ultima versione salvata:

for archive in ${BACKUP_DIR}/backup-*.tar.gz; do
tar –xzf $archive -C /cartelladidestinazione/backup/file-cercato
done

Ora il file verrà ripristinato nel posto originario sovrascrivendo così anche una possibile versione più attuale.