Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Copias de seguridad y recuperación de mi máquina personal

Última Actualización: 17 de julio de 2006 - Lunes

Desde que uso Linux en mi máquina personal hago copias de seguridad contra el servidor de backups (sí, tengo un servidor de backups :-) de mi red, utilizando el excelente programa "rdiff-backup". Este programa une a las ventajas del sistema RSYNC normal (solo se transfieren los ficheros que hayan sido alterados y, de éstos, solo los fragmentos modificados) el almacenamiento de todo el histórico de cambios. Es decir, no solo el backup se completa de forma rápida y eficiente, como con RSYNC, sino que disponemos de un histórico de todos los cambios, pudiendo volver a cualquier versión anterior. Por supuesto, los cambios en sí se almacenan como diferenciales RSYNC, por lo que si a una base de datos de un terabyte, por ejemplo, se le modifican 64kbytes, diarios, un año completo de históricos diarios de dicha base de datos ocupará solo 23 megabytes.

Realizar los backups

Mi disco duro está particionado de la siguiente manera:

/dev/sda5              1052184    337436    714748  33% /
/dev/mapper/LVM-home   7864076   6442316   1421760  82% /home
/dev/mapper/LVM-opt    2211768   2087644    124124  95% /opt
/dev/mapper/LVM-usr    5799752   5662880    136872  98% /usr
/dev/mapper/LVM-var    1163224    687404    475820  60% /var
/dev/mapper/LVM-work   1048540     32840   1015700   4% /work
/dev/mapper/LVM-windowsF
                      52427196  21561776  30865420  42% /home/jcea/mnt/particion_1

Hago respaldo de cada partición por separado para poder definir políticas de backup y de retención de históricos diferentes en cada caso. Por ejemplo, puedo hacer un nuevo backup de las particiones del sistema operativo cuando instalo alguna actualización, y conservar un histórico corto, mientras que el backup de mi directorio personal es diario y guardo un histórico de varios años.

Mi script SHELL de backup de sistema operativo es:

backup="./rdiff-backup -v5 --ssh-no-compression --exclude-other-filesystems"

$backup --remote-schema "ssh %s /usr/local/bin/rdiff-backup --server" \
          --exclude "/tmp/*" \
          / yolco.argo.es::/z-backups/castor/root

$backup --remote-schema "ssh %s /usr/local/bin/rdiff-backup --server" \
          /opt yolco.argo.es::/z-backups/castor/opt

$backup --remote-schema "ssh %s /usr/local/bin/rdiff-backup --server" \
          /usr yolco.argo.es::/z-backups/castor/usr

$backup --remote-schema "ssh %s /usr/local/bin/rdiff-backup --server" \
          --exclude "/var/tmp/*" \
          /var yolco.argo.es::/z-backups/castor/var

$backup --remote-schema "ssh %s /usr/local/bin/rdiff-backup --server" \
          /work yolco.argo.es::/z-backups/castor/work

El script SHELL de backup de mi directorio personal es:

backup="./rdiff-backup -v5 --exclude-other-filesystems"

$backup --remote-schema "ssh %s /usr/local/bin/rdiff-backup --server" \
          --exclude "/home/jcea/.local/share/Trash/files/*" \
          --exclude "/home/jcea/.mozilla/firefox/**/Cache/*" \
          --exclude "/home/jcea/.thunderbird/**/Cache/*" \
          --exclude "/home/jcea/.thumbnails/normal/*" --exclude "/home/jcea/.thumbnails/large/*" \
          --include "/home/jcea/.thunderbird/**/News/newsrc-*" \
          --include "/home/jcea/.thunderbird/**/msgFilterRules.dat" \
          --include "/home/jcea/.thunderbird/**/feeditems.rdf" \
          --include "/home/jcea/.thunderbird/**/feeds.rdf" \
          --exclude "/home/jcea/.thunderbird/**/Mail/*" \
          --exclude "/home/jcea/.thunderbird/**/News/*" \
          --exclude "/home/jcea/Desktop/spambayes/spambayes.messageinfo.db" \
          --exclude "/home/jcea/.xsession-errors" \
          --exclude "/home/jcea/firefox-*-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*" \
          --exclude "/home/jcea/thunderbird-*-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*" \
          --exclude "/home/jcea/.googleearth/Cache/dbCache.dat*" \
          /home yolco.argo.es::/z-backups/castor/home

