Shell Script : Sistema Desatendido de Backup basado en TAR (Linux/*nix)

Seguramente tendrás información sensible en la computadora. Quizá desarrolles, o escribas, o tengas fotos, gráficos, datos...bash

Provablemente, ésta información quieras conservarla... Y provablemente tengas un disco duro externo para backups. No queremos perder ésta información, ¿no?

El backup es el método más fiable de recuperación de desastres. El script que creé, está basado en el comando tar, es desatendido (se configura una vez y listo!),

y permite la creación de copias incrementales y completas según el día de la semana que hayamos configurado.

Sólo tendrás que lanzarlo cuando quieras y él se encargará del resto.

Obviamente, si no quieres lanzar tu mismo el comando, tendrás que crear el cronjob correspondiente y tener el soporte que utilices conectado contínuamente.

De forma predeterminada, se asume que el script funciona en en un disco duro externo. Se podría adaptar a cinta magnética o similares.

Asegúrate de tener siempre espacio suficiente en disco, de otra forma, podría fallar tu copia. Sin más preámbulo, ahí va el script...

#!bin/bash

getbin()
{
	echo "`whereis $1|tr ' ' '\n'|grep bin`"
}


# Editar esto
#-----------------------------------------------------------------
TMPFOLDER=/home
LOGFOLDER=bkplog
BKPFOLDER=TarBackups
# Incremental backup LMXJVS "1-Lunes, 2-Martes, 3-Miercoles, 4-Jueves, 5-Viernes, 6-Sábado" 
INCREMENTAL="123456"
# Full backup "7-Domingo" 
FULL="7"

# No editar a partir de aquí
#-----------------------------------------------------------------

TAR=`getbin tar`
GZIP=`getbin gzip`
GUNZIP=`getbin gunzip`


TODAY=`date +"%u"`
OPTIONS=""

print_banner()
{
	echo ""
	echo "----------------------------------------"
	echo "| Automated tar-based Backup System    |"
	echo "----------------------------------------"
	echo ""
}



#
#  La función tarmirror admite 2 parámetros :
#
#	@parámetro1 : El directorio o carpeta, desde el que haremos backup de otras carpetas
#		      incluídas en ésta(e)
#	@parámetro2 : Los subdirectorios que bajan del anterior parámetro, 
#		      separados por comas y sin espacios 
#		      (para ello es conveniente poner éste parámetro entre comillas)
#

tarmirror()
{

for f in `echo $2|tr ',' '\n'`
do 

#
# Generate Backup Options
#
LOGFILE="$BKPFOLDER/$f.inc"

#
# Create logfiles subfolders
#
PTMP=`echo $LOGFILE|sed -e 's/\/[^\/]*$//'`
if [ -n "$PTMP" -a ! -d "$PTMP"  -a ! -f "$PTMP" ] ; then
		mkdir -p $PTMP
fi

#
# Elegimos tipo de copia de seguridad según el día
#

if [ -n "`echo $INCREMENTAL|grep $TODAY`" ] ; then
	BACKUP="Incremental"
#  
# Si no existe una copia completa, se crea sola
#
	if [ ! -f $LOGFILE ] ; then
		BACKUP="Full"
		echo "No existe $f full backup, creando..."
	fi
else
	BACKUP="Full"
fi

#
# Generación de Opciones de tar
#

if [ "$BACKUP" == "Incremental" ] ; then

#
# Incremental Backup
#
	BFOLDER="$BKPFOLDER/Incremental/$f"

# Si no existe la carpeta destino, se crea
	if [ ! -d "$BFOLDER" ] ; then
		mkdir -p $BFOLDER
	fi

# Cual es el número de la siguiente copia?
	if [ -d "$BFOLDER" -a -n "`echo $BFOLDER|grep -q \.`" ] ; then
		
		NEXT=`find $BFOLDER/ -print|sort -n|tail -1|sed -e 's/\/\([^\/]*\)$/\1/'|cut -f2 -d'.'`
		NEXT=`echo "${NEXT}+1"|bc`

		if [ -z "$NEXT" ] ; then
			NEXT="1"
		fi
	else
		NEXT="1"
	fi
	
#  
# Ajustamos las opciones, en listed-incremental va el índice de copias de seguridad 
# que se consultará para cada incremental
#
	OPTIONS=" --create --preserve-permissions --gzip --listed-incremental=$LOGFILE --file=$BFOLDER/`echo $f|sed -e 's/\/\([^\/]*\)$/\1/'`.$NEXT.tar.gz "

else

#
# Full Backup
#
 
	BFOLDER="$BKPFOLDER/FullCopy/$f"

# Si no existe la carpeta destino, se crea
	if [ ! -d "$BFOLDER" ] ; then
		mkdir -p $BFOLDER
	fi

# Cual es el número de la siguiente copia?	
	if [ -d "$BFOLDER" -a -n "`echo $BFOLDER|grep -q \.`" ] ; then
		
		NEXT=`find $BFOLDER/ -print|sort -n|tail -1|sed -e 's/\/\([^\/]*\)$/\1/'|cut -f2 -d'.'`
		NEXT=`echo "${NEXT}+1"|bc`

		if [ -z "$NEXT" ] ; then
			NEXT="1"
		fi
	else
		NEXT="1"
	fi


#  
# Ajustamos las opciones, en listed-incremental va el índice de copias de seguridad 
# que se consultará para cada incremental
#
	OPTIONS=" --create --preserve-permissions --gzip --level=0 --listed-incremental=$LOGFILE --file=$BFOLDER/`echo $f|sed -e 's/\/\([^\/]*\)$/\1/'`.$NEXT.tar.gz "

fi

	echo ">> $BACKUP $1"

# Crea nuestro archivo tar correspondiente
	if [ -f $f.tar.gz ]
	then
		echo "Error: $f.tar.gz exists, skipping..."
	else
		echo "Creando $f.tar.gz..."
		$TAR $OPTIONS $1/$f
	fi

done

}



print_banner

# Editar esto
#-----------------------------------------------------------------

#
#  La función tarmirror admite 2 parámetros :
#
#	@parámetro1 : El directorio o carpeta, desde el que haremos backup de otras carpetas
#		      incluídas en ésta(e)
#	@parámetro2 : Los subdirectorios que bajan del anterior parámetro, 
#		      separados por comas y sin espacios 
#		      (para ello es conveniente poner éste parámetro entre comillas)
#

#  |----Esta es la llamada a la función, añadir las llamadas que procedan
#  V
tarmirror /opt "lampp,Programas"

#
#  Está permitido también poner otro(s) directorio(s) antes del directorio final, 
#

tarmirror /home/javitux "Documentos/Ofimatica,Documentos/trabajos,Imágenes"
#-----------------------------------------------------------------

echo "all done!"
exit 0

Muestra de la ejecución del script


root@stoned:/media/CD3E-3326# ./gobkp.sh 

----------------------------------------
| Automated tar-based Backup System    |
----------------------------------------

No existe lampp full backup, creando
>> Full /opt
Creando lampp.tar.gz...
No existe Programas full backup, creando
>> Full /opt
Creando Programas.tar.gz...
/bin/tar: Eliminando la `/' inicial de los nombres
No existe Documentos/Ofimatica full backup, creando
>> Full /home/javitux
Creando Documentos/Ofimatica.tar.gz...
/bin/tar: Eliminando la `/' inicial de los nombres
No existe Documentos/trabajos full backup, creando  
>> Full /home/javitux
Creando Documentos/trabajos.tar.gz...
/bin/tar: Eliminando la `/' inicial de los nombres
No existe Imágenes full backup, creando  ...
>> Full /home/javitux
Creando Imágenes.tar.gz...
/bin/tar: Eliminando la `/' inicial de los nombres
all done!

El sistema de archivos del soporte de almacenamiento queda así tras 2 ejecuciones:

TarBackups/
TarBackups/FullCopy
TarBackups/FullCopy/lampp
TarBackups/FullCopy/lampp/lampp.1.tar.gz
TarBackups/FullCopy/Programas
TarBackups/FullCopy/Programas/Programas.1.tar.gz
TarBackups/FullCopy/Documentos
TarBackups/FullCopy/Documentos/Ofimatica
TarBackups/FullCopy/Documentos/Ofimatica/DocumentosOfimatica.1.tar.gz
TarBackups/FullCopy/Documentos/trabajos
TarBackups/FullCopy/Documentos/trabajos/Documentostrabajos.1.tar.gz
TarBackups/FullCopy/Imágenes
TarBackups/FullCopy/Imágenes/Imágenes.1.tar.gz
TarBackups/lampp.inc
TarBackups/Programas.inc
TarBackups/Documentos
TarBackups/Documentos/Ofimatica.inc
TarBackups/Documentos/trabajos.inc
TarBackups/Imágenes.inc
TarBackups/Incremental
TarBackups/Incremental/lampp
TarBackups/Incremental/lampp/lampp.1.tar.gz
TarBackups/Incremental/Programas
TarBackups/Incremental/Programas/Programas.1.tar.gz
TarBackups/Incremental/Documentos
TarBackups/Incremental/Documentos/Ofimatica
TarBackups/Incremental/Documentos/Ofimatica/DocumentosOfimatica.1.tar.gz
TarBackups/Incremental/Documentos/trabajos
TarBackups/Incremental/Documentos/trabajos/Documentostrabajos.1.tar.gz
TarBackups/Incremental/Imágenes
TarBackups/Incremental/Imágenes/Imágenes.1.tar.gz

 

-> Para su utilización, debereis situar el script en el mismo disco de backups y ejecutarlo desde ahí, después de editarlo con las opciones que necesiteis configurar.

-- Principalmente, es conveniente situarlo ahí por seguridad; para que no nos modifiquen el script.

-> Son Configurables : Días de la semana que se realizará backup incremental o completo, qué directorios y subdirectorios se añadirán, nombre del directorio de backup, básicamente.

Podeis modificarlo y adaptarlo a vuestro gusto y según vuestras necesidades de uso.

El comando tar se puede utilizar sin problemas para restaurar archivos, pero en el futuro crearé otro script para restaurar copias.

Mientras tanto, os dejo un enlace con ayuda sobre el comando tar, por si teneis que restaurar copias http://www.gnu.org/s/automake/manual/tar/tar_toc.html

Las opciones que interesan, son las que aparecen en la variable $OPTIONS

 

 

Cualquier duda, consulta, bug... no dudeis en postear un comentario.

Os contestaré en cuanto lo vea.

Gracias por la visita y que disfruteis del script.

 

NOTA.:Remarcar, que éste script, lo creé para uso personal y se ajusta a mis necesidades, lo pongo aquí por si a alguien más le pudiera servir pero no es una solución profesional, más bien "quick n' dirty code". (al menos creo que libre de errores, si encontrais alguno, hacedmelo saber)

 

-- Javitux (c) 2011

Tags: 

Comentarios

Ayuda para entender

Hola muy buenos dias de antemano le doy las gracias por proporcionar el codigo d backup que se me hace realmente bueno, le escribo para preguntar si dispondria un poco de su tiempo ya que soy nuevo en programacion y mis conocimientos no son muchos, estoy tratando de entender en que parte del codigo se se localiza los directorios que van hacer respaldados y en donde los guarda,  seria tan amable de ayudarme a entender esa parte gracias...

 

saludos

Añadir nuevo comentario