Command Line - Linux

Il comando tar: Gestione e Automazione dei backup su linux

Durante l’esperienza di amministratore di sistema Linux, il comando tar (Tape Archive) è un pilastro fondamentale. Nonostante sia un comando storico, rimane lo strumento più versatile e affidabile per impacchettare file e cartelle, fondamentale sia per semplici trasferimenti che per strategie di backup più complesse. Vediamo come passare dalle basi del comando tar fino alla creazione di un sistema di backup automatizzato.

A differenza dei software di compressione comuni (come Zip), tar nasce con lo scopo primario di unire molti file in un unico archivio (spesso chiamato tarball), mantenendo intatti i permessi e la struttura delle directory. Per ridurre lo spazio occupato, si utilizzano librerie esterne come Gzip, Bzip2.

Come utilizzare tar

La sintassi di tar può sembrare complessa all’inizio, ma segue una logica precisa

tar [opzioni] [nome_archivio] [file_da_archiviare]

Ecco alcuni esempi:

tar -czvf archivio.tar.gz /percorso/cartella

permette di creare un un archivio compresso con GZip con tutto il contenuto di “cartella” (sia file che directory).

tar -xvf archivio.tar.gz

estrae il contenuto dell’archivio nella directory da dove si sta lanciando il comando

tar -xvf archivio.tar -C /percorso/destinazione

permette di specificare il percorso dove estrarre l’archivio

tar -tvf archivio.tar.gz

visualizza il contenuto dell’archivio senza effettuare l’estrazione

Nei comandi precedenti abbiamo utilizzato alcuni flag passati al comando, vediamo il significato di ognuno di questi

  • -c (Create): crea un nuovo archivio
  • -x (Extract): estrae i file
  • -z / -j: Selezionano l’algoritmo di compressione (Gzip, Bzip2)
  • -v (Verbose): mostra il progresso dei file a video
  • -f (File): specifica il nome dell’archivio (deve sempre precedere il nome del file)

Vediamo ora alcuni esempi più complessi di utilizzo di tar. In questo esempio viene creato un archivio della directory “data” posizionata nella directory corrente ma esclude tutti i file con estensione .log

tar --exclude='*.log' -czvf backup.tar.gz ./data

Generiamo ora un archivio dove nel nome del file inseriremo anche la data corrente in modo che si possano mantenere più versioni dell’archivio. Questo può essere utile nella gestione dei backup

tar -czvf backup-$(date +%Y-%m-%d).tar.gz /data

Nell’esempio seguente invece viene confrontato il contenuto dell’archivio con i file originali presenti nella directory /data. Questo permette di assicurarsi che i dati presenti nell’archivio corrispondano a quelli su disco

tar -dvf backup.tar /data

Un esempio di backup fatto con tar

Ora proviamo a fare uno script che crea un archivio compresso, aggiunge la data al nome e pulisce automaticamente i vecchi backup per non esaurire lo spazio su disco.

#!/bin/bash

# --- CONFIGURAZIONE ---
SOURCE_DIR="/home/utente/documenti"  # Cartella da salvare
BACKUP_DIR="/home/utente/backup"     # Dove salvare i backup
DATE=$(date +%Y-%m-%d)               # Data odierna
FILENAME="backup-$DATE.tar.gz"       # Nome file
RETENTION=7                          # Giorni da conservare

# Crea la cartella di backup se non esiste
mkdir -p "$BACKUP_DIR"

# Crea l'archivio usando tar. -c: crea, -z: gzip, -f: file
tar -czf "$BACKUP_DIR/$FILENAME" "$SOURCE_DIR"

# Controllo esito
if [ $? -eq 0 ]; then
    echo "[$(date)] Backup riuscito: $FILENAME"
else
    echo "[$(date)] Errore nel backup!"
fi

# Elimina backup più vecchi di 7 giorni
find "$BACKUP_DIR" -type f -name "*.tar.gz" -mtime +$RETENTION -delete

Possiamo salvare il file (es. backup.sh), renderlo eseguibile (chmod +x backup.sh) ed eseguirlo (./backup.sh) per verificare il corretto funzionamento.

Questo script per quanto funzionante ha il difetto di mantenere il file di backup sullo stesso server dei dati originali. In caso di problemi quindi il rischio di perdere i dati è altissimo. Possiamo modificarlo facendo in modo che l’archivio sia trasferito su un sistema diverso. Per questo utilizzeremo il comando rsync.

Per far sì che lo script funzioni in automatico, il server locale deve poter accedere al server remoto senza digitare la password. Per farlo si usano le chiavi SSH

  • Generare la chiave sul server che fa il backup: ssh-keygen -t rsa (premere invio a tutto)
  • Copiare la chiave sul server remoto: ssh-copy-id utente@indirizzo_ip_remoto

Ecco lo script aggiornato che crea l’archivio tar e lo sposta sul server remoto

#!/bin/bash

# --- CONFIGURAZIONE LOCALE ---
SOURCE_DIR="/home/utente/documenti"  # Cartella da salvare
BACKUP_DIR="/home/utente/backup"     # Dove salvare i backup
DATE=$(date +%Y-%m-%d)               # Data odierna
FILENAME="backup-$DATE.tar.gz"       # Nome file
RETENTION=7                          # Giorni da conservare

# --- CONFIGURAZIONE REMOTA ---
REMOTE_USER="tuo_utente"
REMOTE_HOST="192.168.1.100"         # IP o Hostname del server remoto
REMOTE_DIR="/path/backup_remoti/"   # Cartella sul server remoto

# Crea la cartella di backup se non esiste
mkdir -p "$BACKUP_DIR"

# Crea l'archivio usando tar. -c: crea, -z: gzip, -f: file
echo "Creazione archivio in corso..."
tar -czf "$BACKUP_DIR/$FILENAME" "$SOURCE_DIR"

# Controllo esito
if [ $? -eq 0 ]; then
    echo "[$(date)] Backup locale creato: $FILENAME"
    
    # Trasferimento remoto con rsync
    # -a: archive mode, -v: verbose, -z: compress durante il trasferimento
    echo "Sincronizzazione con il server remoto..."
    rsync -avz "$BACKUP_DIR/$FILENAME" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR"
    
    if [ $? -eq 0 ]; then
        echo "[$(date)] Copia remota completata con successo."
    else
        echo "[$(date)] Errore durante il trasferimento rsync!"
    fi
else
    echo "[$(date)] Errore nella creazione del tarball!"
    exit 1
fi

# Elimina backup più vecchi di 7 giorni
find "$BACKUP_DIR" -type f -name "*.tar.gz" -mtime +$RETENTION -delete
echo "[$(date)] Pulizia vecchi backup completata."

Conclusioni

Abbiamo visto come il comando tar sia molto più di un semplice strumento di archiviazione. Siamo partiti vedendo dei semplici esempi per creare un archivio fino ad arrivare alla creazione di uno script automatizzato in grado di gestire la compressione, la rotazione dei file vecchi e il trasferimento sicuro su server remoti tramite rsync.

Testare i backup regolarmente. Un backup ha valore solo se si è in grado di ripristinarlo correttamente nel momento del bisogno. Usare il comando tar -tvf per verificarne l’integrità.