1. Armazenamento baseado em Flash
Depende do tipo de disco (discos rígidos tradicionais versus discos de estado sólido) ou de qualquer outra variável que eu possa não estar ciente? Isso acontece (se acontecer) apenas no Linux ou está presente em outros sistemas operacionais?
Quando você tem uma opção, não deve permitir que o armazenamento baseado em flash perca energia sem um desligamento limpo.
Em armazenamento de baixo custo, como cartões SD, você pode perder blocos de apagamento inteiros (várias vezes maiores que 4KB), perdendo dados que podem pertencer a arquivos diferentes ou estruturas essenciais do sistema de arquivos.
Alguns SSDs caros podem alegar oferecer melhores garantias em caso de falha de energia. No entanto, testes de terceiros sugerem que muitos SSDs caros não conseguem fazer isso. A camada que remapeia os blocos para "nivelamento de desgaste" é complexa e proprietária. As possíveis falhas incluem a perda de todos os dados na unidade.
Aplicando nossa estrutura de teste, testamos 17 SSDs de commodities de seis fornecedores diferentes, usando mais de três mil ciclos de injeção de falhas no total. Nossos resultados experimentais revelam que 14 dos 17 dispositivos SSD testados exibem comportamentos surpreendentes de falha sob falhas de energia, incluindo corrupção de bits, gravações cortadas, gravações não serializáveis, corrupção de metadados e falha total do dispositivo.
2017: https://dl.acm.org/citation.cfm?id=2992782&preflayout=flat
2013: https://www.usenix.org/system/files/conference/fast13/fast13-final80.pdf?wptouch_preview_theme=enabled
2. Girando unidades de disco rígido
Os HDDs giratórios têm características diferentes. Por segurança e simplicidade, recomendo que eles tenham a mesma incerteza prática que o armazenamento baseado em flash.
A menos que você tenha evidências específicas, o que você claramente não tem. Não tenho números comparativos para girar HDDs.
Um disco rígido pode deixar um setor incompletamente escrito com uma soma de verificação inválida, o que nos dará uma boa falha de leitura posteriormente. De um modo geral, esse modo de falha dos HDDs é totalmente esperado; sistemas de arquivos Linux nativos são projetados com isso em mente. Eles visam preservar o contrato fsync()
diante desse tipo de falha de perda de energia. (Gostaríamos muito de ver isso garantido nos SSDs).
No entanto, não tenho certeza se os sistemas de arquivos Linux conseguem isso em todos os casos ou se isso é possível.
A próxima inicialização após esse tipo de falha pode exigir um reparo no sistema de arquivos. Sendo o Linux, é possível que o reparo do sistema de arquivos faça algumas perguntas que você não entende, onde você pode apenas pressionar Y e esperar que ele se resolva.
2.1 Se você não sabe qual é o contrato fsync ()
O contrato fsync () é uma fonte de boas e más notícias. Você deve entender as boas novas primeiro.
Boas notícias: fsync()
está bem documentado como a maneira correta de gravar dados do arquivo, por exemplo, quando você clica em "salvar". E é amplamente entendido que, por exemplo, editores de texto devem substituir os arquivos existentes usando atomicamente rename()
. Isso visa garantir que você sempre mantenha o arquivo antigo ou obtenha o novo arquivo (que foi fsync()
editado antes da renomeação). Você não quer ficar com uma versão semi-escrita do novo arquivo.
Más notícias: por muitos anos, chamar fsync () no sistema de arquivos Linux mais popular poderia efetivamente deixar todo o sistema travado por dezenas de segundos. Como os aplicativos não podem fazer nada sobre isso, era muito comum o uso otimizado de rename () sem fsync (), que parecia ser relativamente confiável nesse sistema de arquivos.
Portanto, existem aplicativos que não usam fsync () corretamente.
A próxima versão deste sistema de arquivos geralmente evitava o travamento do fsync () - ao mesmo tempo em que começava a confiar no uso correto do fsync ().
Tudo isso é muito ruim. A compreensão dessa história provavelmente não é ajudada pelo tom desdenhoso e invectivo que foi usado por muitos dos desenvolvedores conflitantes do kernel.
A resolução atual é que o sistema de arquivos Linux mais popular atualmente o padrão é dar suporte ao padrão rename () sem exigir fsync ()implementa "compatibilidade de bug por bug" com a versão anterior. Isso pode ser desativado com a opção de montagem noauto_da_alloc
.
Esta não é uma proteção completa. Basicamente, ele libera o IO pendente no momento de renomear (), mas não espera que o IO seja concluído antes de renomear. Isso é muito melhor do que, por exemplo, uma janela de perigo de 60 segundos! Consulte também a resposta para Quais sistemas de arquivos exigem fsync () para segurança contra falhas ao substituir um arquivo existente por rename ()?
Alguns sistemas de arquivos menos populares não fornecem proteção. O XFS se recusa a fazê-lo. E o UBIFS também não o implementou, aparentemente poderia ser aceito, mas precisa de muito trabalho para torná-lo possível. A mesma página indica que o UBIFS possui vários outros problemas "TODO" para integridade de dados, incluindo perda de energia. O UBIFS é um sistema de arquivos usado diretamente no armazenamento flash. Imagino que algumas das dificuldades mencionadas pelo UBIFS no armazenamento flash possam ser relevantes para os erros do SSD.