Utilice de forma segura las tarjetas SD cuando la energía se puede cortar en cualquier momento

10

Estamos trabajando en un pequeño sistema Linux incorporado (2.6.35-ish) con un dispositivo NAND interno más pequeño para el sistema operativo y las aplicaciones (250-500Meg) y una tarjeta SD con tarjetas SD SDHC de 8 Gb para datos.

El poder de la unidad se puede cortar en cualquier momento.

El sistema debe almacenar datos en tarjetas SD. Estos datos son bastante importantes ... es todo el propósito del sistema. Los sistemas suelen estar completamente desconectados de cualquier red en ubicaciones remotas y los datos se recuperan a través de sneakernet cada 4-8 semanas.

Actualmente, simplemente tenemos VFAT en las tarjetas SD. Eso fue principalmente para que los primeros clientes de prueba pudieran copiar fácilmente los datos manualmente en sus computadoras portátiles Win7.

Sin embargo, ahora me preocupa que solo sea cuestión de tiempo hasta que un corte de energía en el momento incorrecto provoque la pérdida de datos.

¿Cuál es la mejor manera de configurar dicho sistema para evitar la pérdida de datos? JFFS2 suena como lo que quisiera en términos de cómo escribe los datos (y las necesidades de rendimiento no son altas en absoluto), pero suena bastante difícil de usar block2mtd, etc. Tampoco estoy seguro de cómo interactuará el nivel de desgaste de la tarjeta con eso.

¿Cuál es la mejor manera de hacer esto?

EDITAR

Ahora estoy pensando en dejar el sistema de archivos VFAT y asignar archivos de tamaño diario a la vez, llenos de 0xFF, que deberían limitar en gran medida la exposición a fallas del ciclo de energía. Entonces solo pude agregar registros dentro de esos bloques creados previamente, y espero que las tarjetas SD no sean tan estúpidas que borrarían / ​​desgastarían las escrituras de nivel en las regiones 0xFF.

Puedo usar noatime, pero ¿existe un VFAT nomtime equivalente para evitar escrituras en el campo de tiempo modificado? Necesitaría alguna forma de evitar cualquier actualización de metadatos hasta que se cree un nuevo archivo del día.

EDITAR 2

Alguien en el intercambio de pila electrónica me recordó que también hay datos de ECC en NAND, por lo que no hay forma de evitar la necesidad de un borrado.

Entonces, ¿sería apropiado JFFS2 a través de block2mtd en esta situación?

EDITAR 3

Es peor de lo que pensaba. Las tarjetas SD que tengo borrarán los bloques de datos incluso si escribe exactamente el mismo contenido en el disco. Los bloques de borrado son de 64 KB, y eso es demasiado grande para retrasar por completo las escrituras. Almacenaré hasta 128 KB de datos en flash NAND (que puedo controlar el comportamiento de escritura), en una especie de diario, y luego escribiré bloques de 128 KB en un archivo alineado a 128 KB en una partición VFAT en la tarjeta SD (en caso de que otras tarjetas SD tengan bloques de borrado de 128 KB).

Darron
fuente
1
"ojalá las tarjetas SD no sean tan estúpidas ..." <--- ROFLOL. ¡No es probable!
derobert
Hasta que encuentre una solución completa al problema que tiene, use el synccomando después de cada escritura en la tarjeta SD, escribiría los bits inmediatamente después de haberlos cambiado / creado sin almacenarlos en la RAM para que sus cambios estén al menos en la tarjeta y no se habría ido por la pérdida de poder.
Hanan N.
syncprobablemente empeoraría las cosas, ya que aumenta la fracción de tiempo que los metadatos están a mitad de actualización.
Ben Voigt

Respuestas:

5

Bueno, la forma de solucionar esto es solucionar el problema de "se puede cortar la energía en cualquier momento". ¿Es imposible agregar incluso un minuto de batería?

Alternativamente, tal vez podría usar dos tarjetas SD. Escriba los datos en una tarjeta, sincronice, escriba en la otra. Cada bloque de sus datos necesitaría una suma de verificación y un número de bloque, pero incluso con algunas fallas de energía bastante desafortunadas, una de las tarjetas debería estar en lo cierto.

