µLibertad

28/08/2007

Realizar copias de seguridad del sistema con TAR

Filed under: 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.

19 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

    Comentarios 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.

    Comentarios 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.

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

  4. arreglado.
    Un saludo

    Comentarios 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.

    Comentarios 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.

    Comentarios 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

    Comentarios 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.

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

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

    Comentarios 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.

    Comentarios 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.

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

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

    Comentarios 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

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

  14. Hola Tony, sabes, esta muy bueno el tutorial, por esta via te pido permiso, para postearlo haciendo referencia a este en el wiki del sitio http://www.esdebian.org, espero me respondas

    Comentarios por Cubano_Gold — 3/01/2010 @ 2:02 pm | Responder

  15. Hola chavales, pues el script me ha funcionado a las mil maravillas, pero despues de hacer mis propios retoques, me encuentro ahora con que no se vuelva nada, os indico la salida:

    Fragmento de la salida al ejecutar el script:

    /bin/tar: /etc/alternatives/ex.1.gz: el fichero no ha cambiado; no se vuelca
    /bin/tar: /etc/alternatives/pack200.1.gz: el fichero no ha cambiado; no se vuelca
    /bin/tar: /etc/alternatives/rmt: el fichero no ha cambiado; no se vuelca
    /bin/tar: /etc/alternatives/start_transaction.7.gz: el fichero no ha cambiado; no se vuelca
    /bin/tar: /etc/alternatives/drop_operator_family.7.gz: el fichero no ha cambiado; no se vuelca
    /bin/tar: /etc/alternatives/prepare_transaction.7.gz: el fichero no ha cambiado; no se vuelca
    /bin/tar: /etc/alternatives/declare.7.gz: el fichero no ha cambiado; no se vuelca

    El caso es que no es un backup incremental, deberia estar haciendo el completo, ya que no he hecho ninguno, y la fecha esta correcta. No entiendo el porque hace un incremental cuando deberia hacer un completo.

    Si alguien me ayuda lo agradeceria.

    Comentarios por Zacaro — 9/02/2010 @ 11:26 am | Responder

  16. Me ocurría lo mismo que a Zacaro investigando un poco sobre el tema y realizando diversas pruebas parece que he logrado solucionarlo al menos en mi caso, lo he solucionado forzando a que se guarde la fecha del último backup completo (una forma sencilla es modificar el script y poner el dia de la semana actual y realizar un backup, ya después puede volverse a poner el domingo…).

    Saludos

    Comentarios por telec — 15/02/2010 @ 2:04 pm | Responder

  17. Se me pasaba comentar que el problema está en el parámetro –newer del tar. Con la solución arriba indicada solo funciona el backup semanal. Una posible solución para utilizar tar para fines de backups incrementales podeis verla en http://www.gnu.org/software/tar/manual/html_section/Incremental-Dumps.html#SEC89 .

    Comentarios por telec — 15/02/2010 @ 2:27 pm | Responder

  18. Telec tiene razon. Desde GNU te recomiendan que no uses la opcion -newer-mtime porque puede haber problemas con fechas en algunos ficheros. Te recomiendan que uses la opcion –listed-incremental El unico problema es que hay que adaptar un poco los los comandos dependiendo si estas usando la version mas reciente del tar. Os pongo aqui como lo tengo yo montado funcionando al 100%

    Para comprimir por ejemplo el directorio /var/misficheros y almacenar los backup incrementales y la lista de ficheros en /opt, lo podeis hacer asi:

    tar -cvf /opt/backup.0.tar –listed-incremental=ficheros.new.lst /var/misficheros
    cp /opt/ficheros.new.lst /opt/ficheros.old.lst

    tar -cvf /opt/backup.1.tar –listed-incremental=ficheros.new.lst /var/misficheros
    cp /opt/ficheros.new.lst /opt/ficheros.old.lst

    tar -cvf /opt/backup.2.tar –listed-incremental=/opt/ficheros.new.lst /var/misficheros
    cp /opt/ficheros.new.lst /opt/ficheros.old.lst

    .. y asi sucesivamente. Lo suyo es que lo metais en un script automatizado, que cada X dias lo haga solito.

    Para descomprimir hay que hacerlo en el orden adecuado, ed decir exactamente el mismo que cuando lo comprimimos:

    tar x -g /opt/ficheros.new.lst –file /opt/backup.0.tar
    tar x -g /opt/ficheros.new.lst –file /opt/backup.1.tar
    tar x -g /opt/ficheros.new.lst –file /opt/backup.2.tar

    La linea «cp /opt/ficheros.new.lst /opt/ficheros.old.lst» es porque el tar sobreescribe la lista de ficheros cada vez que realizamos un backup incremental, y siempre nos conviene tener una copia de la lista de ficheros actual del backup por si algo sale mal durante el proceso de incrementar el backup (por ejemplo: se va la luz, etc…) Los backups los podeis meter en /opt o /var/backups o en un disco duro externo o donde querais, simplemente preferencia personal.

    Comentarios por elsensei — 5/03/2010 @ 6:51 pm | Responder

  19. […] Vía: ulibertad […]

    Pingback por Realizar copias de seguridad del sistema con TAR | Atención Técnica — 3/01/2015 @ 4:52 pm | Responder


RSS feed for comments on this post. TrackBack URI

Replica a alex Cancelar la respuesta

Blog de WordPress.com.