Use com segurança os cartões SD quando a energia acabar a qualquer momento

10

Estamos trabalhando em um pequeno sistema Linux incorporado (2.6.35-ish) com um dispositivo NAND interno pequeno para o sistema operacional e aplicativos (250-500Meg) e um cartão SD com cartões SDHC SDHC de 8Gb para dados.

A energia da unidade pode ser cortada a qualquer momento.

O sistema deve armazenar dados nos cartões SD. Esses dados são muito importantes ... é todo o objetivo do sistema. Os sistemas geralmente são totalmente desconectados de qualquer rede em locais remotos e os dados são recuperados via sneakernet a cada 4-8 semanas.

Atualmente, simplesmente temos o VFAT nos cartões SD. Isso foi principalmente para que os primeiros clientes de teste pudessem copiar dados manualmente com facilidade em seus laptops Win7.

No entanto, agora estou preocupado que seja apenas uma questão de tempo até que uma queda de energia na hora errada cause perda de dados.

Qual é a melhor maneira de configurar esse sistema para evitar a perda de dados? O JFFS2 parece o que eu gostaria em termos de como ele grava dados (e as necessidades de desempenho não são altas), mas parece bastante desajeitado usar o block2mtd etc. Também não tenho certeza de como o nível de desgaste da placa irá interagir com isso.

Qual é a melhor forma de fazer isso?

EDITAR

Agora, estou pensando em deixar o sistema de arquivos VFAT e alocar arquivos de tamanho diário por vez, preenchidos com 0xFF, que devem limitar bastante a exposição a falhas no ciclo de energia. Eu só podia acrescentar registros dentro desses blocos pré-criados, e espero que os cartões SD não sejam tão estúpidos que apagem / usem gravações de nível nas regiões 0xFF.

Posso usar noatime, mas existe um nomtime VFAT equivalente para impedir gravações no campo de horário modificado? Eu precisaria de alguma maneira para impedir qualquer atualização de metadados até que o arquivo de um novo dia seja criado.

EDIT 2

Alguém na troca de pilhas de eletrônicos me lembrou que também existem dados de ECC no NAND, então não há como evitar a necessidade de apagar.

Então, o JFFS2 via block2mtd seria apropriado nessa situação?

EDIT 3

É pior do que eu pensava. Os cartões SD que eu tenho irão apagar os blocos de dados, mesmo se você escrever exatamente o mesmo conteúdo no disco. Os bloqueios de apagamento têm 64 KB e são muito grandes para atrasar totalmente as gravações. Armazenarei até 128 KB de dados no flash NAND (no qual posso controlar o comportamento de gravação), em um tipo de diário, e depois gravarei blocos de 128 KB em um arquivo alinhado a 128 KB em uma partição VFAT no cartão SD (em caso outros cartões SD possuam bloqueios de apagamento de 128 KB).

darron
fonte
1
"espero que os cartões SD não sejam tão estúpidos ..." <--- ROFLOL. Não é provável!
derobert
Até encontrar uma solução completa para o problema que você tem, use o synccomando após cada gravação no cartão SD, ele gravaria os bits imediatamente após você alterá-los / criá-los sem armazená-los na RAM, para que suas alterações estejam no cartão e não passou pela perda de energia.
Hanan N.
syncprovavelmente pioraria as coisas, pois aumenta a fração de tempo em que os metadados estão no meio da atualização.
quer

Respostas:

5

Bem, a maneira de corrigir isso é corrigir o problema "a energia pode ser cortada a qualquer momento". É impossível adicionar um minuto de energia da bateria?

Como alternativa, talvez você possa usar dois cartões SD. Escreva os dados em um cartão, sincronize e escreva no outro. Cada bloco de seus dados precisaria de uma soma de verificação e um número de bloco, mas mesmo com algumas falhas de energia bastante azaradas, um dos cartões deve estar certo.

Seu problema básico será o nivelamento de desgaste nos cartões SD, que o AFAIK depende do fornecedor do cartão (e talvez até do lote, eles podem ser alterados sempre que houver). Provavelmente não lida com a falta de energia corretamente. E, dependendo do que ele faz, isso pode não significar apenas corromper o bloco para o qual você está escrevendo.

  1. Suponha cartão trivialmente pequeno - 3 blocos (flash). O bloco 1 recebeu mais gravações que 2 ou 3. Vou chamar os blocos físicos por número e os blocos lógicos A, B, C por letra. Agora, A = 1, B = 2, C = 3.
  2. Você escreve uma gravação no bloco. Cartão SD é como aha! precisamos nivelar o desgaste aqui, caso contrário, o bloco 1 se desgastará antes de 2 e 3. Ele decide trocar os blocos 1 e 2.
  3. Ele lê o bloco 1 na posição de RAM i (no cartão SD, não na RAM do sistema). Ele atualiza a parte que você deseja alterar.
  4. Lê o bloco 2 na posição RAM ii
  5. Apaga o bloco 1
  6. Ele grava a posição de RAM ii no bloco 1.
  7. Ele atualiza a tabela de mapeamento para dizer B = 1
  8. Apaga o bloco 2.
  9. Ele grava a posição de RAM i no bloco 2.
  10. Ele atualiza a tabela de mapeamento para dizer A = 2

Obviamente, "atualiza a tabela de mapeamento" nem sempre é trivial. E a ordem de 5 a 10 pode ser diferente (se todas estiverem completas, não importa, as apagões devem ocorrer antes da gravação, é claro). Mas acontece uma falha de energia, você pode acabar não apenas com A corrompido (como você espera), mas também com B. Ou, se ocorrer uma falha de energia durante uma atualização de mapeamento, quem sabe que tipo de corrupção isso causará.

