Primeiro, vamos dissipar alguns mitos.
é atômico, portanto, inconsistências não podem acontecer
Mover um arquivo para o mesmo sistema de arquivos (ou seja, a rename
) chamada do sistema é atômico em relação ao ambiente de software. Atomicidade significa que qualquer processo que procure o arquivo o verá em seu local antigo ou em seu novo local; nenhum processo poderá observar que o arquivo possui uma contagem de links diferente ou que o arquivo está presente no diretório de origem após estar presente no diretório de destino ou que o arquivo está ausente no diretório de destino após estar ausente na origem diretório.
No entanto, se o sistema travar devido a um erro, um erro no disco ou uma perda de energia, não há garantia de que o sistema de arquivos permaneça em um estado consistente, muito menos que a movimentação não seja deixada pela metade. Em geral, o Linux não oferece garantia de atomicidade com relação a eventos de hardware.
primeiro copie a entrada dir no novo dir e depois apague a entrada no dir anterior, para que você tenha a inconsistência de ter um arquivo referenciado duas vezes, mas a contagem de ref é 1
Isso se refere a uma técnica de implementação específica. Há outros.
Acontece que o ext2 no Linux (a partir do kernel 3.16) usa essa técnica específica. No entanto, isso não implica que o conteúdo do disco passe pela sequência [local antigo] → [ambos os locais] → [novo local], porque as duas operações (adicionar nova entrada, remover entrada antiga) também não são atômicas no nível do hardware : é possível que um deles seja interrompido, deixando o sistema de arquivos em um estado inconsistente. (Espero que o fsck o conserte.) Além disso, a camada de bloco pode reordenar as gravações, para que a primeira metade possa ser comprometida com o disco imediatamente antes da falha e a segunda metade não teria sido executada.
A contagem de referência nunca será observada diferente de 1, desde que o sistema não falhe (veja acima), mas essa garantia não se estende a uma falha do sistema.
primeiro apaga o ponteiro e, em seguida, copia o ponteiro para que a inconsistência seja que o arquivo tenha referência 0
Mais uma vez, isso se refere a uma técnica de implementação específica. Um arquivo dangling não pode ser observado se o sistema não travar, mas é uma possível consequência de uma falha no sistema, pelo menos em algumas configurações.
De acordo com um post de Alexander Larsson , o ext2 não garante a consistência de uma falha no sistema, mas o ext3 ocorre no data=ordered
modo. (Observe que esta postagem do blog não é sobre rename
si mesma, mas sobre a combinação de gravar em um arquivo e chamá rename
-lo.)
Theodore Ts'o, o principal autor dos sistemas de arquivos ext2, ext3 e ext4, escreveu um post no blog sobre o mesmo problema . Esta postagem do blog discute atomicidade (somente no ambiente de software) e durabilidade (que é atomicidade em relação a falhas, além de uma garantia de comprometimento, isto é, saber que a operação foi executada). Infelizmente, não consigo encontrar informações sobre atomicidade apenas com relação a falhas. No entanto, as garantias de durabilidade fornecidas para ext4 exigem que rename
seja atômico. A documentação do kernel para ext4 declara que o ext4 com a auto_da_alloc
opção (que é o padrão nos kernels modernos), bem como o ext4, fornece uma garantia de durabilidade para um write
seguido por umrename
, o que implica que rename
é atômico em relação a falhas de hardware.
Para Btrfs, rename
é garantido que um que substitui um arquivo existente seja atômico em relação a falhas, mas um rename
que não substitua um arquivo pode resultar em nenhum arquivo ou nos dois arquivos existentes.
Em resumo, a resposta para sua pergunta é que não apenas está movendo um arquivo não atômico com relação a falhas no ext2, mas também não é garantido que o arquivo seja mantido em um estado consistente (apesar de falhas que fsck
não possam ser reparadas sejam raras) - praticamente nada é, e é por isso que os melhores sistemas de arquivos foram inventados. Ext3, ext4 e btrfs fornecem garantias limitadas.
rename
é atômico, mas o btrfs não está de acordo com o wiki (veja minha resposta). Também é possível garantir atomicidade sem um diário (não conheço exemplos no Linux, mas pode haver alguns). Você tem informações confiáveis sobre ext2?Esta pergunta foi feita de uma maneira um pouco diferente no Superusuário. A página da Wikipedia no
mv
comando também explica muito bem:O Linux tem o renomear syscall e, portanto, renomeará o arquivo como uma operação atômica, ou seja, ininterrupta. Portanto, não, o sistema de arquivos não pode se tornar inconsistente na situação que você descreveu.
fonte
rename
chamada do sistema não pode resultar no sistema de arquivos em um estado inconsistente, mesmo se houver uma falha de energia. Eu senti que esse era o cerne da pergunta de @ graphtheory92.