µLibertad

28/08/2007

Realizar copias de seguridad del sistema con TAR

Archivado en: Linux, Seguridad, Tutoriales — Tony @ 1:35 am

Realizar copias de seguridad de nuestro sistema es prácticamente fundamental. Nunca se sabe lo que puede pasar o qué puede fallar. Desde un descuido del usuario a una actualización que nos tira abajo el sistema y no somos capaces de solucionar. Es en ese momento en el que tener una copia de seguridad nos salva la vida.

En Linux el sistema más utilizado para realizar copias de seguridad o backups del sistema es el de utilizar scripts, que a su vez utilizan tar, para tener guardado nuestro sistema en un solo archivo y listo para ser restaurado si fuera necesario.

En esta entrada os explicaré el sistema que utilizo, es un script que encontré por la red hace tiempo y lo modifiqué un poco a mi gusto. Sirve para realizar un backup completo del sistema cada 1 de mes, otro backup completo cada Domingo y backups diarios incrementales (solo de los cambios realizados desde el último bakcup completo). Todo esto automático gracias a Cron.

Lo primero que tenemos que hacer es tener claro donde guardaremos nuestras copias de seguridad y que directorios que queremos resguardar, ya que deberemos editar un par de líneas del script. Esto es muy sencillo y basta con mirar el script que uso para que veáis qué cambios debéis hacer. Copiad lo siguiente a un archivo de texto cambiando los valores pertinentes:

#!/bin/bash
# full and incremental backup script

#Cambiar estos 5 valores para adecuarlo al sistema

MAQUINA=debian # nombre de la máquina
DIRECTORIOS="/bin /boot /emul /etc /initrd /lib /opt /root /sbin /srv /usr /var" #directorios a respaldar
BACKUPDIR=/home/Backups # Directorio donde se guarda el backup (debe existir)
FECHADIR=/home/Backups # Directorio donde se guarda la fecha del último backup completo
TAR=/bin/tar # localización del ejecutable tar (se localiza con whereis tar)

# A partir de aquí no hace falta tocar nada

PATH=/usr/local/bin:/usr/bin:/bin
DSEM=`date +%a` # Día de la semana (por ej. mié)
DMES=`date +%d` # Día del mes (por ej. 06)
DM=`date +%d%b` # Día y mes (por ej. 06jun)

# Cada 1 de mes se hace un backup completo
# Cada Domingo se hace otro backup completo sobrescribiendo el backup del domingo anterior
# Cada día se realiza un backup incremental. Cada backup incremental sobrescribe
# el backup incremental del mismo día de la semana anterior.
# "NUEVO" coge la fecha del backup completo de cada domingo para
realizar un backup de los archivos creados a partir de la fecha de "NUEVO".

# Backup mensual completo - sobrescribe el del mes anterior
if [ $DMES = "01" ]; then
$TAR -cf $BACKUPDIR/$MAQUINA-$DM.tar $DIRECTORIOS
fi

# Backup semanal completo
if [ $DSEM = "dom" ]; then
AHORA=`date +%d-%b`

# Actualizar fecha del backup completo
echo $AHORA > $FECHADIR/$MAQUINA-fecha-backup-completo
$TAR -cf $BACKUPDIR/$MAQUINA-$DSEM.tar $DIRECTORIOS

# Backup incremental diario - sobrescribe el de la semana anterior
else

# Obtener fecha del último backup completo
NUEVO="--newer=`cat $FECHADIR/$MAQUINA-fecha-backup-completo`"
$TAR $NUEVO -cf $BACKUPDIR/$MAQUINA-$DSEM.tar $DIRECTORIOS
fi

Cuando tengamos el script retocado a nuestro gusto le damos permisos de ejecución y lo copiamos a la carpeta /usr/bin, por ejemplo:

chmod +x backup-script
cp backup-script /usr/bin/

Después bastará con hacer que el script se ejecute cada día mediante Cron, por ejemplo a las 3 de la mañana, para que no nos moleste mientras trabajamos con el Pc. Como root hacemos:

crontab -e

y dentro escribimos:

0 3 * * * /usr/bin/backup-script

Ya solo queda un apunte. Para determinar la fecha del último backup completo y poder hacer así el backup incremental, se utiliza un fichero de texto con la fecha en cuestión, que se actualiza cada Domingo. La primera vez que se ejecute el script se creará un backup completo, sea el día que sea, ya que ese archivo todavía no existe. Lo que debemos hacer es ejecutar el script la primera vez para realizar el backup completo y después crear este fichero con la fecha actual. Podemos crear dicho fichero fácilmente así:

echo `date +%d-%b` > $FECHADIR/$MAQUINA-fecha-backup-completo

Sustituyendo $FECHADIR/$MAQUINA por la ruta pertinente.

Si queremos restaurar el sistema lo único que debemos hacer es entrar a un terminal, loguearnos como root y, situados en el directorio raíz, introducir este comando:

cd /
tar -xf ruta_al_backup_que_queremos_resutaurar.tar

