Copias de seguridad de un sistema con rdiff-backup

rdiff-backup es una herramienta para respaldar sus archivos. (Puede ser utilizada en cualquier variedad de *nix).

Ejecute los comandos como root en una consola, a menos que se le indique otra cosa.

*Sirve para la recuperación de un dist-upgrade, kernel-upgrade fallido, etc., (y también para restaurar archivos concretos).
*solamente respalda lo que ha sido cambiado desde el último rsync (así que cada respaldo lleva poco tiempo).
*mantiene un historial de cambios (esto permite que pueda restaurar un archivo borrado hace tres semanas!)
*realiza respaldos seguros sobre una red (usando ssh).
*respalda particiones aunque estén montadas (facilita la automatización de una copia de seguridad diaria ... no tiene que desmontar).
*puede restaurarlo todo si el disco duro se muere y tiene que reemplazarlo por otro.
*Respalda redes grandes (sin problemas en Linux, más difícil con Windows) y es bastante usado en el ámbito empresarial .
*es una aplicación manejada por la línea de órdenes, así que es bueno para quienes gustan de automatizar respaldos (por ejemplo, con un script de bash lanzado por cron).
*recuerda y maneja permisos y dueños de archivos, y también enlaces simbólicos (y todo este tipo de cosas); así cuando restaure, se encuentrará todo exactamente como estaba.

Lo que va a necesitar

rdiff-backup mantiene una copia (no comprimida) de los archivos que está respaldando y también mantiene un historial (respaldos incrementales), lo que significa que el espacio para las copias de seguridad tiene que ser mayor que lo que está respaldando. Si, por ejemplo, está respaldando datos que ocupan 100 gigas de espacio, puede necesitar 120 gigas (preferiblemente en otro disco duro separado!).

Cómo configurarlo

Vamos a definir un caso hipotético:
* un disco duro de 100 gigabytes (sda) está en uso, con sda1 montado para la partición /root (raíz) y sda5 montado para almacenar musica y otros archivos, mientras que sda6 se usa para swap.
* hay otro disco duro de 200 gigas (sdb) que no está siendo utilizado por el sistema, con una sóla montura sdb1 ... vamos a utilizar éste para nuestros respaldos.
* la dirección IP es 192.168.0.1

Lo primero que hay que hacer es instalar rdiff-backup:

# apt-get install rdiff-backup

Ahora, aunque ya podemos respaldar cualquier directorio, como en este caso hipotético vamos a guardar particiones enteras --deseamos respaldar el sda1 y sda5 (no queremos respaldar el sda6)--, entonces creamos unos directorios para almacenar los datos:

# mkdir -p /media/sdb1/rdiff-backups/192.168.0.1/root
# mkdir -p /media/sdb1/rdiff-backups/192.168.0.1/sda5

Es necesario dar la dirección IP por si desea utilizar este ordenador para respaldar otro (hablaremos de esto más adelante).

Haciendo copias de seguridad

rdiff-backup usa la sintaxis rdiff-backup dir-fuente dir-destino. Nota: especifique siempre nombres de directorios, no nombres de archivos.

Para respaldar el sda5, ejecute:

# rdiff-backup /media/sda5 /media/sdb1/rdiff-backups/192.168.0.1/sda5

Y para respaldar la partición-raíz, haga:

# rdiff-backup --exclude '/tmp/*' --exclude '/proc/*' --exclude '/sys/*' --exclude '/media/*/*' / /media/sdb1/rdiff-backups/192.168.0.1/root

Cualquier error del tipo "AF_UNIX_ruta_demasiado_larga" será ignorado. Esto puede llevar bastante tiempo, ya que es la primera vez que la partición esta siendo respaldada y rdiff-backup tendrá que respaldar la partición entera (no solamente las diferencias). Note que tampoco deseamos respaldar /tmp ya que siempre está cambiando, ni el /proc ni /sys, pues no contienen verdaderos archivos de datos, ni tampoco deseamos respaldar puntos de montaje. Si incluye respaldos para montajes, estará respaldando el sdb1, y podemos entrar en un bucle infinito! Una manera de evitar esto es respaldar separadamente los puntos de montaje.