derobert
fonte
1
Essas unidades devem viver em ambientes relativamente severos por muitos anos e, quando instaladas, serão transportadas para vários países para os quais preferimos não precisar qualificar as baterias. Provavelmente abandonamos o MMC / SD e construímos nossa própria solução de flash NAND antes de usar uma bateria.
darron
Bem, no nosso caso, a solução "conserte a 'energia pode ser cortada a qualquer momento'" se resume a "impedir que os caminhoneiros adormeçam atrás do volante e entrem em nossos dispositivos". "Um caminhão colidiu com ele" é, na verdade, o modo mais comum de falha.
SF.
1
Um minuto de energia da bateria não deve ser necessário. A quantidade de energia necessária para desmontar com segurança um cartão SD deve estar bem dentro da faixa que um capacitor pode armazenar.
quer
4

Algo semelhante foi discutido em electronics.stackexchange.com: Como protejo o cartão SD contra falhas inesperadas de energia?

Uma resposta lateral que funciona em conjunto com as soluções de software é examinar o hardware (havia uma pergunta no ESE sobre isso também, mas não consigo encontrá-la agora; não era estritamente sobre cartões SD, apenas sobre dispositivos perdendo energia e como detectar isso e agir sobre ele).

A história resumida é: você pode não ter energia da bateria, mas sua fonte de alimentação possui alguns capacitores bastante grandes para facilitar a fonte. Basicamente, o poder não sai apenas. A tensão diminui. Provavelmente, existe um circuito / circuito de proteção antiqueda que afirma o sinal RESET no seu sistema embarcado quando a tensão cai abaixo de um determinado ponto. As placas-mãe de PC também têm essas, e elas respondem ao sinal 'POWEROK' da PSU. O que isso significa é que, quando a energia acabar, o computador será interrompido à força alguns milissegundos antes que a tensão caia abaixo dos níveis de segurança. Durante esse período, periféricos como cartões SD ainda estão ligados, mas não há mais transações vindas do computador.

É muito provável que um cartão SD tenha tempo suficiente para concluir todas as transações pendentes, incluindo o nivelamento de desgaste, antes que a energia acabe. Melhorar sua fonte de alimentação com um capacitor grande o suficiente ou usar um próximo ao cartão SD pode ajudar a garantir isso, mas você sempre pode experimentar sua plataforma como está. É bem provável que ele retenha energia por tempo suficiente.

Se o aspecto de hardware do problema não for um problema, você poderá resolver apenas o software. o id de derobert de usar duas placas para redundância não é ruim, e usar um sistema de arquivos padrão como o VFAT corre menos risco de confundir os algoritmos de nivelamento de desgaste da placa.

De qualquer forma, pode ser que você não tenha tanto problema. Supondo que um bloco no seu cartão possa sobreviver a 100 gravações (conservador - mas tente obter cartões de boa qualidade!), E usando cartões de 8 GB, você terá gravado 800 GB quando o primeiro bloco morrer (estatisticamente falando, é claro).

Alexios
fonte
A pergunta foi iniciada porque eu já estava recebendo uma enorme corrupção do cartão SD ao desligar os eventos. Com bastante frequência, na verdade. Talvez 1 em cada 20 eventos de falha de energia tenha sido catastrófico e possivelmente 1 em cada 4 tenha causado pelo menos ALGUNS danos. Eu finalmente mudei para armazenar o valor de um dia de dados no flash NAND interno e copiei para o SD à meia-noite (uma operação de aproximadamente 1 segundo). Estou procurando melhorar as coisas no futuro. Eu já tenho bonés de 400uF no trilho ... aparentemente não ... o suficiente ... talvez o apagão não esteja sendo tratado adequadamente.
darron
Essa é uma taxa de incidência bastante alta! Hora de pegar as pontas de prova do osciloscópio e ver isso em ação, acho. Embora seja provável que você possa solucionar isso em software, a melhor maneira em termos de consumo de energia é garantir que você não tenha falhas de hardware. Talvez você poderia proteger suas apostas e perguntar sobre electronics.stackexchange.com bem?
Alexios26:
@ Darron, que solução você encontrou para o seu problema de armazenamento no cartão SD? Você ainda está escrevendo para o NANDFlash e copiando uma vez por dia? Tenho um design com cartão SD como o principal RFS (sem NANDFlash separado) e estou vendo problemas de corrupção de dados, com e sem condições repentinas de falta de energia.
fred basset
4

Tivemos um problema com o nosso sistema de arquivos raiz SD, ext2, sendo corrompido por falha de energia inesperada. Primeiro, fazemos o sistema funcionar com uma montagem raiz somente leitura. Como precisávamos de armazenamento gravável (mas não estávamos registrando dados), configuramos uma segunda partição como gravável. Para minimizar o dano do FS devido a uma falha inesperada de energia, fizemos dessa partição ext3, mesmo que isso cause pelo menos o dobro de gravações físicas no cartão. Essa combinação (mas admito que as gravações da segunda partição não são frequentes em comparação com um data logger) parece funcionar sem problemas. Tão longe. (Sistemas instalados por cerca de 30 meses em instalações profissionais)

Dave Kitchen
fonte
3

Para segurança de dados em um ambiente com a possibilidade de cortes de energia e segurança geral de dados, você deve considerar ainda mais pontos.

NÃO USE Células MLC para armazenamento, apenas as SLC têm um tempo de retenção de dados que é suficiente. Em seguida, esses cartões SLC podem ter firmware inteligente, alguns não podem sob nenhum estado ser corrompidos por perda de energia. Eles reconhecem o corte de energia medindo e assegurando que o último bloco seja gravado completamente.

Esses cartões são mais caros e um pouco mais lentos que as células MLC. Veja fornecedores como swissbit para cartões.

Rotesmofa
fonte