Backup Incrementale Intelligente su base Linux.

Backup LinuxBackup!! Quante volte ne abbiamo avuto bisogno, per recuperare dati e magari anche file di sviluppo di applicazioni, database e quant’altro. Un questo piccolo prontuario vi illustrerò come ottenere un backup di files e directory, in modo intelligente, con l’ausilio del semplice comando Tar, in Linux.

Senza dover ricorrere all’aiuto di costosi e complessi sistemi di backup (cito Bacula) Linux, con qualsiasi distro, ci viene in contro nella sua semplicità e organizzazione dinamica dei files.

Ecco che cosa occorre per seguire questa guida:

L’uso dei comandi Linux: Tar e shell di Linux.
L’editing di testo: per la creazione dei file Bash shell Linux.
Un programma client SSH: io consiglio WinSCP, che contiene all’interno già un buon editor. Poi se preferite operare da Windows io lo integro con Notepad++ o da Mac con Editra.
Una versione aggiornata di: Webmin.
Un server Linux: io prediligo Ubuntu Server, ma qualunque distro è consona.
Una o più directory da backupare.

Quanti di noi Web-Dev o Webmaster, hanno avuto la necessità di eseguire il backup dei siti web, ed anche dei dati contenuti nei Database. Con questa guida potrete farlo.

1. Fase. Crare un file bash da eseguire dal nostro server.

Quindi andiamo nella nostra partizione di root del nostro server utilizzando WinSCP. Creiamo una directory chiamata “backup”con WinSCP è facile, basta usare il tasto destro del mouse per crearla. Creiamo quindi un nuovo file che chiameremo “bk_web.sh”, e WinSCP ci aprirà subito il nostro editor di testo. Ora proseguiamo con la scrittura del file.

Importante è scrivere in prima riga questo comando, che permetta al sistema di riconoscere l’estensione del file batch:

#!/bin/sh

Ora trascriviamo le variabili utili che ci interessano nello script.
Variabile dell’email a cui spedire il risultato del backup:

MIAMAIL='miaemail@miodominio.it'

Variabili d’ambiente, per definirne le sorgenti e destinazioni.
Directory di origine del presente file:

DIRSNAR='/root/backup'

Sorgente della directory da includere nel Backup:

SORGENTI='/var/www/'

Si è scelto di eseguire il backup dei siti internet, quindi “/var/www/” è la directory interessata.
La destinazione sarà il Server NAS montato sulla partizione locale del server web.

DESTINAZIONE='/mnt/nas/bkweb'

Formattazione delle date:

DATE_MAIL=$(date +"%d-%m-%Y")
TIME_MAIL=$(date +"%T")
DATE_FILE=$(date +"%d-%m-%Y-%H-%M-%S")

Il backup preferenziale da eseguire è un backup incrementale, cioè che esegue il backup solo dei file incrementali nel tempo, nella directory interessata. Questo sistema lo reputo poco utile se poi si deve gestire una mole di siti molto alta, che occuperebbero comunque molto spazio, rendendo macchinoso il ripristino. Quindi preferisco prima creare un backup completo datato dei files tar, ed infine cancellare periodicamente i files di backup ormai obsoleti. Il comando sarà successivamente schedulato per ogni avvio giornaliero, più avanti vedremo come.

Quindi questo sarà il comando per cancellare i files di backup tar, obsoleti di 6 giorni:

# Cancella i vecchi archivi presenti
find $DESTINAZIONE -type f -mtime +6 -name "bk-*.tgz" -exec rm -f {} \;

Ora posso procedere al comando di compressione Tar nativo di Linux per eseguire il backup:

# prepara il nuovo archivio, non esiste, incrementale
tar zcpvf $DESTINAZIONE/bk-$DATE_FILE.tgz $SORGENTI

Rimuovo il file di log se presente. La serie di questi comandi sono utili per avere un log del Backup da inviare all’emai definita precedentemente nelle variabili.

rm $DIRSNAR/avviso.log

Scrivo il log del Backup:

RIGA1="***************************\n"
RIGA2="*** NOTIFICA DI BACKUP  ***\n"
RIGA3="***************************\n"
RIGA4="\n"
RIGA5="Backup eseguito correttamente - $DATE_MAIL ore $TIME_MAIL\n"
RIGA6="\n"
RIGA7="Questo Backup ha creato un file incrementale nel server NAS.\n"
RIGA8="File creato: bk-$DATE_FILE.tgz\n"
RIGA9="Server di destinazione: $DESTINAZIONE/\n"
RIGA10="\n"
RIGA11="-------------------------------------------\n"
RIGA12="Powerwd by Andrea Patron - Email: andrea.patron@digitaldesign.it\n"
RIGA13="\n\n"
 
MAIL_BODY="$RIGA1$RIGA2$RIGA3$RIGA4$RIGA5$RIGA6$RIGA7$RIGA8$RIGA9$RIGA10$RIGA11$RIGA12$RIGA13"
 
