Actualizado : lunes, 09 de febrero de 2009
Hoy público en script que tenía hace tiempo funcionando pero muy mal estructurado, hoy he estado puliendolo y creo que esta suficientemente presentable como para publicarlo. Esta basado en bash (no es necesario python para nada) y la idea es poder hacer copias incrementales de la forma más fácil posible. (sin parametros o pocos parametros con buenos valores por defecto).
El script se puede ejecutar con 0, 1 o 2 parametros:
- 0 parametros : si simplemente ejecutamos el script, sin parametros, considerará que quieres hacer una copia de seguridad del directorio de trabajo actual. Si el directorio activo es por ejemplo: /home/makiolo/descargas se creara el directorio copia_de_descargas con la copia principal y las copias incrementales.
- 1 parametros : si no queremos especificar el directorio que queremos salvar de forma implicita (por directorio de trabajo), sencillamente pasamos la ruta del directorio que queremos salvar(absoluta o relativa) como primer parametro. Se creara en el mismo directorio que queremos salvar la carpeta copia_de_$nombre con la copia principal y las copias incrementales. Como he dicho las rutas pueden ser relativas o absolutas, pero es recomendable las absolutas pero definitivamente evitar el determinismo del directorio de trabajo.
- 2 parametros : Tener la copia de seguridad junto original no es muy útil si sufrimos una perdida de información. Es evidentemente recomendable tener la copia en un disco distinto al original. Por tanto:
- 1er parametro : carpeta que queremos salvar.
- 2º parametro : destino de la copia de seguridad
- Alguna cosas más importantes:
- .rsyncExcluir : se hace un listado de directorios y archivos que se excluyen de la copia de seguridad. Si no existe se crea excluyendo a si mismo y al destino de la copia de seguridad. Para evitar hacer una copia de la copia :/
- En copia_de_$nombre/principal/ : Esta es la copia más reciente, y si ejecutas tu comando con cierta frecuencia es una copia exacta del original.
- En copia_de_$nombre/incrementales/ : Se crea un incremental por día, (excepto si en ese día no hubo cambios). Tal y como esto en AÑO-MES-DIA, no sería dificil cambiar el date para realizar otro tipo de partición. Si especificamos hora y minuto podría ser excesivamente particionado. Podríamos cambiar el script para agrupar por otros criterios, por ejemplo fecha+turno (grupo de mañana o de tarde), o por numero de la semana si las copias de seguridad son semanales. En los incrementos solo se guarda el cambio respecto al principal que se hizo ese día.
- Asi que simplemente hacer gedit copiaSeguridad , copy & paste y darle permisos.
#!/bin/sh # # :: Invasion Tux # :: Ultima modificacion : lunes, 09 de febrero de 2009 # :: Script realizado por makiolo (makiolo@gmail.com) (Licencia Creative Commons con reconocimiento) # :: Ultima version : https://blogricardo.wordpress.com/2009/02/08/script-para-hacer-copias-de-seguridad-incrementales # :: Dependencias : rsync # ################################# VARIABLES ############################################## if [ $# -eq 0 ]; then # Directorio que queremos salvar DIRECTORIO_A_SALVAR=`pwd` # construir nombre subdirectorio NOMBRE_MES_ANIO=`date +"el_mes_%m_del_%Y"` NOMBRE_SALVADO=`basename $DIRECTORIO_A_SALVAR` SUB_DIRECTORIO_A_SALVAR="copia_de_"$NOMBRE_SALVADO"_en_"$NOMBRE_MES_ANIO # directorio donde se guarda el backup DESTINO_DE_LA_COPIA=$DIRECTORIO_A_SALVAR/$SUB_DIRECTORIO_A_SALVAR elif [ $# -eq 1 ]; then # Directorio que queremos salvar DIRECTORIO_A_SALVAR=$1 # construir nombre subdirectorio NOMBRE_MES_ANIO=`date +"el_mes_%m_del_%Y"` NOMBRE_SALVADO=`basename $DIRECTORIO_A_SALVAR` SUB_DIRECTORIO_A_SALVAR="copia_de_"$NOMBRE_SALVADO"_en_"$NOMBRE_MES_ANIO # directorio donde se guarda el backup DESTINO_DE_LA_COPIA=$DIRECTORIO_A_SALVAR/$SUB_DIRECTORIO_A_SALVAR elif [ $# -eq 2 ]; then # Directorio que queremos salvar DIRECTORIO_A_SALVAR=$1 # construir nombre subdirectorio NOMBRE_MES_ANIO=`date +"el_mes_%m_del_%Y"` NOMBRE_SALVADO=`basename $DIRECTORIO_A_SALVAR` SUB_DIRECTORIO_A_SALVAR="copia_de_"$NOMBRE_SALVADO"_en_"$NOMBRE_MES_ANIO # directorio donde se guarda el backup DESTINO_DE_LA_COPIA=$2/$SUB_DIRECTORIO_A_SALVAR else echo "Numero de parametros incorrecto" exit fi # Archivos donde listamos las exlusiones de la backup FICHERO_DE_EXCLUSION=$DIRECTORIO_A_SALVAR/.rsyncExcluir # subdirectorio donde se guarda la copia principal COPIA_PRINCIPAL=$DESTINO_DE_LA_COPIA/principal # subdirectorios donde se guardan las copias incrementales COPIA_INCREMENTOS=$DESTINO_DE_LA_COPIA/incrementales # ruta variable de copias incrementales COPIA_INCREMENTOS_VARIABLE=$COPIA_INCREMENTOS/`date | awk '{print $3}'` # opciones de rsync , mejor no tocar OPCIONES="--force --ignore-errors --delete --delete-excluded \ --exclude-from=$FICHERO_DE_EXCLUSION --backup --backup-dir=$COPIA_INCREMENTOS_VARIABLE -av" ################################# FUNCIONES ############################################## ejecutarRsync() { if [ ! -f $FICHERO_DE_EXCLUSION ]; then echo `basename $DESTINO_DE_LA_COPIA`"/" > $FICHERO_DE_EXCLUSION echo ".rsyncExcluir" >> $FICHERO_DE_EXCLUSION echo "*~" >> $FICHERO_DE_EXCLUSION fi rsync $OPCIONES $DIRECTORIO_A_SALVAR $COPIA_PRINCIPAL } ################################# MAIN ############################################## # nos aseguramos de que existen los directorio de destino de la copia de seguridad mkdir -p $DESTINO_DE_LA_COPIA mkdir -p $COPIA_PRINCIPAL mkdir -p $COPIA_INCREMENTOS if [ ! -d $DIRECTORIO_A_SALVAR ]; then echo "No se encontro el directorio a salvar : $DIRECTORIO_A_SALVAR"; elif [ ! -d $DESTINO_DE_LA_COPIA ]; then echo "No se encontro el directorio de destino de la copia : $DESTINO_DE_LA_COPIA"; else ejecutarRsync fi
Es un script excelente para combinarlo con un cron 24h.
Si no entendeis para que sirve el script o no sabeis que es una copia incremental –> google xD, no hombre podeis preguntarmelo y eso xD
Tambien si encontrais algún bug os lo agradeceré mucho que lo comenteis.
Filed under: bash, comandos, Linux, programación, script, seguridad | Tagged: copia seguridad, rsync, script | 3 Comments »