Como puede verse, excluyo del backup cosas como cachés de navegación o del "google earth". Tampoco hago backup de mi correo electrónico (para eso tengo otros mecanismos) pero sí hago copia de seguridad de mis reglas de correo electrónico, mi configuración de news o el estado (que no su contenido) de los feeds RSS.

ATENCIÓN: Yo utilizo una versión parcheada de "rdiff-backup" que conserva los "numeric-ids" originales, sin intentar mapear entre usuarios y grupos de ambas máquinas. Las versiones de desarrollo de "rdiff-backup" ya incorporan esa funcionalidad de serie mediante una opción en la línea de comando, pero aún están verdes para utilizarlas en producción. También tengo varios parches para la información que se va mostrando durante la ejecución del programa, razón por la que un "-v5" en otro despliegue puede no tener sentido.

Recuperar backups

Si perdermos algún fichero o directorio, podemos recuperarlo directamente del servidor de backup. Si lo que nos interesa estaba correcto en el último backup, lo podemos copiar directamente del servidor, sin más. Si es necesario recurrir a un valor histórico pasado, hay que utilizar las funcionalidades de recuperación de históricos de "rdiff-backup", explicadas de forma muy clara y precisa en el manual.

La cosa se complica si lo que queremos recuperar es una partición entera o, peor aún, el disco duro completo. Los pasos son los siguientes:

  1. Si queremos recuperar el disco duro a su estado en el último backup, no hay problema, ya que esa información está accesible directamente en el servidor de backups. En caso de querer recuperar un estado anterior, primero hay que extraer el estado histórico con "rdiff-backup", sacando cada partición a restaurar a un directorio diferente en la máquina de backups. Sea cual sea el camino que sigamos, al final tendremos la copia de cada partición a restaurar accesible en el servidor de backups.

  2. Lanzamos el LiveCD/DVD de nuestra distribución linux. Es importante que soporte la tarjeta de red y la estructura de disco utilizada. Por ejemplo, en mi caso, mi LiveDVD debe soportar volúmenes lógicos LVM2.

  3. Dependiendo de nuestro disco duro y del linux que estemos usando, puede interesar mucho activar el modo DMA y la caché de escritura del disco duro. Esto último habría que tenerlo desactivado SIEMPRE, porque es muy muy muy problemático, pero como lo que queremos ahora es terminar la recuperación cuanto antes, y si se va la luz o lo que sea podemos continuar donde lo habíamos dejado, gracias al RSYNC...

  4. Levantamos la tarjeta de red, para poder acceder al servidor de backups. No es necesario activar rutas por defecto, porque tengo el servidor en mi LAN. Tampoco necesito configurar DNS, porque voy a conectar al servidor utilizando su IP.
    ifconfig eth0 195.47.206.4 up
    

  5. A continuación montamos la partición "root" en, por ejemplo, "/mnt". Vamos a ella y "sincronizamos" la copia local con la que nos interesa en el servidor de backups:
    mount /dev/sda5 /mnt
    cd /mnt
    rsync -a -H -S --delete --numeric-ids --stats --progress \
          --force -e ssh --exclude rdiff-backup-data \
          195.47.206.8:/z-backups/castor/PATH .
    

    Obsérverse el punto al final de la línea (larga) anterior. Obsérvese también que no estamos usando compresión porque estamos comunicándonos por red local a gigabit ethernet, así que comprimir nos quemaría CPU y probablemente sea más lento. Si estuviésemos haciendo la recuperación a través de Internet, la cosa cambiaría. El PATH indica dónde tenemos la copia de seguridad de nuestra partición "root". Nótese también que excluimos de la recuperación al directorio de metadatos de "rdiff-backup". Aunque muchos despliegues "rsync" ya utilizan SSH por defecto como transporte de datos, no siempre es así. Otros emplean "rsh" por defecto, así que forzamos el uso de SSH de forma explícita.

    Por supuesto, al utilizar RSYNC nos beneficiamos de cualquier fichero utilizable que ya estuviese presente en el disco duro, amén de poder continuar donde se había quedado si, por ejemplo, se nos va la luz durante la recuperación.

  6. Una vez recuperada la partición raíz tenemos que recrear a mano los puntos de montaje del resto de particiones, ya que "rdiff-backup" (en mi opinión, ésto es un bug). En nuestro caso los puntos a recrear en la partición raíz son "usr", "opt", "home", "var" y "work".

    Pero también hay que crear un par de directorios para sistemas de ficheros virtuales. En concreto "proc", "sys" y "dev". Esos directorios se crean si no existen ya, pero no se tocan más allá de la acción en sí de crearlos. Es decir, los dejamos vacíos. Son simples puntos de montaje para que el kernel pueda colgar sus cosas. Estos puntos se corresponden a una SUSE 10.0. Otras distribuciones pueden tener otros requisitos. Los puntos que haya creado en RAM el LiveCD/DVD nos pueden ser una guía útil.

    Es conveniente haber sacado en algún momento anterior un listado de los puntos de montaje con su propietario, grupo y permisos, para dejarlos tal cual. Sino, los permisos que les da "root" por defecto probablemente sean apropiados. Los permisos de los puntos de montaje de particiones reales son accesibles también en el backup. Se copian tal cual.

  7. A continuación montamos el resto de particiones, una a una, en el lugar correspondiente y repetimos la accción anterior con el RSYNC. Recuerda que para montra un volumen lógico debes utilizar un path similar a "/dev/LVM/home", por ejemplo.

    En mi caso, todas las particiones de las que hago backup cuelgan de la partición "root". Si hiciese también backup de la partición que cuelgo en "/home/jcea/mnt/particion_1", entonces tendría que colgar esa partición en su lugar, y recuperarla con RSYNC, una vez que haya reconstruido "/home".

  8. Una vez que tengamos ya todo recuperado, debemos desactivar la caché de escritura de disco duro, por si las moscas, y asegurarnos de que el disco está perfectamente actualizado haciendo un "sync" en la línea de comandos (¡primero desactivar la caché de escritura!).

  9. Seguidamente reiniciamos la máquina. Debería arrancar sin problemas. Pudiera ser el caso que no tengamos sector de arranque (LILO o GRUB). Si es así, volvemos a arrancar con el LiveCD/DVD y procedemos a instalar el arranque desde el disco óptico. Reiniciando de nuevo, todo debería ir como la seda

