Clonar el disco de arranque de la raspberry
La mejor copia de seguridad que puedes hacer del contenido de la Raspberry es una imagen de la tarjeta sobre la que está funcionando. Dejo a continuación un par de métodos para hacerlo de una forma rápida y sencilla.
En mi caso dispongo en la actualizada de una Rpi4 que arranca sobre un pendrive usb de 64 Gb del que quiero crear una imagen para arrancar directamente en caso de que esta falle.
Clonación en frío
La forma más sencilla de realizar una clonación de la unidad del sistema operativo en otra unidad es mediante un segundo sistema operativo al que conectaremos los dos pinchos usb y ejecutamos el comando
sudo dd if=/dev/sda of=/dev/sdb
donde if (input file) es el pendrive origen y of (output file) es el pendrive destino. Un poco de paciencia y ya estería realizada la clonación pero he necesitado un segundo sistema operativo y apagar la raspberry surente un buen rato.
Este método requiere de una unidad de destino con al menos la misma capacidad que la de origen, esté ocupada o no.
Clonación en caliente (Usando rpi-clone)
Identificando la unidad del sistema
Para identificar la unidad del sistema utilizaremos el comando lsblk
que, al ejecutarlo via ssh sobre la Raspberry nos mostrará la siguente salida:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 1 57.3G 0 disk
├─sda1 8:1 1 256M 0 part /boot
└─sda2 8:2 1 57.1G 0 part /
De donde se deduce que la unidad del sistema está montada como “sda”. Ahora es el momento de introducir el pincho sobre el que queremos crear la imagen del sistema y volver a ejecutar el comando `lsblk’, en este caso obtenemos lo siguiente:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 1 57.3G 0 disk
├─sda1 8:1 1 256M 0 part /boot
└─sda2 8:2 1 57.1G 0 part /
sdb 8:16 1 28.7G 0 disk
└─sdb1 8:17 1 28.7G 0 par
Con esto ya sabemos que la unidad origen será “sda” y el destino “sdb” pero tenemos un problema y es que la unidad de destino es mas pequeña por lo que necesitamos saber cuando espacio de “sda” está ocupado. Esto lo podemos obtener con el comando df . -h
que muestra la siguiente salida:
Filesystem Size Used Avail Use% Mounted on
/dev/root 57G 8.5G 46G 16% /
De los 57 Gb sólo están ocupados 8.5 por que, con la unidad de destino de 28.7 Gb será más que suficiente.
Instalación de rpi-clone
Para la instalación del rpi-clone hay que llevar a cabo los siguientes pasos:
- Descargar el repositorio del script
- Descomprimir el archivo descargado
- Renombrar el directorio
- Copiar el directorio al lugar de ejecución
- Eliminar lo la ya no se necesita
Lo realizaremos mediante los siguiente comandos:
wget https://github.com/billw2/rpi-clone/archive/master.zip
unzip master.zip
mv rpi-clone-master rpi-clone
sudo cp rpi-clone/rpi-clone* /usr/local/sbin
rm -rf rpi-clone master.zip
Tambien es posible clonar el repositorio mediante git en lugar de descargarlo, descomprimirlo y renombrarlo.
Ejecución de la copia
Llegados a este punto sólo resta ejecutar el siguiente comando
sudo bash rpi-clone sdb -f
Donde “sdb” es la unidad donde vamos a crear la imagen del sistema y el parámetro “f” fuerza la inicialización de esta unidad. Habrá que esperar un rato, en mi caso unos 30 minutos y obtendremos una salida como la siguiente:
Booted disk: sda 61.5GB Destination disk: sdb 30.8GB
---------------------------------------------------------------------------
Part Size FS Label Part Size FS Label
1 /boot 256.0M fat32 -- 1 28.7G fat32 --
2 root 57.1G ext4 rootfs
---------------------------------------------------------------------------
== Initialize: IMAGE partition table - forced by option ==
1 /boot (48.0M used) : MKFS SYNC to sdb1
2 root (8.4G used) : RESIZE MKFS SYNC to sdb2
---------------------------------------------------------------------------
Run setup script : no.
Verbose mode : no.
-----------------------:
** WARNING ** : All destination disk sdb data will be overwritten!
-----------------------:
Initialize and clone to the destination disk sdb? (yes/no): yes
Optional destination ext type file system label (16 chars max): homeassistant
Initializing
Imaging past partition 1 start.
=> dd if=/dev/sda of=/dev/sdb bs=1M count=8 ...
Resizing destination disk last partition ...
Resize success.
Changing destination Disk ID ...
=> mkfs -t vfat -F 32 /dev/sdb1 ...
=> mkfs -t ext4 -L homeassistant /dev/sdb2 ...
Syncing file systems (can take a long time)
Syncing mounted partitions:
Mounting /dev/sdb2 on /mnt/clone
=> rsync // /mnt/clone with-root-excludes ...
Mounting /dev/sdb1 on /mnt/clone/boot
=> rsync /boot/ /mnt/clone/boot ...
Editing /mnt/clone/boot/cmdline.txt PARTUUID to use d8b40570
Editing /mnt/clone/etc/fstab PARTUUID to use d8b40570
===============================
Done with clone to /dev/sdb
Start - 18:15:21 End - 18:39:32 Elapsed Time - 24:11
Cloned partitions are mounted on /mnt/clone for inspection or customizing.
Hit Enter when ready to unmount the /dev/sdb partitions ...
unmounting /mnt/clone/boot
unmounting /mnt/clone
===============================
Y ya está el pendrive listo para sacar de la raspberry y guardarlo por si falla el del sistema.