Existem vários tópicos existentes em torno deste problema, mas o que eu procuro é um pouco diferente. Eu tenho um cartão SD em um Linux incorporado e ele sofre com perda de energia. Talvez eu possa modificar o hardware em algum momento, fechar corretamente etc. etc. Mas agora, gostaria de encontrar um sistema de arquivos que sobreviva à perda de energia sem problemas. A perda de dados é aceitável. Prefiro não perder mais do que o arquivo que estou escrevendo atualmente, mas prefiro perder tudo do que enfrentar um 'incapaz de montar', 'esperar por 10 minutos fsck' ou 'incapaz de criar novos arquivo devido a este inode algo algo erro '. O programa DEVE continuar!
Estou fazendo um grande esforço para garantir isso. Estou usando componentes de nível industrial, tenho watchdogs de hardware, watchdogs de software, interno, externo, init reiniciando os programas, daemons constantemente verificando memória, descritores de arquivos e outros enfeites, tenho watchdogs assistindo meus watchdogs, que por sua vez são assistidos por outros watchdogs ... Mas não consigo garantir que o cartão SD seja capaz de montar e funcionar?
Minha melhor aposta agora é usar o JFS no cartão SD, incluir fsck e fsck.jfs na minha instalação. (Adicionando 600kb + comendo meu ram e meu flash. O que é ruim.) E execute o fsck em todas as inicializações (talvez adicionando muito tempo de inicialização. O que é um pouco ruim.). Parece um pouco triste.
Alguém sabe de uma maneira melhor ou de um sistema de arquivos melhor?
ATUALIZAÇÃO: e2fsprogs-libs (dependência do jfsutils) parece ser terrivelmente difícil de compilar em minha distribuição. Analisarei o ZFS (embora não seja nativo da minha distribuição. E parece fazer muito do que não preciso).
UPDATE2: Mais algumas informações sobre o meu sistema e meus testes: O armazenamento do cartão SD é um armazenamento opcional secundário. Os cartões SD são microSD de classe industrial de 2Gb-8Gb. O cartão SD é montado através do meu rc com um comando mount -t. Opções "noatime", mas não "sync". Minha distribuição é um uClinux com sabor de dispositivo analógico personalizado, com um kernel 3.10 e uma busybox 1.21. Meu armazenamento primário é um spi flash com jffs2. Eu nunca tive problemas com isso. Eu nem sei se existe um fsck.jffs2 disponível. Nand flash, por outro lado ... mas isso é uma história diferente. O objetivo do cartão SD é armazenar dados de medição. O programa 'monitor' anexará os resultados a um arquivo e possui canais de sincronização estratégicos. Quando o arquivo estiver acima de um determinado tamanho, um novo será criado. Quando um determinado número de arquivos for atingido, o mais antigo será excluído. Se o arquivo de medição atual for perdido devido à perda de energia, não será um desastre. Os arquivos geralmente estão entre 50 e 100kb e 1 resultado é geralmente 1kb. Esta é apenas a fase inicial de desenvolvimento. Nada está consertado. Esta é a primeira vez que lido com sistemas de arquivos não flash em sistemas embarcados. (Eu tenho ext4 nos meus servidores x86.)
Comecei com vfat. O sistema de arquivos padrão. (Imaginei que as fábricas poderiam ter um motivo para escolhê-lo. E se as coisas funcionarem, eu realmente não me importo muito.) Nunca vi problemas de perda de energia em meus dispositivos vfat incorporados. Eu tive problemas com o FAT no WinCE. No entanto, quando meu programa 'monitor' atingiu 100-200 arquivos, ele se recusou a criar mais. Parece que o FAT tem um problema especial de limite de arquivos na raiz e um problema ligeiramente maior nos subdiretórios. Eu preciso ser capaz de criar 500-1000 arquivos em 1 dir. Então vfat não serve.
Então eu mudei para ext2. Eu não inseri um fsck na inicialização. (Não sabia que precisava fazê-lo.) Em um dia, meu programa 'monitor' não conseguiu criar mais arquivos devido a um erro 'inode something something'. Desastre!
Minha solução atual é ext2 com um "e2fsck -y" na inicialização. Até agora, parece promissor. Mas o e2fsck e todo o conceito de 'fsck na inicialização' estão me incomodando. O e2fsck por si mesmo está gastando mais de 350kb do meu flash e ram principais. (Quando não está em execução.) O que significa que é o meu maior programa. É maior que o busybox. Está quase rivalizando com meu kernel.
Eu estive pensando em ext3. Ele registrou metadados, o que não faria mal. Estou em dúvida quanto ao quanto isso vai ajudar. Com meus arquivos pequenos e sincronizações controladas, eu deveria estar coberto, eu acho? Possui uma sequência de gravação ordenada. Significando que os dados também são um pouco diários. No entanto, isso pode levar a atrasos não determinísticos. O que é ruim na minha situação. (Provavelmente não é um problema.) Ele também possui um recurso de sincronização agendada. Por exemplo. comprometer a cada 5 s. O que está interferindo nas minhas próprias sincronizações, eu acho. Muitas gravações são ruins para cartões SD. Mesmo os industriais. Não consigo encontrar nenhuma documentação sobre como desativar isso. E o ext3 ainda exige que o fsck seja executado em toda inicialização! Mas o ext3 ainda é uma possibilidade.
Ext4. Corrigirá muitos problemas de desempenho do ext3. Eu realmente não preciso de performance. E minha distribuição não parece ter mkfs.ext4 e fsck.ext4 integrados. Talvez isso não seja um problema. Pode ser que sim. Por exemplo. o e2progs-libs (dependência do jfsutils) parece ter muitos problemas de compilação.
JFS, XFS, BRFSS. Tudo suportado pelo meu kernel. Atualmente não incluído na minha caixa de ferramentas de espaço do usuário. Tudo parece ser um sistema grande e complexo. E todos eles parecem exigir um equivalente 'fsck' na inicialização?
Também considerei lançar meu próprio sistema de arquivos: sempre escreva 2 cópias da tabela de arquivos. Ao percorrer, escolha aquele com o CRC correto e o número de sequência mais recente. Faça uma sequência de gravação em dois estágios. Aloque temporariamente, corrija na confirmação. Não é necessário fsck. Receio que possa ser um pouco ingênuo.
ATUALIZAÇÃO3: Aliás, a natureza dos sistemas embarcados (pelo menos este) é que eles são autônomos, autônomos, fora de alcance e precisam funcionar por anos. Programas como o fsck que podem exigir interação humana me assustam.