#4sysadmins

Inicio » GNU/Linux » Backups con tar: fullbackups, incrementales y diferenciales

Backups con tar: fullbackups, incrementales y diferenciales

Últimas Entradas

Follow #4sysadmins on WordPress.com

Copias de seguridad

El objetivo es aprender las diferencias entre los distintos tipos de copias de seguridad (full, diferenciales e incrementales), aprender a programar tareas mediante shell script (en este caso un programa que genere copias de seguridad por si solo mediante el comando tar y nos notifique vía email) y  por último crear un usuario restringido con el que generar y guardar estas copias de forma ‘aislada‘ en una unidad USB o disco duro externo.

Para no extender esta entrada demasiado la he dividido en tres partes. El motivo de estas tres entradas es poner en práctica los conocimientos obtenidos en el Capítulo 9 – El entorno de consola, shell scripts, el correo electrónico y uso básico de SQL de la guía de estudios para LPIC-1 400, así como la creación de usuarios Capítulo 7 – Administrar el sistema y el uso de comandos como gzip y tar Capítulo 4 – Fylesystem y Administrar archivos

Enlace a las tres entradas:

  1. Backups con tar: fullbackups, incrementales y diferenciales
  2. Shell script que realiza copias de seguridad y notifica vía email
  3. Crear usuario especifico para generar y guardar los backups

Sobre las copias de seguridad.

Dependiendo del objetivo que tengamos a la hora de crear una copia de seguridad de nuestros datos, deberemos de seguir una u otra estrategia. Si lo que queremos es realizar solamente una copia completa o parcial como algo puntual de nuestros datos, podremos usar el comando tar en su uso mas básico (opción 1) . En cambio si trabajamos con una gran cantidad de datos cambiantes y queremos seguir un control y respaldo de ellos de forma estricta por lo que pudiese ocurrir, podremos elegir la opción 2 de este tutorial.

1) Para la primera de las opciones bastaría con usar el comando tar o cpio en su uso normal para crear una full única:

  • Respaldar el directorio home de mi usuario (empaquetado y compresión) con tar:
$ tar -cpvzf mibackup.tar.gz /home/miusuario

Nota: Podemos usar -j para comprimir con bzip2 o -J para comprimir con xz (ambos suelen ofrecer mejor resultados que gzip, solo que este último es mas común)