Su problema básico será la nivelación del desgaste en las tarjetas SD, que AFAIK depende del proveedor de la tarjeta (y tal vez incluso del lote, pueden cambiarlo siempre que sea necesario). Probablemente no maneja el corte de energía correctamente. Y dependiendo de lo que haga, eso no solo significa corromper el bloque en el que está escribiendo.

  1. Suponga una tarjeta trivialmente pequeña: 3 bloques (flash). El bloque 1 ha recibido más escrituras que 2 o 3. Llamaré a los bloques físicos por número y a los bloques lógicos A, B, C por letra. En este momento, A = 1, B = 2, C = 3.
  2. Emite una escritura para bloquear A. La tarjeta SD es como aha! necesitamos nivelar el desgaste aquí, de lo contrario el bloque 1 se desgastará antes de 2 y 3. Decide intercambiar los bloques 1 y 2.
  3. Lee el bloque 1 en la posición RAM i (en la tarjeta SD, no en la RAM del sistema). Actualiza la parte que desea cambiar.
  4. Lee el bloque 2 en la posición RAM ii
  5. Borra el bloque 1
  6. Escribe la posición RAM ii en el bloque 1.
  7. Actualiza la tabla de mapeo para decir B = 1
  8. Borra el bloque 2.
  9. Escribe la posición RAM i en el bloque 2.
  10. Actualiza la tabla de mapeo para decir A = 2

Por supuesto, "actualizar la tabla de mapeo" no siempre es trivial. Y el orden de 5–10 podría ser diferente (si todos se completan, no importa, bueno, los borrados tienen que venir antes de los escritos, por supuesto). Pero ocurre una falla de energía, podría terminar no solo con A dañado (como es de esperar) sino también con B. O, si ocurre una falla de energía durante una actualización de mapeo, quién sabe qué tipo de corrupción causará.

derobert
fuente
1
Estas unidades deben vivir en entornos relativamente hostiles durante muchos años y, cuando se instalen, se enviarán a varios países en los que preferiríamos no tener que calificar para baterías. Probablemente dejaríamos caer MMC / SD y construiríamos nuestra propia solución NAND-flash antes de usar una batería.
darron
Bueno, en nuestro caso, la solución "arreglar la energía puede cortarse en cualquier momento" se reduce a "evitar que los conductores de camiones se queden dormidos al volante y conduzcan a nuestros dispositivos". "Un camión chocó contra él" es en realidad el modo más común de falla.
SF.
1
Un minuto de batería no debería ser necesario. La cantidad de energía necesaria para desmontar de forma segura una tarjeta SD debe estar dentro del rango que puede almacenar un condensador.
Ben Voigt
4

Algo similar se discutió en electronics.stackexchange.com: ¿Cómo protejo la tarjeta SD contra fallas inesperadas de energía?

Una respuesta lateral que funciona en conjunto con las soluciones de software es mirar el hardware (hubo una pregunta en ESE sobre esto también, pero no puedo encontrarlo ahora; no se trataba estrictamente de tarjetas SD, solo de dispositivos que pierden energía) y cómo detectar esto y actuar en consecuencia).

La historia corta es: puede que no tenga energía de la batería, pero su fuente de alimentación tiene algunos condensadores bastante grandes para suavizar el suministro. Básicamente, el poder no solo se apaga. El voltaje disminuye gradualmente. Probablemente exista un circuito / circuito de protección de baja tensión que establezca la señal RESET en su sistema integrado cuando el voltaje caiga por debajo de cierto punto. Las placas base de PC también las tienen, y responden a la señal 'POWEROK' de la fuente de alimentación. Lo que esto significa es que, cuando se corta la energía, la computadora se detendrá por la fuerza unos pocos milisegundos antes de que el voltaje caiga por debajo de los niveles seguros. Durante este tiempo, los periféricos como las tarjetas SD todavía están encendidos, pero no hay más transacciones provenientes de la computadora.