echo $MAIL_BODY >> $DIRSNAR/avviso.log
# Invio email di segnalazione
mail -s "Notifica backup" $MIAMAIL < $DIRSNAR/avviso.log

Una volta terminata la scrittura del file, lo salviamo nella stessa posizione della directory di origine DIRSNAR.

2. Fase. Schedulare l’avvio del comando

Con questo sistema permettiamo di avviare il comando di Backup automatico, deciso da noi. Io ho optato per un avvio giornaliero. Per fare ciò esiste il Linux, e tutte le distro lo mantengono, si usa il demone Cron, che scrive effettivamente su una tabella di scheduling. Noi lo potremmo anche settare a mano da shell Linux, ma per convenienza opereremo con Webmin, il programma di gestione del server.

Quindi apriamo Webmin dal nostro Browser, dal menù accediamo alla sezione

Sistema > Pianificazione Cron Job

Nel campo Comando inseriamo la dicitura: “/root/backup/bk_web.sh ”
E configuriamo lo scheduler come noi vogliamo. Io l’ho impostato quotidianamente alle 2:00:00 di notte.

Potete salvare o volendo, eseguire subito il comando.
In questo modo otterrete un sistema automatizzato del Backup Intelligente.

Potete scaricare lo script Bash completo, direttamente da qui: File della guida bk-web.zip

9 Commenti

  1. Fabio

    Ciao Andrea,
    Articolo decisamente interessante.
    Ti devo dire che questo script minimale si adatta a molti usi che non sto qua a dirti, linux in questo è sempre stato da esempio, ma una cosa ti volevo chiedere, se puoi.

    Io lo sto testando in un computer per crearmi il backup di una partizione dati di primaria importanza: ho tutto li dentro con lo spazio che adesso ha raggiunto i 15 GB.

    Come destinazione uso un disco esterno che per mie ragioni l’ho formattato con una fat32.

    Ora la mia domanda è questa.
    Il backup va bene solo quando i nomi delle cartelle e dei file sono esclusivamente composti da una sola parola. Se nella compressione viene compressa una cartella o file con uno spazio (es: ‘AREA MANAGER’) allora il backup risulterà vuoto!

    Tu che ne pensi?

    Reply
    1. andrea.patron (Post author)

      Con la creazione di un NAS ottieni migliori risultati. Hai sempre una partizione a tua disposizione sempre via rete, magari configurando un disco di rete e montandolo nel sistema. Dopo anni d’utilizzo, ottenendo buoni risultati, ho migrato lo stesso sietema anche su ambiente Windows, eseguendo in operazioni pianificate un file batch… Diamo sfogo alla creatività!!

      Reply
      1. marco

        Ciao come posso fare a fare un backup completo di tutti i file escludendo alcune cartelle? TIPO:
        SORGENTI=’/’
        ESCLUDERE=’/mnt/

        (visto che dentro a mnt c’è il mio nas…)

        Reply
        1. andrea.patron (Post author)

          E’ più semplice di quanto creda: Il comando Tar ha un’opzione –exclude che permette di escludere le sottodirectory desiderate.
          http://stackoverflow.com/questions/4290174/excluding-directory-when-creating-a-tar-gz-file

          Reply
  2. Fabio

    Giorni addietro ho presentato una richiesta per avere maggiori info sullo script postato per via di problemi riscontrati sul mio file system di Linux in una partizione di fat32 esterna.

    E volevo comunque parteciparlo per rispondere alla richiesta citata dicendo che lo script è perfettamente corretto e dicendo anche che non tutti i file system sono uguali allo stesso modo.

    Grazie per la divulgazione, io ora ho realizzato il mio backup personale con tar e mi sto già preparando per migliorarlo ancora.

    Fabio

    Reply
    1. andrea.patron (Post author)

      Grazie fabio per il sostegno alllo script. a volte si ottengono risultati migliori, con semplicità derivate da gesti semplici!!

      Reply
  3. Mario

    Ciao Fabio: se salvi su fat32 hai solo 2 limiti:
    Il file di destinazione deve esser spezzato ogni 2gb
    Il nome file, per garantrne la leggibilità non deve superare i 256 carattere (tra cartelle, nome file ed estensione).
    Ovvero la lunghezza va considerata su tutta la stringa che vedi qui sotto (la lunghezza è pari a 46 nell’esempio)
    \primacartella\secondacartella\file.estensione

    Reply
  4. Mario

    @Andrea una nota:
    #!/bin/sh potrebbe non esser la scelta corretta se fai uno script bash dipendente.
    /bin/sh è spesso bash, ma non è una certezza.
    Sarebbe più sensato mettere:
    #!/bin/bash

    Reply
    1. andrea.patron (Post author)

      @Mario
      Dipende dai punti di vista ed di utilizzo. In questo caso va bene così.

      Reply

Lascia un Commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

CAPTCHA Image[ Immagine differente ]

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.