Quizá es más recomendable realizarlo desde un Live CD para evitar problemas con ficheros del sistema que estén siendo usados en ese momento.

Eso es todo, así tendremos un sistema de copias de seguridad bastante completo.

13 comentarios »

  1. Saludos, muy bueno, pienso agregarle al script que los respaldos se envien a un servidor remoto por scp! Te lo envio cuando lo termine de modificar

    comentario por Angel Guadarrama — 1/10/2007 @ 4:31 pm | Responder

  2. Sería fantástico, por que así se puede subir a un servidor que tengas acceso con SCP, aunque yo en casa tengo un servidor ciego que monto con NFS sus particiones en mi sistema, y es muy fácil subirlo al servidor así, pero claro un servidor exterior es mejor como tu dices.

    Pues muchas gracias si nos lo envías ya lo comentamos aquí. Gracias.

    comentario por Oscar — 1/10/2007 @ 5:03 pm | Responder

  3. Lo de crear el fichero este

    echo `date +%d-%b` > $FECHADIR/$MAQUINA-fecha-backup-completo

    no me ha quedado muy claro.

    comentario por alex — 13/10/2007 @ 9:07 pm | Responder

  4. arreglado.
    Un saludo

    comentario por alex — 13/10/2007 @ 9:41 pm | Responder

  5. Muy bueno, muchas gracias, ¿ya tenéis el script para enviar los backups a un servidor remoto? Sería buenísimo.

    comentario por david — 15/10/2007 @ 4:59 pm | Responder

  6. No, no lo hemos recibido aún, tal vez no lo tenga listo todavía Angel.

    comentario por Oscar — 15/10/2007 @ 11:28 pm | Responder

  7. Esta muy bueno

    Yo realizo backup los dias viernes .. la idea es sacar un backup completo el primer viernes de cada mes, luego los demas viernes hago un incremental.

    Pero como puedo hacer un incremental desde el incremental anterior.. al parecer la linea de comandos solo hace incrementales de los cambios del backup completo mas no del backup incremental.

    Para mi es vital puesto que se maneja mucha data y BD

    Te lo agradeceria mucho

    Saludos desde Peru

    comentario por cesar — 25/10/2007 @ 7:11 pm | Responder

  8. Supongo que bastaría con usar un archivo con la fecha del último incremental, igual que se hace con el completo, deberías dejar las últimas líneas así, cambiando lo que te indico en negrita:

    else

    # Obtener fecha del último backup completo
    NUEVO="--newer=`cat $FECHADIR/$MAQUINA-fecha-backup-incremental`"
    AHORA=`date +%d-%b`
    $TAR $NUEVO -cf $BACKUPDIR/$MAQUINA-$DSEM.tar $DIRECTORIOS
    echo $AHORA > $FECHADIR/$MAQUINA-fecha-backup-incremental
    fi

    Debería funcionar así, si no funciona lo comentas.

    comentario por Tony — 27/10/2007 @ 2:25 pm | Responder

  9. como puedo hacer para hacer una copia diferencial a cierta hora del dia,?

    comentario por juan — 8/11/2007 @ 7:01 pm | Responder

  10. Pues bastaría con ejecutar el script a esa hora como root. Si lo que quieres es hacerlo sin estar en delante del ordenador lo programas con Cron, como pongo en la entrada:

    0 3 * * * /usr/bin/backup-script

    Cambias los dos primeros números a tu gusto, el primero es el minuto y el segundo la hora, si quieres que sea a las 5 de la tarde pues pones:

    0 17 * * * /usr/bin/backup-script

    Esto lo programaría para cada día, si quieres que solo sea un día ten en cuenta la estructura del archivo:

    m h dom mon dow command

    O sea, minuto, hora, día del mes (del 1 al 31), mes (1 a 12) y día de la semana (1 a 7). Luego, claro está, el comando.

    Ten en cuenta que el propio script está pensado de una manera determinada, y si lo ejecutas siendo domingo, o día 1 uno de mes, te hará un backup completo. En ese caso tendrías que aplicar el comando con el que se hace el incremental en el script, pero a mano.

    comentario por Tony — 8/11/2007 @ 7:23 pm | Responder

  11. Lo he realizado todo tal y como se comenta y parece que no funciona.

    Alguen puede decirme como puedo lanzar el script desde consola para ver donde esta el error?

    Gracias.

    comentario por turkil — 28/05/2008 @ 11:41 pm | Responder

  12. Poniendo la ruta donde lo tienes mientras estás logueado como root.

    comentario por Tony — 30/05/2008 @ 4:27 pm | Responder

  13. Muy buen tuto.

    Donde se guarda el log del proceso para poder enviarlo con sendmail?

    al estilo:

    cat fichero.log | mail direccion@mail

    Gracias

    comentario por faidoc — 18/12/2008 @ 12:25 am | Responder


Canal RSS de los comentarios de la entrada. URI para TrackBack.

Deja un comentario

Blog de WordPress.com.