Verificar una tarjeta Micro SD en una Raspberry PI

Tengo un parque bastante alto de Raspberry PI instaladas. Se trata de dispositivos baratos y capaces, muy convenientes en el mundo de IoT cuando es necesario utilizar un Sistema Operativo avanzado como Linux.

La fiabilidad de la Raspberry PI es bastante alta. Tanto es así que los únicos casos que estoy viendo de fallos son debidos a la fuente de alimentación o a defectos en la tarjeta microSD.

En líneas generales se puede detectar un cargador USB inadecuado observando un icono de un rayo amarillo en la esquina superior derecha de la pantalla conectada a la Raspberry PI o, si no tenemos pantalla, observando el LED rojo de alimentación en la placa base de la Raspberry PI. Si ese LED parpadea o se apaga, el cargador USB es inadecuado. Aunque la Raspberry PI esté funcionando bien, reemplaza ese cargador USB. Créeme, tarde o temprano tendrás problemas misteriosos e inexplicables. Cambia el cargador USB.

En serio, cámbialo.

El segundo punto débil de una instalación Raspberry PI es la tarjeta microSD. Muchas tarjetas están dañadas (por ser viejas, defectuosas o por una alimentación inadecuada como describo más arriba) y pueden corromper datos. Esta corrupción, además, suele ser muy errática y sus características son muy diferentes a los errores en un disco duro normal y corriente. Por ejemplo, una tarjeta microSD puede corromper datos de un fichero cuando leemos sectores de un fichero que no tiene nada que ver. Es decir, se pueden corromper datos incluso cuando solo estamos leyendo y los datos corruptos pueden estar en la otra punta de la lista de bloques que conforman una tarjeta microSD.

Los detalles de corrupción de una tarjeta microSD son complejos, dependen del fabricante y van variando con la evolución de la tecnología. Recuerda también que una tarjeta microSD, por su propia teoría de funcionamiento, tiene un número de escrituras limitado. Como norma, cuando se ha superado la capacidad de escritura de una tarjeta microSD nos encontraremos que leemos basura, no errores. Es decir, podemos leer un fichero sin ningún error, pero su contenido está corrupto. Este fallo silencioso es muy alarmante y hace que emplear sistemas de ficheros con comprobación de errores como ZFS sea muy recomendable, si es posible.

Ante esta opacidad, lo más conveniente es utilizar una tarjeta microSD moderna y no darle "segundas oportunidades": ante cualquier comportamiento extraño, reemplázala. Son baratas, cámbiala.

En serio, ¡tírala y usa otra!

Desde que tengo tolerancia cero ante cargadores USB "buenos" que parece que funcionan bien, pero no, o tarjetas de memoria que corrompen datos de forma habitual, soy mucho más feliz. ¡Hazme caso!

Una forma simple de verificar una tarjeta de memoria microSD es grabar muchos datos en ella y luego leerlos y comprobar que no han sido alterados. Hay que tener en cuenta algunas cosas:

  1. Los datos a grabar no deben seguir patrones simples que se puedan comprimir con facilidad. Algunas tarjetas microSD realizan compresión de forma interna y transparente.

    Lo ideal es grabar datos aleatorios que no se repitan.

  2. La cantidad de datos grabados debe ser más grande que la memoria RAM de la Raspberry PI. A la hora de verificar los datos no queremos que se obvien lecturas en la tarjeta microSD porque se encuentren en caché.

  3. No quiero depender de software específico, que puede no estar disponible en una instalación reducida IoT.

Dados esos tres puntos, lo que hago es lo siguiente:

  1. Uso un script shell.
  2. Genero un fichero de 2 Gigabytes [1] con datos aleatorios. Si esta grabación se corrompe, no lo detectaremos.
  3. Copio dicho fichero en otro fichero. Esta copia puede generar corrupción.
  4. Comparamos ambos ficheros. Si la tarjeta está bastante dañada, es muy posible que detectemos diferencias provocadas por corrupción.
  5. Repetimos el proceso varias veces.

El código es el siguiente:

root@raspberrypi:~# cd /tmp
root@raspberrypi:/tmp# for i in `seq 1 16`; do echo Intento $i; dd if=/dev/urandom of=z1 bs=65536 count=32768 2>/dev/null; cp z1 z2; cmp z1 z2 && continue; echo FALLO; md5sum z1 z2; break; done

Si esta comprobación no muestra problemas, pero sigues teniendo corrupciones frecuentes, no te lo pienses más: prueba con otra tarjeta microSD y otro cargador USB.

[1]

Genero un fichero aleatorio de 2 Gigabytes de tamaño porque las Raspberry PI que tengo desplegadas por ahí tienen 1 Gigabyte de RAM. Generando un fichero más grande que la memoria RAM nos aseguramos de que luego leemos los datos de la tarjeta microSD y no de la caché.

Si estás usando una de las nuevas Raspberry PI 4 con 4 Gigabytes de RAM, haz el cambio correspondiente.

Actualización 20191127: Artículo posterior sobre este tema: Verificar una tarjeta Micro SD en una Raspberry PI (2).