Es muy probable que una tarjeta SD tenga tiempo suficiente para completar cualquier transacción pendiente, incluida la nivelación de desgaste, antes de que se apague. Mejorar su fuente de alimentación con un condensador lo suficientemente grande o usar uno cerca de la tarjeta SD puede ayudar a garantizar esto, pero siempre puede experimentar con su plataforma tal como está. Es muy probable que conserve la energía durante el tiempo suficiente.

Si el aspecto de hardware del problema no es un problema, puede resolver los solo de software. Las ideas de derobert de usar dos tarjetas para redundancia no son malas, y usar un sistema de archivos estándar como VFAT corre menos riesgo de confundir los algoritmos de nivelación de desgaste de la tarjeta.

De todos modos, bien podría ser que no tendrás tanto problema. Asumiendo que un bloque en su tarjeta puede sobrevivir a 100 escrituras (conservador, ¡pero trate de obtener tarjetas de buena calidad!), Y usando tarjetas de 8GB, habrá escrito 800GB para cuando el primer bloque muera (estadísticamente hablando, por supuesto).

Alexios
fuente
La pregunta comenzó porque ya estaba recibiendo una corrupción masiva de la tarjeta SD en los eventos de apagado. Muy a menudo, en realidad. Tal vez 1 de cada 20 eventos de falla de energía fueron catastróficos, y posiblemente 1 de cada 4 causó al menos ALGUNOS daños. Eventualmente cambié a almacenar el valor de un día de datos en flash NAND interno y copiarlo a SD a medianoche (una operación de aproximadamente 1 segundo). Estoy buscando mejorar las cosas en el futuro. Ya tengo 400 uF de tapas en el riel ... aparentemente no lo suficiente ... tal vez el apagón no se está manejando correctamente.
Darron
¡Esa es una tasa de incidencia bastante alta! Es hora de obtener las sondas de osciloscopio y ver esto en acción, creo. Aunque es probable que pueda solucionarlo en el software, la mejor manera en términos de consumo de energía es asegurarse de que no tenga fallas de hardware. ¿Quizás podría cubrir sus apuestas y preguntar también en electronics.stackexchange.com ?
Alexios
@darron, ¿con qué solución terminaste para el problema de almacenamiento de tu tarjeta SD? ¿Sigue escribiendo en NANDFlash y luego copiando una vez al día? Tengo un diseño con la tarjeta SD como RFS principal (sin NANDFlash por separado) y veo problemas de corrupción de datos, con y sin condiciones repentinas de falla de energía.
fred basset
4

Tuvimos un problema con nuestra SD, el sistema de archivos raíz ext2 se corrompió en fallas inesperadas de energía. En primer lugar, hacemos que el sistema se ejecute con un montaje raíz de solo lectura. Como necesitábamos algo de almacenamiento grabable (pero no estábamos registrando datos), configuramos una segunda partición como grabable. Para minimizar el daño de FS en caso de falla de energía inesperada, hemos hecho de esta una partición ext3, aunque esto causará al menos el doble de escrituras físicas en la tarjeta. Esta combinación (pero admito que nuestras escrituras de segunda partición son poco frecuentes en comparación con un registrador de datos) parece ejecutarse sin problemas. Hasta aquí. (Sistemas instalados durante aproximadamente 30 meses en instalaciones profesionales)

Dave Kitchen
fuente
3

Para la seguridad de datos en un entorno con la posibilidad de cortes de energía y seguridad de datos en general, debe considerar aún más puntos.

NO USE celdas MLC para almacenamiento, solo SLC tiene un tiempo de retención de datos que es suficiente. Entonces, esas tarjetas SLC pueden tener un firmware inteligente, algunas no pueden en ningún estado ser corrompidas por la pérdida de energía. Reconocen el corte de energía midiendo y aseguran que el último bloque está escrito completamente.

Esas tarjetas son más caras y un poco más lentas que las células MLC. Ver proveedores como swissbit para tarjetas.

Rotesmofa
fuente