13 enero 2013

Haciendo un respaldo de la Memoria SD de la Raspberry PI

Cuando compré la Raspberry PI realmente no tenía memorias MicroSD libres, las mas grandes las tenía o en el celular o en la cámara de video, pero por ahí tenia guardada una pequeña memoria de 2GB. Esto era en un principio suficiente para instalar raspian y poner a funcionar la RasPI.

Actualmente me veo un poco más corto de espacio y no está en mi presupuesto la compra de un enclosure para un disco duro externo, así que sacrifiqué la memoria de mi celular (8GB) como donante para la Raspberry PI.



El problema con el que me topé, es que la memoria original al parecer estaba comenzando a dar problemas de bloques malos. En Windows la herramienta de escritura de imágenes paraba con error así que tuve que realizar el respaldo desde Linux.

En esta cortísima entrada les explicaré como migrar a una memoria SD con errores de lectura a una más grande intentando recuperar sus datos.

Un comentario antes de iniciar


Usualmente los sistemas de archivos tienen un "registro" de sectores malos. Con el tiempo los medios ya sean discos duros o almacenamiento de estado sólido pueden fallar, los sistemas de archivos moderno son capaces de identificar estos errores y los "aislan" de tal manera que el volumen de archivos pueda continuar usandose. Obviamente si el daño es demasiado grande inevitablemente se obtiene un fallo tarde o temprano.

Este procedimiento asume que los bloques o sectores dañados son pocos y que el dispositivo aún es visto por el sistema anfitrion.

Asumo que para este procedimiento ustedes cuentan con una computadora con el sistema operativo Linux instalado.

Nota aclaratoria: En esta entrada vamos a utilizar comandos que en potencia podrían podrían dañar la instalación de sistema operativo de su computadora si no son utilizados correctamente. Lean detenidamente la información explicando que hace cada herramienta antes de utilizarla para que no tengan sorpresas desagradables.

Identificando el dispositivo de nuestra tarjeta USB.


Muchos recomiendan el uso de "lsusb" para identificar los dispositivos conectados a un sistema Linux, yo en lo personal, prefiero leer el registro del kernel. Esto lo pueden hacer desde la consola, ejecutando como "root" el siguiente comando:

tail -f /var/log/messages

Esto les mostrará las últimas líneas del archivo /var/log/messages y actualizará las nuevas líneas que se vayan agregando al mismo.

Para identificar el dispositivo que se ha conectado simplemente conecten su memoria USB y manténganse atentos a la información que se muestra.

Ejemplo de salida de tail:
Jan 13 20:31:53 v131 kernel: [  767.067314] scsi9 : usb-storage 3-2:1.0
Jan 13 20:31:53 v131 mtp-probe: checking bus 3, device 4: "/sys/devices/pci0000:00/0000:00:1c.4/0000:0b:00.0/usb3/3-2"
Jan 13 20:31:53 v131 mtp-probe: bus: 3, device: 4 was not an MTP device
Jan 13 20:31:54 v131 kernel: [  768.196754] scsi 9:0:0:0: Direct-Access     Multiple Card  Reader     1.00 PQ: 0 ANSI: 0
Jan 13 20:31:55 v131 kernel: [  768.888765] sd 9:0:0:0: [sdb] 3862528 512-byte logical blocks: (1.97 GB/1.84 GiB)
Jan 13 20:31:55 v131 kernel: [  768.889181] sd 9:0:0:0: [sdb] Write Protect is off
Jan 13 20:31:55 v131 kernel: [  768.893338]  sdb: sdb1
Jan 13 20:31:55 v131 kernel: [  768.894797] sd 9:0:0:0: [sdb] Attached SCSI removable disk


De todas esas líneas lo que nos interesa es el nombre de dispositivo, si notan aparece [sdb], en su computadora podría aparecer con otro nombre.

Si hacemos un ls /dev/sd* podran ver como aparece listado en los dispositivos del sistema:

$ ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3 
/dev/sda4  /dev/sda5  /dev/sda6  /dev/sda7 
/dev/sdb  /dev/sdb1 /dev/sdb2

Para mi ejemplo los dispositivos que se crean son los siguientes:
  • /dev/sdb : Este dispositivo representa la tarjeta SD.
  • /dev/sdb1 : Partición MSDOS donde se aloja el bootloader y el kernel de linux.
  • /dev/sdb2 : Partición / que aloja el sistema Raspbian.
Recuerden que en su sistema el nombre del dispositivo puede ser diferente, en el resto de la entrada me referiré a /dev/sdb como el dispositivo a usar pero recuerden sustituirlo apropiadamente para su sistema.

Realizando un chequeo al sistema de archivos


La tarjeta SD de nuestra Raspberry PI contiene dos particiones, la primera es una partición MSDOS y la segunda una partición ext4.

Primero revisamos la partición msdos:

$ sudo fsck.msdos -v -t -a /dev/sdb1

Los parámetros "-t" y "-a" se encargarán de buscar cluster malos e intentar repararlos.

Luego hacemos algo similar con la partición linux:

$ sudo fsck.ext4 -v -f -c /dev/sdb2

Los parámetros "-f" y "-c" forzarán el chequeo de la partición aunque esta se haya marcado sin problemas y buscarán bloques malos dentro de la partición respectivamente.

Realizando el backup


Lo que continua es más sencillo una vez hemos identificado el dispositivo (para mi caso sdb) simplemente ejecutamos como root el comando "ddrescue", el formato es bastante sencillo, el primer argumento es el archivo o dispositivo origen y el segundo es el destino, para nuestro caso como queremos hacer un backup de la memoria completa leeremos el dispositivo /dev/sdb

$ sudo ddrescue -v /dev/sdb RaspberryPI-backup.img

ddrescue es una versión especializada de dd para realizar recuperación de volumenes de archivos, si tenemos un disco duro que esta a punto de dejar de funcionar podemos intentar leerlo con ddrescue.

Restaurando el Backup


Luego para restaurar, colocamos una nueva tarjeta SD y ejecutamos el comando inverso:

$ sudo ddrescue -v -f RaspberryPI-backup.img /dev/sdb

Utilizamos el argumento "-f" para forzar a que se sobre escriba en el dispositivo destino.

Restaurando a una SD de mayor tamaño


Para restaurar a una memoria de mayor tamaño el procedimiento es exáctamente igual. La única diferencia es que luego de iniciar con la nueva tarjeta ejecutamos el comando siguiente:

$ sudo raspi-config

Y seleccionamos la opción "expand_rootfs", luego seleccionamos "finish" y reiniciamos nuestra RasPI.

Al iniciar dependiendo del tamaño de la nueva memoria esto podría tomar un par de minutos.

¡¡Espero esta corta entrada les haya sido de utilidad!! No habiendo nada más que decir... ¡¡Hasta la próxima!!