AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 464382
Accepted
sourcejedi
sourcejedi
Asked: 2018-08-24 04:15:28 +0800 CST2018-08-24 04:15:28 +0800 CST 2018-08-24 04:15:28 +0800 CST

Quais sistemas de arquivos exigem fsync() para segurança contra falhas ao substituir um arquivo existente por rename()?

  • 772

Após reclamações generalizadas, o ext4 ganhou uma garantia de segurança contra falhas chamada, auto_da_allocque é habilitada por padrão. E quanto a outros sistemas de arquivos? Dos sistemas de arquivos mais conhecidos, quais oferecem essa mesma garantia (e quais não)?

Pessoalmente, estou interessado em ouvir informações sobre

  • XFS - sistema de arquivos padrão do Red Hat Enterprise Linux.
  • btrfs - sistema de arquivos padrão do SuSE Enterprise.
  • bcachefs - sistema de arquivos Linux fora da árvore, derivado do bcache. "O sistema de arquivos COW para Linux que não vai comer seus dados."

Esse problema diz respeito principalmente ao Linux, conforme o histórico abaixo. Seria interessante saber como o ZFS se comporta também, mas tendo a supor que ele não implementaria isso.

O que é auto_da_alloc?

fsync() está bem documentado como a maneira correta de escrever dados de arquivos, por exemplo, quando você clica em "salvar" em um editor de texto. E é amplamente entendido que, por exemplo, os editores de texto devem substituir os arquivos existentes atomicamente usando rename(). Isso serve para proteger contra perda de energia, certificando-se de que você sempre mantenha o arquivo antigo ou obtenha o novo arquivo (que foi fsync() antes da renomeação). Você não quer ficar com apenas uma versão semi-escrita do novo arquivo.

Mas havia um problema que chamar fsync() no ext3, que era o sistema de arquivos Linux mais popular, poderia deixar todo o sistema suspenso por dezenas de segundos. Como os aplicativos não podem fazer nada sobre isso, era muito comum usar rename() com otimismo sem fsync(). Esse padrão parecia funcionar muito bem nesse sistema de arquivos, mesmo que o sistema perdesse energia.

Portanto, existem aplicativos que não usam fsync() corretamente.

A próxima versão do sistema de arquivos, ext4, geralmente evitava o travamento do fsync(). Ao mesmo tempo, passou a depender muito mais do uso correto de fsync().

Isso tudo é muito ruim. Compreender essa história provavelmente não é ajudado por frases desdenhosas usadas por muitos dos desenvolvedores de kernel conflitantes.

Isso foi resolvido em ext4, parasuporta o padrão rename() sem exigir fsync() para segurança contra falhasfornecer comportamento em uma falha como o antigo sistema de arquivos ext3 fez. Este comportamento pode ser desabilitado novamente se você montar com a opção noauto_da_alloc.

filesystems crash
  • 1 1 respostas
  • 3059 Views

1 respostas

  • Voted
  1. Best Answer
    sourcejedi
    2018-08-24T04:15:28+08:002018-08-24T04:15:28+08:00

    Há um erro nesta pergunta. A pergunta implicava que esse cenário é totalmente seguro contra falhas pelo auto_da_alloc. Isso não é verdade para ext4. Presumo que também não era verdade no antigo ext3. No entanto, é verdade para btrfs e para bcachefs.

    O ext4 recente tem uma solução especial para reduzir a chance de replace-via-rename produzir arquivos de comprimento zero forçando os novos blocos de dados ao renomear . No entanto, renomear não espera a conclusão dessa liberação e, portanto, não oferece garantia de atomicidade - é possível acabar com apenas um novo conteúdo parcial após uma falha. Dos sistemas de arquivos que testamos, o btrfs é o único que fornece a garantia de atomicidade substituir-via-renomear.

    https://homes.cs.washington.edu/~lijl/papers/ferrite-asplos16.pdf


    Em btrfs, a documentação diz que substituir um arquivo usando rename() fornecerá atomicidade completa e não precisa de um fsync() explícito para proteger os dados contra falhas. Eu acho que isso foi adicionado na mesma época que ext4auto_da_alloc . Também vemos uma afirmação de que a implementação do btrfs evita a degradação do desempenho, pois não faz com que a chamada rename() espere. No entanto, noto em kernels recentes, pelo menos se você usou fsync(), o seguinte rename() fará fsync() no diretório pai e aguardará que toda a "árvore de log" seja gravada .

    bcachefsatualmente parece fornecer o nível completo de proteção, embora eu não tenha encontrado nenhuma documentação. Verifique o código. Eu vejo uma chamada para a função "filemap_write_and_wait_range"

    XFSrejeitou a adição de soluções alternativas de segurança para rename(). Aparentemente, ele ganhou código que reduz (mas não remove) o risco de perda de dados em um caso diferente.

    UBIFS(usado, por exemplo, em muitos dispositivos Openwrt) não inclui nenhuma solução de segurança contra travamento para rename(). Poderia ser aceito, mas exigiria muito trabalho. http://www.linux-mtd.infradead.org/doc/ubifs.html#L_sync_exceptions

    • 6

relate perguntas

  • Qual sistema de arquivos devo usar em um cartão SD em um NAS?

  • Como saber antecipadamente se um .zip tem um diretório pai dentro

  • Disco alocado dinamicamente do Virtualbox *.vdi continua crescendo

  • du/df e ls relatando diferentes usos de disco

  • Como os desenvolvedores do kernel Linux lidam com seu trabalho com milhões de linhas de código? É um método? [fechado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve