Tornando o cartão SD à prova de corrupção

11

Meu dispositivo linux incorporado usa um cartão SD para salvar certos dados de diagnóstico, copiosos demais para o flash interno.

O problema é que, se o dispositivo for desligado inesperadamente, o sistema de arquivos (FAT32) no cartão está corrompido.

Não há como evitar falhas de energia inesperadas ou desligá-lo pelo usuário dessa maneira, e o dispositivo deve ser relativamente livre de manutenção. Pior ainda, os dados são gravados continuamente, de modo que as corrupções são muito frequentes, e o Linux, ao detectar FS defeituoso, o remonta apenas para leitura silenciosamente.

Quais métodos você sugeriria para mitigar isso? A execução do fsck.vfat automaticamente na inicialização é suficiente?

Mais algumas informações:

  • O cartão não deve ser considerado removível pelo usuário. É para ser pensado como disco interno. Quaisquer dados armazenados nele estarão acessíveis para download na rede ou em uma unidade USB, e o sistema limpa automaticamente as entradas mais antigas. Isso significa que não precisa ser legível no seu PC comum.
  • O sistema atualmente suporta FAT, yaffs e jffs2. É possível adicionar outros sistemas de arquivos ao kernel, mas se existirem outros caminhos, preferimos primeiro.
  • A gravação pode ser suspensa sob demanda, mesmo por vários minutos, sem perda de dados.
  • perda parcial de dados ou corrupção menor é aceitável. A parada completa do log não é.
  • os eventos de desligamento são completamente imprevisíveis na maioria das vezes.
  • o sistema está sendo executado em ARM9, 200MHZ, 64MB de RAM, 32MB de flash interno e consome a maior parte da energia da CPU em sua função principal. Leve isso em consideração ao pensar em soluções sofisticadas e pesadas em recursos.
SF.
fonte
3
Você provavelmente já pensou nisso, mas vale a pena mencionar para outras pessoas que vagam por essa questão: a maioria dos cartões de memória flash (SD, CF, etc) tem apenas uma tolerância de gravação de alguns milhares de ciclos (na melhor das hipóteses). O uso de cartões normais para registro de dados ou tarefas semelhantes acabará com eles (e geralmente em menos tempo do que as pessoas pensam).
Chris S
@ Chris: Isso geralmente é apenas de acréscimo e substitui as entradas mais antigas pelas mais recentes, tem uma natureza inerente ao muito bom balanceamento de carga de gravações, principalmente porque leva meses para preencher o cartão. O problema pode estar na própria entrada FAT, mas confio que o controlador faça algo sensato a respeito.
SF.
Qual é o custo se o seu dispositivo estiver desligado e não gravar esses dados no cartão? Por exemplo, se os dados de diagnóstico não forem gravados, você perderá muito tempo ou dinheiro ou simplesmente não terá alguns arquivos de log?
Freiheit 11/01
1
@ Freiheit: Está faltando um recurso bastante obscuro, embora não totalmente sem importância, comercializado para os clientes e, além disso, caso alguém estrague muito e procure bode expiatório, perdemos uma das vias de defesa em tribunal. Os dados anteriores à provável falha são os mais valiosos - uma prova de que o dispositivo funcionou corretamente até o último momento, e não de que sua própria falha tenha feito com que os eventos se transformassem em desastre.
SF.
Notado. Você está claramente capturando dados para algo importante!
Freiheit

Respostas:

8

Você pode usar o block2mtddriver para usar os sistemas de arquivos transacionais jffs2 ou yaffs (2) que você parece estar empregando em outro local para o seu cartão SD, o que resolveria seu problema de perda de dados ou corrupção do sistema de arquivos no desligamento.

Isso pode causar outros problemas, no entanto. Como é provável que o cartão SD possua mecanismos próprios para nivelar o desgaste e remapear o setor, eles podem interferir nas implementações dos jffs2 e yaffs para fazer o mesmo, diminuindo a vida útil ou o desempenho do seu cartão SD. Se isso não for um problema, vale a pena tentar.

o wabbit
fonte
Com um mês ou dois para preencher um cartão SD de 2 GB, atingir o limite de desgaste mesmo com o balanceamento de carga inteiramente aleatório, isso não deve ser um problema.
SF.
5

Verifique se o kernel que você usa suporta sinalizador de liberação e / ou sincronização para vfat (parece que algumas versões o ignoram, tenha cuidado!).

Ou simplesmente elimine completamente o sistema de arquivos se tudo puder entrar em um arquivo (como seria o caso de um fluxo de log bruto!) Ou em alguns arquivos de tamanho fixo (use partições;)

rackandboneman
fonte