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).
fonte
sync
comando 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.sync
provavelmente pioraria as coisas, pois aumenta a fração de tempo em que os metadados estão no meio da atualização.Respostas:
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.
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á.
fonte
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).
fonte
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)
fonte
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.
fonte