Las tarjetas microSD suelen ser las primeras en caer debido a su delicadeza; sobre todo si las tienes enchufadas en un dispositivo que está funcionando constantemente. Es el caso de las Raspberry Pi, de la cual puede que quieras hacer un backup de su sistema operativo por si le llega el fatal día y no tienes ganas de volver a empezar de cero configurando todo en una nueva microSD.
Además lo vamos a hacer sin tener que desenchufar la Pi de la corriente, ni sacar la tarjeta microSD en ningún momento. Esto va bien si tienes un servidor que no puedes apagar, por ejemplo. Así, obtendremos un archivo con el cual clonar la imagen de la Raspberry Pi.
Para que quede claro lo que vamos a abordar en esta entrada, esto es todo lo que queremos conseguir:
- Un backup del sistema de la Raspberry Pi (Raspbian, en este caso).
- Hacerlo con la Raspberry Pi funcionando, es decir, SIN APAGARLA ni quitando su microSD. A esto se le llama hot backup.
- Programar dicho backup para que se ejecute automáticamente cada semana a altas horas de la madrugada (o cuando queramos).
- Obtener el backup en un fichero .img, pero comprimido en un .gz para que ocupe menos y para poder restaurarlo incluso desde Windows con el programa Raspberry Pi Imager, balenaEtcher o similar.
- Enviar el backup automática y directamente a un disco duro externo o pen drive que tengas conectado a la Raspberry Pi, o incluso por la red.
- Eliminar automáticamente los backups antiguos y mantener sólo los 3 más recientes.
- Hacerlo todo desde PuTTY (desde Windows) o desde la terminal de Raspbian.
Aunque parece mucha cosa, realmente solo necesitamos un par de líneas de código y poco más. Realmente lo que más tiempo me ha llevado ha sido encontrar los comandos que me han servido para este propósito (tengamos en cuenta que no soy ningún profesional de esto).
[toc]
Hazte un backup cada semana (o cuando quieras) de tu Raspberry Pi para clonarla en un futuro y elimina las copias de seguridad antiguas automáticamente
Primero: Instalar cron y pv
Abre la terminal, ya sea desde la propia Raspbian o desde PuTTY o desde donde te suelas conectar y busca actualizaciones de tu sistema introduciendo:
sudo apt-get update
sudo apt-get upgrade
Con todo actualizado, vamos a descargar crontab (la función que nos permite programar tareas) en el caso de no tenerlo ya de serie:
sudo apt install cron
Con ello ya instalado, debemos habilitar que pueda ejecutarse en segundo plano usando el comando:
sudo systemctl enable cron
Aprovechamos y también instalamos pv, una función que crea una especie de barra de progreso y de tiempo transcurrido directamente en la terminal. Nos servirá para saber cómo va nuestro backup cuando se esté realizando la copia de seguridad de la Raspberry Pi.
sudo apt-get install pv
También debemos saber la ruta de origen de la microSD en el que está instalado el sistema operativo; introducimos este comando:
lsblk -fm
En mi caso es mmcblk0. Lo sé porque dentro de este directorio está la partición boot, que es la de arranque, y rootfs que alberga el resto (y porque coincide con el tamaño de mi microSD de 32GB, aunque ponga 29GB, ya sabemos que las unidades de almacenamiento suelen venir con menos espacio del prometido). El término mmcblk0 lo tendré que tener a mano porque luego lo voy a necesitar. ¡Haz lo mismo con el tuyo!
Ahora ya lo tenemos todo para ponernos manos a la obra.
Segundo: Creando el script que nos hará la copia de seguridad
Como vamos a programar que cada día/semana/mes se haga un backup, la unidad acabará acumulando una cantidad de copias de seguridad, ergo, gigas, que no nos interesa. Así pues, también vamos a establecer que sólo se mantengan las 3 más recientes.
Para ello vamos a crear un script donde recopilaremos ambas funciones (copia de seguridad + limpieza de las antiguas), que será el que luego ejecutará crontab cada X tiempo.
Entonces, vamos a un directorio donde crearemos y guardaremos el script; en nuestro caso, en la carpeta Documents mismamente. La ruta completa de la carpeta es /home/pi/Documents, pero precisamente al estar dentro de /home puedes llegar hasta Documents abreviando y poniendo directamente este comando:
cd Documents
Estando dentro de Documents vamos a crear un documento vacío que se convertirá en nuestro script:
sudo nano backup.sh
«nano» es el procesador de textos, como si fuese el bloc de notas de Windows, y «backup.sh» el nombre del documento. Puedes ponerle el que quieras mientras termine en .sh. Al enviar este comando se abrirá el mencionado procesador de textos donde incluiremos el código del script que vamos a revisar con atención aquí debajo.
Repito: antes de copiar y pegar a lo loco lo siguiente, vamos a echarle un vistazo primero para que te lo puedas personalizar:
#!/bin/bash
echo «Comenzando copia de seguridad.»
sudo dd if=/carpeta/de/entrada bs=1M | pv | gzip – | dd of=/carpeta/que/almacenará/tu/copia/$(date +%Y%m%d\_%H%M%S)\_pi_clone.gz
echo «Copia de seguridad realizada.»
El script tiene que comenzar con la línea #!/bin/bash para que Raspbian entienda que se trata de un script. Es obligatorio ponerla al principio de todo para que el invento funcione.
La segunda línea, que empieza por echo es simplemente para que muestre por pantalla el mensaje «Comenzando copia de seguridad».
La tercera línea (¡es una sola! No está dividida en dos, pero es muy larga) es la que nos hará el backup. Vamos a diseccionar qué hace cada cosa:
- sudo: probablemente ya lo sabrás, te sonará o ya la hayas usado: es para darle permiso de administrador a la operación.
- dd: hace la copia de seguridad.
- if=: Aquí va la ruta de origen de la copia, es decir, tu microSD. Es lo que hemos anotado antes, en mi caso, mmcblk0.
- pv: Lo hemos instalado antes y es para que el terminal muestre una barra de progreso.
- gzip – : para que a la vez que hace la copia, lo comprima en formato .gz para que ocupe menos.
- dd of=: Si if era el origen, of es dónde irá a parar la copia. Yo la he puesto en una carpeta del disco duro Toshiba de 3TB que tengo conectado por USB a la Raspberry Pi (y al cual accedo desde Windows cómodamente) montado en la ruta media/TOSHIBA3TB/Backup/.
- $(date +%Y%m%d\_%H%M%S)\_pi_clone.gz: Es el nombre que tendrá el archivo resultante (la fecha y hora en la que se hizo el backup).
La cuarta línea vuelve a ser un echo que nos anunciará «Copia de seguridad realizada.» si el anterior comando ha funcionado.
Así pues, en mi caso la historia queda así:
#!/bin/bash
echo «Comenzando copia de seguridad.»
sudo dd if=/dev/mmcblk0 bs=1M | pv | gzip – | dd of=/media/TOSHIBA3TB/Backup/$(date +%Y%m%d\_%H%M%S)\_pi_clone.gz
echo «Copia de seguridad realizada.»
Ahora queda guardarlo pulsando Ctrl+O en el teclado. Nos preguntará el nombre del archivo por el cual lo queremos guardar; en principio ya estará escrito como backup.sh (o el que le hayas puesto antes) así que sólo tocará pulsar Enter.
Entonces, para salir del procesador de textos nano tecleamos la combinación Ctrl+X y volveremos a la terminal.
Sobre todo, que no se nos olvide hacerlo ejecutable para que luego cron pueda arrancarlo automáticamente:
sudo chmod +x /home/pi/Documents/backup.sh
Esto quiere decir que ya tienes un script que te hace una copia de seguridad cuando lo ejecutas. Todavía queda programarlo para que arranque automáticamente y añadirle lo de que elimine los backups antiguos, pero si quieres puedes probar si funciona usando el comando:
./backup.sh
Recuerda que para que se inicie tienes que estar en la carpeta Documents (o en la que hayas elegido guardar el archivo). En principio, al salir de nano deberías estar en Documents. Sino, ya sabes: cd Documents o cd /home/pi/Documents y entonces, ./backup.sh.
Ten en cuenta que la copia de seguridad suele tardar lo suyo en completarse. En mi caso, unas 3 horas para una microSD de 32GB (aunque no toda está ocupada).
Ya de paso: que se borren los backup de la Raspberry Pi antiguos
Si el backup de tu Raspberry Pi ha funcionado, lo deberías tener en un fichero comprimido dentro de la carpeta de salida que has establecido en el script (lo que va después de dd of=).
En caso de estar todo bien, vamos a añadirle otro par de líneas a nuestro script para que elimine las copias más viejas. Nos colocamos en la carpeta donde lo tengamos (Documents, en mi caso):
cd /home/pi/Documents
Y acto seguido:
sudo nano backup.sh
Esto abrirá de nuevo el editor de textos nano con el flamante script que hemos escrito antes.
Nos vamos hasta abajo donde nos prepararemos para añadir lo siguiente (ojo, todavía no copies nada, vamos a echarle un vistazo primero).
cd /carpeta/que/almacenará/tu/copia && ls -t1 /carpeta/que/almacenará/tu/copia | tail -n +4 | xargs rm -r
cdecho «Antiguas copias de seguridad eliminadas.»
Esta primera línea (que sería la quinta dentro del script) vuelve a ser una única línea bastante largita y se compone de estos comandos, los cuales tendrás que personalizar según tus rutas:
- cd: seguido va la carpeta en la que guardas tu copia de seguridad. La mía, como indicaba antes, es media/TOSHIBA3TB/Backup.
- && ls -t1: Esto va a listar los archivos que hay dentro de la carpeta. Después de este comando hay que escribir nuevamente la ruta de la carpeta de las copias de seguridad, es decir, la misma de antes.
- | tail -n +4 | xargs rm -r: Comando que solo mantendrá los 3 archivos más recientes según su fecha y se cargará el resto.
La siguiente línea (sexta) es un simple cd que nos devolverá a la raíz de la Raspberry Pi (básicamente para que no se quede dentro de Documents al terminar la limpieza de backups).
La última línea echo nos indicará por pantalla que las copias de seguridad antiguas se han eliminado correctamente.
Por tanto, aplicado a mi caso, este nuevo bloque de código me quedaría así:
cd /media/TOSHIBA3TB/Backup && ls -t1 /media/TOSHIBA3TB/Backup | tail -n +4 | xargs rm -r
cdecho «Antiguas copias de seguridad eliminadas.»
Que incorporado a lo que ya tenía en el script, finalmente estaría así:
#!/bin/bash
echo «Comenzando copia de seguridad.»
sudo dd if=/dev/mmcblk0 bs=1M | pv | gzip – | dd of=/media/TOSHIBA3TB/Backup/$(date +%Y%m%d\_%H%M%S)\_pi_clone.gz
echo «Copia de seguridad realizada.»
cd /media/TOSHIBA3TB/Backup && ls -t1 /media/TOSHIBA3TB/Backup | tail -n +4 | xargs rm -r
cdecho «Antiguas copias de seguridad eliminadas.»
Para guardarlo hacemos Ctrl+O, Enter, y luego Ctrl+X para salir.
Nuevamente, antes de ponernos a programarlo para que se lance automáticamente, puedes probar si funciona correctamente ejecutándolo manualmente. O si no quieres esperar a que haga otra copia de seguridad, puedes introducir sólo el código nuevo (es decir, la quinta línea) en la terminal para ver si hace la limpieza o no (puedes poner varios archivos aleatorios de prueba en la carpeta en la que se guardarán tus backups, como fotos o lo que sea, y ver qué pasa).
Programar el script para que se ejecute automáticamente una vez a la semana
Finalmente, si el script funciona bien, ya sólo queda programarlo para que arranque automáticamente cuando se lo digamos. Esto lo conseguimos con crontab, el cual hemos instalado al principio de este tutorial. Para ponernos en marcha tenemos que editar su archivo donde incluiremos la programación del script.
Si estamos en alguna carpeta, nos salimos a la raíz de la Raspberry Pi usando el comando:
cd
Ahora introducimos el siguiente comando en la terminal:
crontab -e
Esto abrirá el editor propio de crontab donde se introducen todas las órdenes a programar.
El archivo tiene un montón de texto comentado (empieza por #) que nos cuenta el funcionamiento de crontab; nosotros nos vamos hasta abajo de todo para añadir una nueva línea.
Antes de todo, vamos a ver el código para adaptarlo a tu caso:
* * * * * /ubicación/de/tu/script.sh
Crontab usa un sistema de 5 asteriscos donde tenemos que configurar la fecha del momento en el que queremos que se lance el script. Así pues, cada asterisco significa lo siguiente (de izquierda a derecha):
1r asterisco – Minutos: de 0 a 59.
2º asterisco – Horas: de 0 a 23.
3r asterisco – Día del mes: de 1 a 31.
4r asterisco – Mes: de 1 a 12.
5º asterisco – Día de la semana: de 0 (domingo) a 6 (sábado)
Seguidamente, hay que escribir la ubicación del script que queremos ejecutar.
En mi caso, quiero que el script que hemos creado antes se ejecute a las 4:10 de la mañana de cada lunes (es decir, la noche del domingo al lunes). Por lo tanto, mi crontab queda así:
10 4 * * 1 /home/pi/Documents/backup.sh
He elegido esta hora porque es cuando la Pi está más desocupada y puede cargar con el backup sin problema.
Con el crontab configurado a tu manera, ya sólo te queda guardarlo pulsando Ctrl+X, introduciendo S para confirmar el guardado del archivo.
Y pulsar Enter para salir.
De este modo, llegado cada lunes a las 4:10 de la madrugada, la Raspberry Pi comenzará a hacer su backup. En la cuarta semana consecutiva, borrará el primer backup que hizo y sólo dejará los tres últimos. Y así cada semana.
Esto ha sido todo por nuestra parte. Si te ha funcionado correctamente, chupito cada vez que he puesto «en mi caso» a lo largo del texto ????.