Este esquema nos permite recuperarnos tanto de borrados accidentales como de fallos catastróficos del disco duro completo o, también, para revertir una actualización completa del sistema. Esta última posibilidad la he utilizado en infinidad de ocasiones :-). Al tener las particiones separadas, por ejemplo, puedo revertir el sistema sin afectar a mi directorio personal.

¿Por qué utilizamos RSYNC para recuperar el sistema en vez de "rdiff-backup", por ejemplo?. La razón fundamental es que el LiveCD/DVD probablemente no incluya esa aplicación y, desde luego, no es la versión parcheada que yo empleo en mis sistemas :-).

Durante la realización del backup, los datos pueden estar siendo modificados. "rdiff-backup" no copiará al backup ningún fichero que haya sido alterado entre que se inicia y se termina su salvaguarada. Si ello es un problema, y nuestro sistema permite realizar "snapshots" de particiones (Solaris lo permite, y LVM de Linux también), la solución es crear un snapshot y hacer backup del mismo, aunque ello puede confundir la lógica que detecta cambios de "rdiff-backup".

En mi entorno diario, y dado que hago backups incluso varias veces al día, me conformo con una versión anterior de ese fichero, respaldado apenas unas horas antes. O, si el fichero es importante, repito el backup nuevamente, ya que el coste de espacio de cada backup es muy bajo. Como digo, no es raro que haga copias de seguridad varias veces al día.


Historia

  • 17/jul/06: Forzamos SSH de forma explícita, al recuperar un backup.

  • 28/jun/06: Primera versión de esta página.



Python Zope ©2006 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS