Este é um assunto assustador, com alguns caminhos para investigar ... vou cobrir os dois grandes.
Veja esta palestra do ELC 2015: Considerações sobre o sistema de arquivos para dispositivos incorporados .
Sistema de arquivos
O sistema de arquivos precisa manipular as gravações no disco com cuidado. Um problema pode se apresentar se, por exemplo, o comprimento do arquivo for estendido primeiro e os dados forem gravados em segundo. Este é um problema que pode ocorrer prontamente, e eu estava revisando um arquivo de log apenas hoje que exibiu esse problema - o sistema perdeu poder inesperadamente:
00017ea0 6f 74 29 20 43 4d 44 20 28 20 20 20 63 64 20 2f |ot) CMD ( cd /|
00017eb0 20 26 26 20 72 75 6e 2d 70 61 72 74 73 20 2d 2d | && run-parts --|
00017ec0 72 65 70 6f 72 74 20 2f 65 74 63 2f 63 72 6f 6e |report /etc/cron|
00017ed0 2e 68 6f 75 72 6c 79 29 0a 00 00 00 00 00 00 00 |.hourly)........|
00017ee0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017ef0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017fa0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017fb0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017fc0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017fd0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017fe0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017ff0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00018000 4d 61 72 20 31 30 20 31 35 3a 31 38 3a 33 34 20 |Mar 10 15:18:34 |
00018010 72 6f 6c 6c 79 20 72 73 79 73 6c 6f 67 64 3a 20 |rolly rsyslogd: |
00018020 5b 6f 72 69 67 69 6e 20 73 6f 66 74 77 61 72 65 |[origin software|
Então, sim ... o sistema de arquivos deve ser capaz de lidar com esses eventos. Existem ofertas comerciais para sistemas de arquivos que fornecem resiliência à perda de energia, mas não é meu lugar recomendar uma.
Naturalmente, usar um sistema de arquivos somente leitura o máximo possível é um grande benefício - por exemplo, ter o sistema operacional em um sistema de arquivos somente leitura e a configuração (etc ...) em um sistema de arquivos de leitura-gravação. Isso poderia ajudá-lo a se recuperar da corrupção e retomar o serviço.
Além disso, os sistemas de arquivos com lançamento diário geralmente lidam melhor com esses eventos , mas não assumem nenhum nível de garantia. .. meu arquivo de log acima estava em um sistema de arquivos ext4
com journalling.
Meio de armazenamento
Você menciona cartões SD como armazenamento subjacente ... o que é preocupante. Na verdade, todo o armazenamento flash tem problemas com a perda de energia inesperadamente. Isso se deve à maneira como eles funcionam - o nivelamento de desgaste é tratado inteiramente pelo controlador de armazenamento e, como tal, pode decidir mover as páginas sempre que quiser.
Além disso, uma gravação em uma página geralmente consiste em um conjunto inteiro de operações, e não há garantia / padrão para ditar qual ordem elas ocorrem.
- Verifique se há uma página nova / apagada - apagando uma, se necessário
- Ler dados da página antiga
- Aplicar modificações por
write()
- Escreva uma nova página
- Vincule novamente o mapeamento lógico ao físico
Existem muitas histórias de pessoas desconectando sistemas ou dispositivos de armazenamento e encontrando " Meu SSD de 128GB aparece como 1GB " ou " Meu cartão SD não funciona mais " , etc ...
Uma citação do JEDEC 84-A441: (reconhecidamente referindo-se à eMMC, mas provavelmente relevante)
Resetting a card (using CMD0, CMD15, or hardware reset for e•MMC) or power failure will terminate any pending or active programming operation. This may leave some or all of the data addressed by the operation in an unknown state unless Reliable Write was enabled. It is the host’s responsibility to prevent this.
Resumo
Infelizmente não existem passos bons / confiáveis que você possa tomar para facilitar a remoção de um cartão SD montado sem passar por um processo de desmontagem de software / SO e não ter problemas. p> Moral da história - descubra uma maneira de sync
e unmount
garantir que os dados do sistema de arquivos sejam contíguos e que nenhum write()
s esteja em andamento quando o usuário o desconectar.