La razón porque se usa '/proc/*' en vez de solamente '/proc' es que así causaría el respaldo del nombre del directorio, /proc, pero se ignoraría todo su contendido. Lo mismo para /tmp, /sys y, aún más interesante, todos los nombres de los puntos de montaje.

Así, si destroza su partición-raíz y hace una restauración completa, /tmp, /proc, /sys y todos los demás nombres de puntos de montaje serán creados de nuevo (justamente lo que debe ser). Si /tmp no existe cuando el X arranque, pueden haber problemas. Vea la página man sobre --exclude y --include para más información).

Restaurando directorios desde un respaldo

rdiff-backup usa la sintaxis:

rdiff-backup -r <desde_donde> <directorio_fuente> <directorio_destino>

Ahora, si accidentalmente borra el directorio /media/sda7/photos por ejemplo, puede restaurarlo ejecutando lo siguiente:

# rdiff-backup -r now /media/sdb1/rdiff-backups/192.168.0.1/sda5/photos /media/sda5/photos

La opción "-r now" significa restaurar desde el respaldo más reciente. Si estuvo respaldando todo periódicamente (quizás con crontab), y no se dio cuenta de que el directorio de fotos estaba perdido hasta unos días después, necesitará restaurar desde un respaldo más antiguo (y no del último ("now"), en vista que este último dice que /photos no existe). O quizás solamente quiera volver a una versión previa de algo.

Si desea restaurar desde hace tres días, entonces utilice "-r 3D", pero como dice en la pagina man, note que:

"3D" refiere al instante 72 horas antes del presente, y si no existe respaldo creado justo en ese momento, el rdiff-backup restaurará lo que fue grabado en el respaldo previo. Por ejemplo, en el caso de arriba, si "3D" fue utilizado y hubieron respaldos de hace 2 días y 4 días, el directorio será restaurado a como era hace 4 días (entonces, tiene que pensar un poco antes de llevar a cabo la restauración).

Utilice lo siguiente para obtener una lista de fechas y horas de cuándo fueron realizados los respaldos del sda5:

# rdiff-backup -l /media/sdb1/rdiff-backups/192.168.0.1/sda5
Restaurando particiones

También puede restaurar particiones enteras (puntos de montaje); después de todo, un punto de montaje no es otra cosa que un directorio.

PRECAUCIÓN: No restaure la partición raíz si ha arrancado desde allí! Con una sola orden puede perder todos sus archivos en todas las particiones, incluyendo todos los respaldos en un disco duro separado!! rdiff-backup hace exactamente lo que se le ordena --si el respaldo para la partición-raíz tiene puntos de montaje vacíos, entonces para restaurarlos todos a como están en el respaldo tiene que borrar todo en los puntos de montaje para poder hacerlos iguales al respaldo.

Para restaurar el sda5 desde el último respaldo, simplemente ejecute:

# rdiff-backup -r now /media/sdb1/rdiff-backups/192.168.0.1/sda5 /media/sda5
Restaurando la partición-raíz

Pero restaurar la partición raíz no es tan sencillo. No se puede restaurar la partición raíz mientras está montada (ver la PRECAUCIÓN arriba). Es realmente útil poder restaurar la partición raíz, así que si ocurre un desastre instalando/actualizando, o instalando un kernel nuevo, etc, tiene la tranquilidad de que podrá retroceder hasta donde estaba antes, y sólo necesitará unos 20 minutos.

Una manera de restaurar la partición raíz es arrancar desde una partición de Linux extra, si tiene una en el disco duro. Entonces podrá restaurar la partición que desee ya que ahora no estará montada como /root. Después de restaurar la partición, vuelva a arrancar desde allí, y quedará exactamente como estaba cuando hizo el respaldo! Este es con diferencia el método más fácil.

