Questo è lo script, e prima di metterlo online vorrei suggerimenti per migliorarlo, se è possibile.
Codice: Seleziona tutto
#########################
# SCRIPT BACKUP CON DAR #
#########################
# Questo script vi permette di creare dei backup
# personalizzati utilizzando il comando dar, più
# versatile rispetto a tar per quanto riguarda il
# backup su disco invece che su nastro.
# Lo script è creato in maniera non-interattiva, per
# permetterne l'integrazione con cron.
#
# Lo script crea, nella cartella in cui si effettua il
# backup, varie sottocartelle, ognuna contenente un backup,
# sia esso differenziale o completo. Questo perchè ogni backup
# può essere formato da diversi files, e questo ne aumenta
# l'organizzazione, anche se ci fermiano ad un livello per non
# complicare troppo le cose.
### CONFIGURAZIONE ###
# Cartella di cui effettuare il backup
HOME_DIR=/home/utente
# Percorso in cui andremo ad effettuare il backup
BACKUP_DIR=/media/disco_backup/backup_dar
# Nome base del file di backup
BACKUP_NAME=home_backup
# Dimensione massima di uno slice
BACKUP_SLICE_SIZE=600M
# Suffisso per il backup completo
BACKUP_COMPLETE_SUF="_comp"
# Suffisso per il backup differenziale
BACKUP_DIFFERENTIAL_SUF="_diff"
# Numero di backup (totale+differenziali), prima della
# creazione del successivo backup completo
BACKUP_INTERVAL=3
# Testare il backup
BACKUP_TEST="yes"
# Lista di path da escludere dal backup
EXCLUDED_PATH[0]=Temp
EXCLUDED_PATH[1]=Compilare
EXCLUDED_PATH[2]=Download
# Conservare i percorsi delle directory escluse dal backup
# L'array precedente specifica che non deve essere effettuato
# il backup dei file contenuti in queste directory, ma a volte
# è utile conservare la gerarchia, per evitare di doverle rifare
# a mano
INCLUDE_EXCLUDED_PATH="no"
# Lista dei pattern di file da escludere
EXCLUDED_FILE_PATTERN[0]="*.tmp"
EXLUDED_FILE_PATTERN[1]="~*"
# Utilizzare la compressione durante il backup
USE_COMPRESSION="yes"
# Tipo di compressione: scegliere fra gzip oppure bzip2
COMPRESSION_TYPE="bzip2"
# Livello di compressione: 0-9
COMPRESSION_LEVEL=6
# Dimensione minima di un file per dover essere compresso
COMPRESSION_MINIMUM_FILE_SIZE=512
# Modalità verbose
VERBOSE="yes"
# Pattern dei files da non comprimere
NOT_COMPRESSED_FILES[0]="*.mp3"
NOT_COMPRESSED_FILES[1]="*.jpg"
NOT_COMPRESSED_FILES[2]="*.zip"
NOT_COMPRESSED_FILES[3]="*.rar"
NOT_COMPRESSED_FILES[4]="*.png"
NOT_COMPRESSED_FILES[5]="*.gz"
NOT_COMPRESSED_FILES[6]="*.gzip"
### ESECUZIONE DELLO SCRIPT ###
# Analizziamo il contenuto della cartella di backup, per
# contare il numero di backup differenziali, se ce ne sono,
# e decidere se creare un backup completo o differenziale.
# Contiamo il numero di directory di backup
NUM_DIR=`ls -F ${BACKUP_DIR} | grep -c ${BACKUP_NAME}.*./`
# Calcoliamo il modulo fra il numero di directory di backup
# e quelle necessarie al prossimo backup completo
let "MOD=$NUM_DIR % BACKUP_INTERVAL"
# Se questo valore è pari a 0, o non esiste il backup
# oppure abbiamo raggiunto il limite dei backup differenziali
# per cui dobbiamo creare un backup completo
# altrimenti creiamo il suffisso del backup differenziale
# con il numero associato
if [[ $MOD = "0" ]]
then
SUF=${BACKUP_COMPLETE_SUF}
else
SUF=${BACKUP_DIFFERENTIAL_SUF}_${MOD}
DIFF_OPTION=`ls ${BACKUP_DIR} | grep ${BACKUP_NAME}.*.${BACKUP_COMPLETE_SUF} | tail --lines=1`
# echo ${SUF}
# echo ${MOD}
echo ${DIFF_OPTION}
# echo ${BACKUP_DIR}/${DIFF_OPTION}/${DIFF_OPTION}
fi
# Path completo della directory di backup
BACKUP_COMPLETE_PATH=$BACKUP_DIR/${BACKUP_NAME}_`date -I`${SUF}
# creazione della directory di backup
mkdir $BACKUP_COMPLETE_PATH
# Esecuzione del backup con tutte le opzioni del caso
dar \
-R ${HOME_DIR} \
-c ${BACKUP_COMPLETE_PATH}/${BACKUP_NAME}_`date -I`${SUF} \
-s ${BACKUP_SLICE_SIZE} \
`if [[ ${USE_COMPRESSION} = "yes" ]]
then
if [[ ${COMPRESSION_TYPE} = "bzip2" ]]
then
echo -y${COMPRESSION_LEVEL}
else
echo -z${COMPRESSION_LEVEL}
fi
for i in "${NOT_COMPRESSED_FILES}"
do
echo -Z $i
done
fi` \
`if [[ ${VERBOSE} = "yes" ]]
then
echo -v
fi` \
`if [[ ${INCLUDE_EXCLUDED_PATH} = "yes" ]]
then
echo -D
fi` \
`for i in "${EXLUDED_PATH[@]}"
do
echo -P $i
done` \
`for i in "${EXCLUDED_FILE_PATTERN[@]}"
do
echo -X $i
done` \
`if [[ ${MOD} -ne "0" ]]
then
echo -A ${BACKUP_DIR}/${DIFF_OPTION}/${DIFF_OPTION}
fi`
# Test del backup
if [[ $BACKUP_TEST="yes" ]]
then
dar -t ${BACKUP_COMPLETE_PATH}/${BACKUP_NAME}_`date -I`${SUF}
fi
exit 0
In pratica, nella sezione iniziale specifico le opzioni del backup. Siccome ci sono opzioni che si possono ripetere (tipo -Z pattern1 -Z pattern2) ho utilizzato pure degli array per specificare tutti i pattern necessari per le opzioni. Ho incluso anche un'opzione per il test finale del backup.
Lo script, nella cartella di backup, crea prima di tutto un backup completo e poi, nelle volte successive, backup differenziali, ognuno basato sull'ultimo completo. Questo mi evita di ripristinare a cascata tutti i backup, ma solo quello completo ed il differenziale del giorno di cui voglio estrarre l'eventuale file. Dopo un numero specificato di backup differenziali, ricomincia un nuovo backup completo.
Ci sono un paio di cosette, però che vorrei migliorare.
Prima di tutto, una cosa banale: mi serve l'exit status di errore, nel caso non si possa accedere alla cartella di backup, per non generare la successiva sfilza di errori.
Un'altra cosa, più bastarda, che voglio migliorare è la seguente: in pratica, io nomino le cartelle di backup come nomebackup_databackup_suffisocompletooppuredifferenziale_numerodibackupdifferenziale.
Adesso, per esempio setto il numero di backup differenziali a 3, quindi creo un backup completo, poi tre differenziali, e poi il successivo sarà un altro backup completo. Se il secondo backup completo viene effettuato, per qualche motivo, lo stesso giorno del precedente (come è capitato a me durante il test dello script), il nome della cartella è lo stesso, e spunta un warning. Ora, semplicemente mi basterebbe modificare lo script in maniera tale da dare sempre risposta affermativa, ma preferivo testare il backup prima di cancellare il precedente, per avere maggiore sicurezza.
Così, invece, sovrascrito il vecchio backup, quello nuovo ha errori, ed in pratica sono senza backup, non so se mi spiego. Ecco, non so come gestire questa situazione. Voi che consigliate?
Poi mi servirebbero altri suggerimenti generali...
Per il ripristino, ho uno script diverso, dove in mancanza d'argomenti effettuo il ripristino dell'ultimo backup, oppure posso specificare i pattern dei files da ripristinare (eventualmente un solo file) ed anche la data, se non voglio l'ultima versione. Però ancora è da testare, e vorrei concentrarmi su questo per adesso.
Daniele
