Primeiro, vamos dissipar alguns mitos.
it is atomic so inconsistencies cannot happen
Mover um arquivo dentro do mesmo sistema de arquivos (ou seja, a rename
) chamada do sistema é atômica em relação ao ambiente de software. Atomicidade significa que qualquer processo que procurar o arquivo irá vê-lo em seu local antigo ou em seu novo local; nenhum processo poderá observar que o arquivo tem 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 do diretório de destino depois de estar ausente na origem diretório.
No entanto, se o sistema travar devido a um bug, um erro de disco ou uma perda de energia, não há garantia de que o sistema de arquivos seja deixado em um estado consistente, e muito menos que o movimento não seja feito pela metade. O Linux não oferece, em geral, uma garantia de atomicidade em relação aos eventos de hardware.
first you copy the dir entry in the new dir and then erase entry on previous dir, so you may have the inconsistency of having a file referenced twice, but the ref count is 1
Isso se refere a uma técnica de implementação específica. Existem outros.
Acontece que ext2 no Linux (como do kernel 3.16) usa essa técnica em particular. No entanto, isso não implica que o conteúdo do disco passe pela sequência [localização antiga] → [ambos os locais] → [novo local], porque as duas operações (adicionar nova entrada, remover entrada antiga) 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 conserte isso.) Além disso, a camada de bloco pode reordenar as gravações, portanto a primeira metade pode ser confirmada no disco logo antes da falha e a segunda metade não teria sido executada.
A contagem de referência nunca será observada como diferente de 1, desde que o sistema não trave (veja acima), mas essa garantia não se estende a um travamento do sistema.
it first erases the pointer and then copy the pointer so the inconsistency is that the file has reference 0
Mais uma vez, isso se refere a uma técnica de implementação específica. Um arquivo pendente não pode ser observado se o sistema não travar, mas é uma conseqüência possível de uma falha do sistema, pelo menos em algumas configurações.
De acordo com um post de Alexander Larsson , o ext2 não oferece garantia de consistência em uma falha do sistema, mas o ext3 faz no modo data=ordered
. (Observe que esta postagem do blog não é sobre o rename
em si, mas sobre a combinação de gravação em um arquivo e a chamada de rename
nesse arquivo.)
Theodore Ts'o, o principal autor dos sistemas de arquivos ext2, ext3 e ext4, escreveu um postagem no blog sobre o mesmo problema . Esta postagem do blog discute atomicidade (com relação ao ambiente de software somente) e durabilidade (que é a atomicidade em relação a falhas mais uma garantia de compromisso, ou seja, sabendo que a operação foi realizada). Infelizmente não consigo encontrar informações sobre a atomicidade em relação a falhas sozinho. No entanto, as garantias de durabilidade fornecidas para o ext4 exigem que rename
seja atômico. A documentação do kernel para ext4 indica que ext4 com a opção auto_da_alloc
(que é o padrão em kernels modernos), bem como ext4, fornece uma garantia de durabilidade para um write
seguido por um rename
, o que implica que rename
é atômico com relação a travamentos de hardware.
Para o Btrfs, um rename
que sobrescreve um arquivo existente é garantido para ser atômico com relação a falhas, mas um rename
que não sobrescreve um arquivo pode resultar em nenhum arquivo ou ambos os arquivos existentes.
Em resumo, a resposta à sua pergunta é que não apenas a movimentação de um arquivo não é atômica em relação a travamentos no ext2, mas também não é garantido que ele deixe o arquivo em um estado consistente (apesar de falhas que fsck
não é possível reparar são raras) - praticamente nada é, e é por isso que sistemas de arquivos melhores foram inventados. Ext3, ext4 e btrfs fornecem garantias limitadas.