Otra manera de restaurar la partición-raíz es arrancar con el LiveCD de aptosid y llevar a cabo la restauración desde allí. El rdiff-backup está incluido en aptosid. En el caso de que la versión del LiveCD de aptosid no contega rdiff, puede escribir en la línea de comando de Grub (ver Opciones de Arranque, Cheatcodes), el cheatcode "unionfs" y eso le permite instalar aplicaciones usando el LiveCD. Tan solo arranque y entre los siguientes comandos:

$ sudo su
# wget -O /etc/apt/sources.list http://aptosid.com/files/misc/sources.list
# apt-get update
# apt-get install rdiff-backup
Ahora, vamos hacer la restauración:
# mount /dev/sda1 /media/sda1
# mount /dev/sdb1 /media/sdb1
# rdiff-backup -r now /media/sdb1/rdiff-backups/192.168.0.1/root /media/sda1

Nota: Si no tiene un LiveCD de aptosid, pero el que tiene apoya el "klik", puede instalar el rdiff-backup utilizando klik, y llamando:

$ sudo ~/.zAppRun ~/Desktop/rdiff-backup_0.13.4-5.cmg rdiff-backup -r now /media/sdb1/rdiff-backups/192.168.0.1/root /media/sda1

Se recomienda que cuando haga un respaldo de la partición raíz con la intención de restaurarla si es necesario, compruebe que funciona el proceso de restauración. Nada es peor que pensar que todo está bien y luego encontrarse algo inesperado durante una emergencia.

Si el disco duro ha cambiado o ha sido vuelto a formatear, compruebe los UUIDs, (o etiquetas), en /boot/grub/menu.lst (grub-legacy) o los ficheros en /etc/grub.d (grub2) y /etc/fstab, y cámbielos adecuadamente. Una manera fácil de conocer la información que permita alterar en caso necesario el menu.lst y el fichero fstab es hacer como root:

blkid
Copias de seguridad de otros PCs

Puede respaldar otro PC desde el PC local, siempre que el PC local pueda hacer ssh al otro PC y que tenga espacio suficiente en su disco duro. El servidor ssh (sshd) tiene que estar ejecutándose en el PC remoto. Los demás PCs no tienen por qué estar en el LAN local, puede estar en cualquier parte del mundo.

Asumimos que el PC remoto tiene lo siguiente:
1) un disco duro de 100 gigas (sda) en uso, con solo montajes,
2) sda1 está siendo utilizado por la partición raíz,
3) en sda5 tenemos almacenandos archivos temporales que no deseamos respaldar,
4) sda6 es el swap
5) y la dirección IP es 192.168.0.2

Nota: ambos discos duros de 100 gigas normalmente no podrán ser respaldados en el disco de 200 gigas con rdiff-backup (por falta de espacio para los archivos incrementales), pero en vista de que no estamos respaldando el sda5 en el PC remoto (y porque los discos duros usualmente no estan llenos al 100%, aún que no siempre cuente con esto), entonces puede considerar que hay suficiente espacio. Cada vez que rdiff-backup realiza un respaldo se crean más archivos incrementales, y esto necesita más y más espacio.

Puede ordenar a rdiff-backup que solamente guarde un máximo de respaldos durante 1 mes (este comando se muestra más adelante), y así necesitará menos espacio que si mantuviera las copias de datos de un año. Y, por supuesto, si desea tener un año de respaldos de datos, entonces hay que tener suficiente espacio en el disco duro para almacenar un año de respaldos con sus archivos incrementales.

Lo que hay que hacer en primer lugar es también instalar el rdiff-backup en el PC remoto, (igual que en cada computador que desee respaldar: todos, incluyendo el servidor de respaldo, tienen que tener el rdiff-backup instalado).

Para respaldar el PC remoto en un PC local, ejecute en el PC local (cuya IP es por ejemplo: 192.168.0.1): Fíjese en el uso de los dos puntos dobles ::

# mkdir /media/sdb1/rdiff-backups/192.168.0.2/root
# rdiff-backup --exclude '/tmp/*' --exclude '/proc/*' --exclude '/sys/*' --exclude '/media/*/*' 192.168.0.2::/ /media/sdb1/rdiff-backups/192.168.0.2/root

