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?