Há algum tempo, houve uma discussão sobre o ext4 potencialmente deixando arquivos vazios após uma desmontagem impura, resumida muito bem neste artigo . Basicamente, devido à alocação atrasada, as gravações podem ser mantidas no cache de gravação por um tempo muito maior que o intervalo de confirmação padrão do diário ext (5 segundos).
Os problemas parecem ter sido corrigidos em um patch que força a alocação de blocos em determinadas situações, forçando os dados para o disco após, no máximo, 5 segundos por padrão.
Gostaria de saber o que acontece quando um aplicativo substitui partes existentes de um arquivo, sem truncar ou anexar o próprio arquivo. Isso também será forçado a disco dentro de 5 segundos?
Parece uma situação diferente da anexada a um arquivo: ao anexar, o tamanho do arquivo é alterado, que é uma alteração de metadados; portanto, uma confirmação de diário será necessária dentro de 5 segundos e, devido a dados = pedidos, os dados deverão ser gravados antes disso por questões de segurança (caso contrário, partes de arquivos excluídos de outros usuários poderão aparecer para o proprietário do anexo Arquivo).
Ao substituir apenas os dados do arquivo, não há motivo para que a gravação dos dados deva ocorrer antes da confirmação do diário de metadados, pois os dados antigos pertencem ao mesmo usuário que o novo. A gravação ocorre antes do commit, de qualquer maneira, ou pode demorar mais que o intervalo de commit do diário? Se sim, quanto tempo?
Atualização: Eu sei que tudo isso é irrelevante ao fazer a coisa certa, ou seja, usando fsync (). (Esse foi o principal motivo de toda a discussão sobre ext4 e perda de dados - o problema dizia respeito apenas a aplicativos que não são fsync () ou não nos momentos certos.) Não estou escrevendo meu próprio aplicativo, estou perguntando porque não sei se todos os meus aplicativos fazem a coisa certa e quero saber um prazo aproximado para essas gravações "perigosas". O motivo para perguntar é que meu driver gráfico causa pânico no kernel regularmente e quero saber se tenho que me preocupar com mais do que os últimos 5 segundos de gravação de dados.
fonte
sync
(ou, equivalentemente, quando o timer do intervalo de confirmação é acionado). No momento em que async
conclusão é concluída, não há absolutamente dados sujos, metadados ou páginas do diário. Quaisquer alterações no sistema de arquivos durante a transferência de dados síncronos são bloqueadas até a conclusão.commit=...
esync
NÃO são equivalentes? Ou o tytso implica que, mesmo com um,sync
ele não confirma páginas não alocadas? Não posso imaginar que seja esse o caso, pois isso violaria as especificações do POSIX. Talvez você poderia usar esse script bash I prevista melhor nível de segurança: PQualquer que seja a resposta para sua pergunta, isso não importa.
O comportamento exposto garantido do sistema de arquivos ext4 é que "os dados estarão no disco após uma chamada
sync
/ sucessofsync
". Portanto, se você tiver um aplicativo que faça essa pergunta, insira as chamadas de sincronização nos pontos críticos em que a integridade dos dados precisa ser garantida. Se você é um usuário preocupado com o mesmo problema, pode chamar osync
utilitário de linha de comando antes de executar qualquer comportamento perigoso que possa causar um desligamento imundo.fonte