Ahora si desea restaurar un directorio en el PC remoto, puede iniciar la restauración desde el PC local o desde el remoto.

Así es cómo podría restaurar el directorio /usr/local/games en un PC remoto, iniciándolo desde el PC remoto:

# rdiff-backup -r now 192.168.0.1::/media/sdb1/rdiff-backups/192.168.0.1/root/usr/local/games /usr/local/games

Y así cómo podría restaurar el directorio /usr/local/games en un PC remoto, iniciándolo desde el PC local:

# rdiff-backup -r now /media/sdb1/rdiff-backups/192.168.0.1/root/usr/local/games 192.168.0.2::/usr/local/games

Se utiliza la misma sintaxis cuando se restaura la partición raíz desde un LiveCD (donde el PC remoto ha sido arrancado via un LiveCD --ver arriba).

Automatizando respaldos:

Si está respaldando desde otro PC hacia un PC local, la primer cosa a hacer es activar los logins de ssh sin clave usando claves ssh. Note que estamos hablando de hacer un login ssh como root. Esto puede ser fijado para que solamente comandos de rdiff-backup sean ejecutados como root, pero esto está más allá del alcance de este capítulo. Por favor, vea Configuración SSH . Estamos dando por sentado una total confianza, y vamos a configurar la manera más sencilla de lograr logins sin clave.

Desde el PC local, haga lo siguiente:

# [ -f /root/.ssh/id_rsa ] || ssh-keygen -t rsa -f /root/.ssh/id_rsa

Y oprima Enter dos veces para dar claves en blanco. A continuación entre:

# cat /root/.ssh/id_rsa.pub | ssh 192.168.0.2 'mkdir -p /root/.ssh;\
> cat - >>/root/.ssh/authorized_keys2'

Le va a pedir su clave como root.

Ahora puede hacer "ssh" al PC remoto como root sin tener que entrar una clave, y el respaldo con rdiff-backup puede ser automatizado.

A continuación, cree un script de bash que contenga todos los comandos de rdiff-backup. Nuestro script puede parecerse a esto:

#!/bin/bash
RDIFF=/usr/bin/rdiff-backup
echo
echo "=======Respaldando 192.168.0.1 root======="
${RDIFF} --ssh-no-compression --exclude '/tmp/*' --exclude '/proc/*' --exclude '/sys/*' --exclude '/media/*/*' / /media/sdb1/rdiff-backups/192.168.0.1/root
echo "(y purgar incrementos mayores de 1 mes)"
${RDIFF} --remove-older-than 1M --force /media/sdb1/rdiff-backups/192.168.0.1/root
echo
echo "=======Respaldando 192.168.0.1 montaje sda5======="
${RDIFF} --ssh-no-compression --exclude /media/sda5/myjunk /media/sda5 /media/sdb1/rdiff-backups/192.168.0.1/sda5
echo "(y purgar incrementos mayores de 1 mes)"
${RDIFF} --remove-older-than 1M --force /media/sdb1/rdiff-backups/192.168.0.1/sda5
echo
echo "=======Respaldando 192.168.0.2 root======="
$${RDIFF} --ssh-no-compression --exclude '/tmp/*' --exclude '/proc/*' --exclude '/sys/*' --exclude '/media/*/*' --exclude '/mnt/*/*' 192.168.0.2::/media/sdb1/rdiff-backups/192.168.0.2/root
echo "(y purgar incrementos mayores de 1 mes)"
${RDIFF} --remove-older-than 1M --force /media/sdb1/rdiff-backups/192.168.0.2/root

Ahora puede nombrar este script de bash como "myrdiff-backups.bash" y colocarlo en /usr/local/bin en nuestro servidor de respaldos local, y dándole permisos para ser ejecutable. Ejecute el script para asegurarse de que funciona.

Y finalmente, configure cron para llamarlo cada noche a las 8 PM. La siguiente línea en el crontab de root debe servir como llamada

# crontab -e
y insertar la línea siguiente
0 20 * * * /usr/local/bin/myrdiff-backups.bash
Content last revised 14/08/2010 0100 UTC