Importante: Si empaquetamos utilizando rutas absolutas deberemos de tener cuidado a la hora de desempaquetar, podremos machacar los archivos del home. Es preferible usar ruta relativa ‘./*’ o bien aislar el desempaquetado en un directorio.

  • Respaldar mi directorio home con cpio.
$ find /home/miusuario | cpio -o | gzip /tmp/mibackup.cpio.gz

2) Para la segunda opción, seguramente una buena forma de respaldar los datos sería realizando copias diarias. Para no tener que realizar backups completos todos los días, algo que nos llevaría mucho tiempo y un consumo elevado de espacio en el disco*, usaremos el comando tar con sus opciones -g o -N para crear backups incrementales o diferenciales respectivamente. Un ejemplo sería crear una copia full (fullbackup) de todo el directorio o dispositivos un determinado día de la semana (o del mes), por ejemplo un Lunes y el resto de la semana (Martes, Miércoles, Jueves y Viernes) realizar copias incrementales o diferenciales. Otra estrategia a seguir es la de combinar los 3 tipos de backups. Veremos esto mas adelante.

* Estos factores estarán determinados por el tamaño de los archivos a respaldar.

Backups diferenciales e incrementales

Los backups diferenciales copian todo el contenido cambiante basándose en una copia full anterior. Imaginemos que hemos realizado una copia full de un directorio un Lunes, y el Martes realizamos una copia diferencial de ese mismo directorio, hasta aquí a penas existe diferencia entre el backup diferencial y el backup incremental. Pero el Miércoles volvemos a hacer otro backup diferencial del directorio, esta copia ya tendrá los cambios del Martes mas los cambios del Miércoles por lo que su tamaño irá creciendo con respecto vayamos haciendo otras copias los próximos días (Jueves y Viernes).

En cambio, los backups incrementales siguen otro método. Lo que hacen es depender directamente de su copia anterior, es decir si tenemos una full realizada el Lunes y al día siguiente (Martes) se realiza un backup incremental, se guardarán los datos cambiantes entre el Lunes y el Martes hasta el momento de hacer la copia. Hasta aquí es similar al backup diferencial, pero la diferencia entra en juego al próximo día, es decir en la copia del Miércoles, donde la nueva copia incremental solo guardará las modificaciones realizadas desde el Martes hasta el Miércoles al momento de hacer el backup, por lo que el tamaño de este backup incremental será menor que el del diferencial del mismo día.

La ventaja de la copia diferencial radica a la hora de recuperar los datos, pero el ahorro de espacio en disco es menor. Si queremos volver a los datos del Miércoles pasado, deberemos de restaurar la copia full del Lunes y la diferencial del Miércoles. Por contra para recuperar los mismos datos mediante copias incrementales, deberemos de restaurar la full del Lunes, acto seguido la incremental del Martes y por último el backup incremental del Miércoles.

Combinar los tres tipos de backups: Comentábamos al inicio la posibilidad de combinar los tres tipos de copias. Esto es útil si en vez de crear una full todas las semanas, la creásemos únicamente el primer día del mes. En un caso hipotético de que el mes empezara en Lunes podemos entonces realizar un full backup el día 1 del mes (Lunes), el Martes, Miércoles, Jueves y Viernes creamos incrementales. El siguiente Lunes creamos una diferencial* y volveremos a crear incrementales los siguientes días. Al siguiente Lunes volvemos a realizar un backup diferencial y repetimos está técnica hasta final de mes. Esta estrategia de backups nos permite restaurar el sistema a un determinado día desempaquetando la full del primer Lunes del mes y luego dependiendo de la semana, desempaquetaremos la diferencial del Lunes de esa semana y posteriormente las incrementales. Así no tenemos que desempaquetar la full del Lunes e ir restaurando una a una las copias incrementales hasta el día al que queremos volver (imaginar que este día es el día 21, deberíamos de restaurar la full mas 20 backups incrementales!!)

*Importante: El comando tar aquí nos limita un poco el proceso (al menos hasta el punto al que he podido llegar). Si hacemos una diferencial ese Lunes, esta contemplará todos los cambios desde el Lunes pasado hasta el momento de crear el diferencial, PERO, cuando el Martes volvamos a crear una incremental (como se ha propuesto en el ejemplo), esta incremental tendrá aparte de los cambios del Martes, los que ya tiene la diferencial del Lunes, es decir, que de alguna manera duplicamos datos en esta copia puntual.

Una ventaja o inconveniente (según se mire) de combinar diferenciales e incrementales, es que si por ejemplo tenemos una full del día 1, la incremental del día 2 tiene nuevos archivos, la diferencial del día 3 contiene los archivos del día 2 y los del día 3, luego el día 4 eliminamos archivos y añadimos otros nuevos y hacemos una incremental, si queremos recuperar los eliminados, podremos volver a desempaquetar la diferencial del día 3. De no contar con ella no podríamos recuperarlos, ya que primero desempaquetaríamos la full del día 1, y luego las incrementales del día 2 y del día 4, en esta última no estarían los archivos que si había el día 3 (los cuales gracias a la backup diferencial SI podemos recuperarlos!!).

La desventaja es que a lo mejor estabas totalmente seguro de querer eliminarlos y cuando descomprimes la full y luego la diferencial, existen esos archivos que ya eliminaste.

Hacer backups incrementales con tar

  • Creamos el backup full del directorio que queremos respaldar (hay que usar la opción -g como indicamos):
$ tar -cpvzf "fullbackup_`date +%d%m%Y`.tgz" -g /home/nebul4ck/history/backup.snap /home/nebul4ck/recursos/*

Nota: Podemos crear mejor el backup moviéndonos hasta ./recursos e indicando en el comando tar la ruta relativa ‘./*‘. De la manera en la que lo hemos hecho deberemos de tener cuidado a la hora de desempaquetar. Si lo hacemos desde el directorio raíz machacaremos los archivos del home.

IMPORTANTE: El archivo backup.snap es el que guarda los metadatos que informan sobre los cambios que han ocurrido en el directorio. Si este archivo no existe se creará. Será el archivo que se lea cuando se haga el backup incremental. Si lo eliminamos, tar no encontrará información sobre los cambios realizados en el directorio, por lo que volverá a crear un full backup.

  • Ahora podremos crear el backup incremental del Martes, los cambios que hayamos hecho serán grabados en el archivo  backup.snap (snapshot).
$ tar -cpvzf "inc_backup_`date +%d%m%Y`.tgz" -g /home/nebul4ck/history/backup.snap /home/nebul4ck/recursos/*

Hacer backups diferenciales con tar

Para realizar backups diferenciales con tar usaremos su opción -N. Lo que nos permite esta opción es ordenar a tar que solo archive aquellos datos que han sido cambiados o agregados desde una determinada fecha, hasta la fecha de ejecución del comando. Por ejemplo imaginemos que la fecha del fullbackup es del Lunes 9 de Febrero del 2015 y hoy (día en el que realizamos el backup diferencial es Miércoles 11 de Febrero del mismo año), haremos lo siguiente:

  • Crear la copia full (la del día 9 de Febrero):
$ tar -cpvzf "fullbackup_`date +%d%m%Y`.tgz" /home/nebul4ck/recursos/*
  • Crear copia diferencial con los cambios ocurridos desde el Lunes 9 al Miércoles 11 del 2015
$ tar -cpvzf "dif1_backup_`date +%d%m%Y`.tar.gz" /home/nebul4ck/recursos/* -N 09-feb-15

Nota: Si volviésemos a crear otro diferencial el Jueves o el Viernes con fecha 09-feb-15, contendrían también los cambios reflejados en dif1 es por ello que su tamaño va aumentando en comparación con los backups incrementales.

NOTA: He creado un script que realiza backups diarios (full, incrementales y diferenciales) Es bastante completo y de fácil manipulación. Además lo he ido comentando para que sea comprensible al mayor número de público posible. Es modificable a gusto de consumidor y además al ser completo se repasan estructuras condicionales, bucles, comandos, listas, envío de email, funciones, etcétera.

Licencia Creative Commons
Backups con tar por nebul4ck se distribuye bajo una Licencia Creative Commons Atribución-NoComercial-CompartirIgual 4.0 Internacional.

Anuncios

11 comentarios

  1. aliastaz dice:

    En la parte de la copia diferencial lo veo un poco confuso, creas una copia el 9 de febrero y luego creas la diferencial, pero pones que la diferencial grabará desde el Lunes 9 al Miércoles 11 del 2015, en donde de los parámetros especificas eso porque en -N 09-feb-15, entinedo que es el 9 de febrero pero el 11, no lo se ver?

    Me gusta

    • nebul4ck dice:

      El parámetro que índica que es una copia diferencial es el -N :

      if tar -cpvWf “$TAR” * -N “$FECHA”

      Me gusta

      • aliastaz dice:

        De alguna forma habrá que indicarle la copia full que ya tenemos echa para crear la copia diferencial de dicha copia completa, lo de la -N ya lo entendía, es en si la sintaxis que en el momento de hacer la copia no funciona

        Lo qué no veo es porque pones el if, es un script quizás eso?
        “$TAR” es el nombre que le pones a tu copia diferencial verdad?

        Me gusta

      • nebul4ck dice:

        Perdona mi retraso, mañana sin falta te respondo. Un saludo

        Me gusta

      • nebul4ck dice:

        aliastaz $TAR es el propio archivo tgz (TAR=”$DESTINO”/”$PREFIJO”_”$NOMBRE”_”$EXT”) y con ese if, lo que se hace es que si se crea el TAR.tar.gz sin fallos, (if tar -cpvWf “$TAR” * -N “$FECHA”) a partir de fecha y con -N (es decir una copia diferencial de X días), prosiga con la estructura y lo comprima con gz (gzip -8f “$TAR”) y haga un chequeo de que todo ha ido bien (checkBackup “$TAR”.gz). El script es funcional

        Me gusta

  2. Adrián dice:

    ¡Hola!
    ¿Podrías explicar la sintaxis del “date +%d%m%Y”? Es que no lo entiendo mucho, es decir, ¿por qué se tiene que poner esto y que es lo que hace?
    ¡Muchas gracias por la ayuda! Me ha servido mucho tu tutorial :)

    Me gusta

    • nebul4ck dice:

      Hola Adrían,
      cuando queremos que el valor de una variable sea el resultado de la ejecución de un comando se puede realizar de la siguiente manera: variable=`comando` , con esas comillas. En este caso la variable puede ser “fecha” y el valor el resultado de ejecutar el comando date +%d%m%Y. Los parámetros %d%m%Y, hacen que el comando date represente la fecha de salida en formato diamesaño (en este caso al ser Y el año es de cuatro dígitos) lo que daría algo como 31102016. El signo + hay que ponerlo al inicio del primer parámetro. Es posible reprensentar la fecha en muchos formatos distintos, te recomiendo que hagas man date y verás todos los formatos en los que se puede representar, por ejemplo con otro formato podríamos hacer que el resultado de la ejecución del domando date diera la fecha tal que así: Lunes 13 de Marzo del 2016 (por ponerte otro ejemplo…) Un saludo y gracias!

      Me gusta

  3. Alexander dice:

    Hola he realizado el script y creo que sale error muestra el mensaje de ayuda de que debe ingresar un dia de la semana de lun a viernes , pero no muestra nada mas

    Me gusta

    • nebul4ck dice:

      Te lo miro y te digo

      Me gusta

    • nebul4ck dice:

      Bueno perdona por el retraso, hoy he probado el script y funciona perfectamente lo que pasa es que te está enviando el log a tu email y si no tienes configurado un correo local o relay por ejemplo a gmail no te estás enterando de lo que ocurre. Estoy modificándolo para que esto no sea un problema y envíe la salida a 4backup.log

      Me gusta

    • nebul4ck dice:

      Listo! Ya está modificado para que cree primero la jerarquía de directorios y el archivo de registro (si el error es muy grabe verás que se crea un emerg.log) bajo el directorio BASE/log.

      Saludos y gracias por avisar!

      Me gusta

Deja un comentario, Gracias!

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: