Crear copias de seguridad automáticas en Linux

Hola! En este post vamos a ver cómo hacer copias de seguridad de tu pc de forma gratuita y automática, en este caso de un servidor Linux en raspberry pi. ¿Será la mejor opción para ti? Entra y descúbrelo!

Entorno

Antes de meternos en materia, vamos a comentar un poco sobre la motivación y la necesidad de lo tratado en este post, así como la distribución del entorno para llevar a cabo las copias de seguridad. Lo aquí tratado es meramente informacional, puedes usar los puntos que más te convengan o hacer las cosas de la forma que mejor te venga, dependiendo de tus necesidades.

Actualmente estoy trabajando en una web que corre sobre un servidor local, el cual está alojado en una máquina Linux, concretamente una Raspberry Pi. Según he leido por las redes (a mi aún no me ha ocurrido), de vez en cuando las tarjetas SD de estos dispositivos se corrompen, por lo que corremos el riesgo de perder toda nuestra información y el trabajo de semanas o meses.

La idea es dejar este dispositivo conectado las 24h y hacer el backup en un disco externo, pero no quiero tener el disco duro siempre conectado, por lo que en un momento concreto del día, encenderemos a través del protocolo Wake On Lan (WOL) otro equipo que será el que tenga conectado el disco duro, se generará la copia a través de la red y volveremos a apagarlo.

Encendiendo el equipo encargado de los backups a través de Wake On Lan

El requisito más importante para llevar a cabo este paso es disponer de una placa base compatible con WOL, en mi caso, usaré una MSI A320M -A Pro MAX, una de las más asequibles para el socket AM4.

placa base compatible con wake on lan
Placa base

Para configurarlo, hemos de entrar a la BIOS de la placa base y activar las siguientes opciones:

encender equipo pci wol
Activar Resume By PCI-E Device
activar lan option wake on lan
Lan Option ROM

Respecto al sitema operativo, se usará un Ubuntu con el inicio de sesión automático, puesto que si encendemos el pc automáticamente cuando no estemos delante, no podremos iniciar sesión, además, la idea es tenerlo todo automatizado : )

Para finalizar con este equipo, necesitaríamos la dirección MAC de la interfaz de red cableada, para ello usaremos el comando:

ifconfig

como obtener direccion mac en linux
Obtener mac

La dirección mac sería la señalada con «ether». 2c:f0:5d:a8:1f:a1.

Una vez hecho esto, falta configurar la raspberry (servidor) para que encienda este equipo, para ello vamos a instalar el paquete wakeonlan:

sudo apt-get install wakeonlan

instalar wakeonlan en linux
Instalando wakeonlan

Con este paquete podremos enviar el “paquete mágico” que despertará el pc encargado de los backups.

Ahora programaremos el envío de este paquete a las 06:00 de la madrugada de Lunes a Viernes (1-5). Para añadir una tarea programada, ejecutaremos en consola:

crontab -e

Y añadiremos una nueva línea:

00 06 * * 1-5 wakeonlan [direccion mac equipo]

programando wakeonlan crontab
Añadiendo tarea wakeonlan a crontab

Como apunte, hay que especificar que ambos equipos han de estar conectados a la misma red / subred, y el equipo a iniciar ha de estar conectado mediante cable.

Haciendo la copia de seguridad con dd

Ahora vamos a configurar el equipo que realizará los backups, para ello, usaremos dd a través de ssh. DD se encarga de hacer copias a bajo nivel.

En este caso tenemos varias opciones, una de llas podría ser comenzar la copia justo al arrancar, pero esto provocaría que el proceso también se llevase a cabo en momentos del día cuando encendiésemos el equipo y no estuviésemos interesados en hacer la copia, por lo que también haremos uso de crontab para hacerlo a una hora determinada. Daremos un margen de 2 minutos para iniciar el equipo, y programaremos una nueva tarea en este equipo:

crontab -e

02 06 * * 1-5 scriptBackup.sh

backup automatico crontab
Añadiendo tarea cron

¿Por qué un .sh y no el comando directamente? Porque así podremos agregar la instrucción de apagado al finalizar el proceso, o añadir más scripts de otros backups sin tener que añadirlos también al cron.

Primero crearemos el script en la carpeta de nuestro usuario:

touch scriptBackup.sh

Y le damos permisos de ejecución:

chmod +x scriptBackup.sh

A continuación lo editaremos con el siguiente contenido:

backup con dd automatico ssh
Haciendo backup con dd

ACTUALIZACIÓN: Después de alguna prueba me he percatado de que cron no ejecuta este comando ssh sin pedir contraseña, ya que no encuentra la clave privada con la que autenticarse. Para solucionarlo habría que indicar a ssh la ubicación de la clave privada que ha de usar, la primera parte de la instrucción quedaría así (en el siguiente apartado verás cómo generar la clave a la que se referencia) : ssh -i /home/usuario/clave_ssh_pi pi@192.168.0.101…. 

La instrucción que hace la copia de seguridad es la siguiente:

ssh pi@192.168.0.101 “sudo dd if=/dev/mmcblk0 bs=1M” | dd of=”/media/usuario/TOSHIBA EXT/raspibackup/raspi.img” > /dev/null 2>&1

Expliquemos un poco esta instrucción:

ssh pi@192.168.0.101 –> estamos conectándonos por ssh a la raspberry (esta ha de tener activo el servicio SSH)

“sudo dd if=/dev/mmcblk0 bs=1M” –> es el comando que pedimos ejecutar a la raspberry, el parámetro if hace referencia al origen de los datos (tarjeta sd en este caso) y bs hace referencia al tamaño del bloque, en este caso, 1 Mega.

| dd of=”/media/usuario/TOSHIBA EXT/raspibackup/raspi.img” –> Con | estamos redirigiendo la salida del comando anterior a la entrada del actual, en el cual dd con el parámetro of redirigirá lo que llega por la red hacia el fichero raspi.img dentro de un disco duro externo del equipo que hará el backup.

– > /dev/null 2>&1 –> con esta instrucción redirigimos la salida del comando hacia /dev/null, podríamos decir que este directorio es el “basurero” de Linux.

Un aspecto a tener en cuenta es que a la hora de conectarnos por SSH se nos pedirá la clave de usuario, por lo que esto no encaja en nuestro proceso automatizado, para poder hacer login automáticamente, debemos incluir en nuestro servidor la clave SSH pública del cliente.

Creando clave pública y privada para conectarnos por SSH

Para explicar este punto, hemos de introducir el concepto de clave pública y privada. Estas claves se usan en la criptografía asimétrica para la comunicación entre dos individuos. Cada uno tendrá su par de claves pública / privada, usarán su clave privada para cifrar y la pública del otro extremo para descifrar. En este caso haremos algo similar. En nuestra máquina cliente generaremos un par de claves enviando la pública a la máquina servidor para permitir el login por SSH sin contraseña.

Creando clave privada y pública en equipo cliente

Lo primero que haremos será entrar al directorio .ssh con cd y generar una clave, en mi caso cambiaré el nombre por defecto a ‘clave-ssh-pi’:

cd ~/.ssh

ssh-keygen

ssh keygen linux
Generando llaves para ssh

Nos pedirá un passphrase, lo dejaremos en blanco, una vez finalizado el proceso tendremos nuestras claves pública y privadas generadas:

generando clave privada y publica ssh
Claves ssh generadas

Ahora hemos de añadir nuestra clave privada al cliente de inicio de sesión con ssh-add:

ssh-add clave-ssh-pi

anadir clave ssh login
Añadiendo nuestra clave a ssh

Para terminar la configuración en el cliente, copiaremos la clave pública al servidor:

sudo scp clave_ssh_pi.pub pi@192.168.0.101:/home/pi

copiar por ssh
Copiando nuestra clave pública

Autorizando la clave pública del cliente en el servidor SSH

En el servidor solo tendremos que hacer 2 sencillos pasos, primero introduciremos la clave pública dentro de .ssh, también podríamos haberlo hecho a la hora de copiarlo desde el cliente:

cp clave_ssh_pi.pub ./.ssh

cd .ssh

Creamos el fichero authorized_keys, en el que por convenio se especifican las claves que tendrán permiso para hacer login son contraseña en el sistema:

touch authorized_keys

Y ahora añadimos la clave al fichero:

cat clave_ssh_pi.pub >> authorized_keys

añadir clave publica permitidas ssh
Añadiendo la clave pública a los autorizados

Ya podríamos conectarnos desde el cliente sin necesidad de introducir usuario y contraseña:

ssh pi@192.168.0.101

login sin contraseña ssh
Login sin contraseña

Recuperando el backup

Pongámonos en la situación de que nuestra tarjeta SD ha muerto y necesitamos recuperar nuestro sistema, solo tendremos que conseguir otra tarjeta SD, de igual o superior tamaño, en amazon puedes encontrar alguna a buen precio, y grabar la última imagen que hayamos guardado en la nueva tarjeta.

Para ello podemos usar distinto software como baleta etcher. Simplemente hemos de abrir el programa, seleccionar el archivo .img de nuestro backup y como destino, la nueva tarjeta sd:

tarjeta sd raspberry backup balena etcher
Preparando copia a nueva tarjeta SD

Solo tendremos que esperar a que termine el proceso para tener nuestra nueva tarjeta lista. A continuación sustituiremos la tarjeta corrupta por la nueva y nuestro sistema iniciará como si nada, puesto que es una copia exacta.

proceso copia balena etcher tarjeta sd backup raspberry
Copiando backup a nueva tarjeta

Saludos.