Migliorare questo script di backup

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
jepessen
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3569
Iscrizione: lunedì 26 dicembre 2005, 11:49
Desktop: KDevelop
Distribuzione: Ubuntu 20.04
Sesso: Maschile
Località: Somma Lombardo

Migliorare questo script di backup

Messaggio da jepessen »

Bene, direi che finalmente ho finito lo script di backup, utilizzando il comando dar, che dovrebbe finire nel mio wiki.

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
Compiz l'ha creato Chuck Norris quando ha colpito un computer con un calcio rotante.
http://www.renderosity.com/mod/gallery/ ... e=Jepessen
http://jepessen.wordpress.com/
Avatar utente
4maggio
Prode Principiante
Messaggi: 186
Iscrizione: giovedì 19 gennaio 2006, 9:08
Località: Terlizzi
Contatti:

Re: Migliorare questo script di backup

Messaggio da 4maggio »

In pratica, io sono abituato a fare il backup di tutto linux e non solo della home. Il problema è che alcune cartelle devono essere eliminate quale /proc /sys e /media. Mi dici dove si settano i parametri per eliminarli?

Inoltre ti faccio vedere lo script che ho creato io per fare il backup usando pero tar. Vedi che cosa ti può servire:

Codice: Seleziona tutto

#! /bin/bash
num=$#
function cartellabackup {
	echo "La cartella di default dei backup è /media/dati/Backup. Premere y per usare quella di default, 	altrimenti indicare quella desiderata"
	echo  "Indicare la cartella dei backup (la cartella deve esistere):"
	read cartella
	if [[ $cartella -eq y ]];
	then 
		cartella=/media/dati/Backup
	else
		sleep 1;
	fi
}
function backupfunction  {
			sudo apt-get upgrade
			sudo apt-get clean
			sudo apt-get autoremove
			#sudo cpufreq-selector -g performance
			cartellabackup
			cd $cartella
			echo "Creazione file di Backup $backup ..."
			espeak  "Creation File Backup"
			if [[ $verb -eq 0 ]];
			then
				sudo tar -cvjpf $backup --exclude=/proc --exclude=/lost+found --exclude=/media --exclude=/mnt --exclude=/sys /   &>/dev/null;
			else
				sudo tar -cvjpf $backup --exclude=/proc --exclude=/lost+found --exclude=/media --exclude=/mnt --exclude=/sys /   
			fi	
			echo "File creato: $backup"
			espeak  "Creation File Complete"
			echo  "Verifica integrità del file di $backup "
			espeak "Verify integrity"
			if [[ $verb -eq 0 ]];
			then
				tar -tf $backup &>/dev/null
			else 
				tar -tf $backup
			fi
			if [[ $? -eq 0 ]];
			then
               			echo " Ok"
               			espeak  "Integrity check completed"
			else
        		        echo " Fallita"
        		        espeak  "Integrity check failed"
			fi
			#sudo cpufreq-selector -g powersave

}
function backupman {
			echo  ""
			echo  "La sintassi del comando è: backup operazione verberosemode"
			echo  "" 
			echo  "" 
        		echo  "Le operazioni possibili sono:"
			echo  "" 

			echo  "create 0/1"
			echo  "          Creare il file di backup (il file creato sara del tipo backup-04ago08.tar.bz2). Con 0 viene disattivato il mode verberose. Con 1 viene invece attivato."
			echo  ""  
			echo  "create nomefile 0/1"
			echo  "          Creare il file di backup nomefile.tar.bz2 (il file creato sara del tipo nomefile.tar.bz2) Con 0 viene disattivato il mode verberose. Con 1 viene invece attivato. "
			echo  "	  Non bisogna specificare l'estensione tar.bz2 "
			echo  "" 			
			echo  "verify nomefile.tar.bz2 0/1"
			echo  "          Verificare l'integrità del file di backup nomefile.tar.bz2. Con 0 viene disattivato il mode verberose. Con 1 viene invece attivato."
			echo  "" 			
			echo  "install nomefile.tar.bz2"
			echo  "          Estarre il file di backup nomefile.tar.bz2"
			echo  ""
			exit 1	
}


case $1   
		in 
		create) 
		if [[ $num -eq 1 ]]
		then
			backup=backup-$(date +%d%b%y).tar.bz2
			verb=0
			backupfunction $backup $verb
		elif [[ $num -eq 2 && $2 -eq 1 ]];
		then
			echo "Verberose Mode"
			backup=backup-$(date +%d%b%y).tar.bz2
			verb=1
			backupfunction $backup $verb
		elif [[ $num -eq 2 && $2 -eq 0 ]];
		then
				backup=$2.tar.bz2
				verb=0
				backupfunction $backup $verb
		elif [[ $num -eq 3 && $3 -eq 1 ]];
		then
				echo "Verberose mode"
				backup=$2.tar.bz2
				verb=1
				backupfunction $backup $verb
		else
				backupman 			
		fi
	;; 
		verify) 
		cartellabackup
		cd $cartella
		#sudo cpufreq-selector -g performance
		if [[ $num -eq 3 ]]
		then
			backup=$2
			verb=$3
			echo  "Verifica integrità del file di $backup "
			espeak "Verify integrity"
			if [[ $verb -eq 0 ]];
			then
				tar -tf $backup &>/dev/null
			elif [[ $verb -eq 1 ]];
			then
				echo "Verberose Mode"
				tar -tf $backup
			else
				backupman
				#sudo cpufreq-selector -g powersave
			exit 1
			fi
			if [[ $? -eq 0 ]];
			then
               			echo " Ok"
               			espeak  "Integrity check completed"
			else
        		        echo " Fallita"
        		        espeak  "Integrity check failed"
			fi
		elif [[ $num -eq 2 ]]; 
		then
			backup=$2
			echo  "Verifica integrità del file di $backup "
			espeak "Verify integrity"
			tar -tf $backup &>/dev/null
			if [[ $? -eq 0 ]];
			then
               			echo " Ok"
               			espeak  "Integrity check completed"
			else
        		        echo " Fallita"
        		        espeak  "Integrity check failed"
			fi
		else
			backupman
		fi
		#sudo cpufreq-selector -g powersave
	;;
		install)
		cartellabackup
		cd $cartella
		#sudo cpufreq-selector -g performance
		backup=$2
		echo  "Decompressione dell'archivio di backup..."
		espeak  "Decompression start"
		sudo tar -xvpzf $backup -C /
		espeak  "Decompression finish"
		echo  "Decompressione terminata"
	;;
		*)
		backupman
        ;;
esac



ciao davide
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti