O sistema de arquivos pode se tornar inconsistente se interrompido ao mover um arquivo?

13

Eu tenho duas pastas na mesma partição (EXT2) Se eu mv folder1/file folder2e alguma interrupção ocorrer (por exemplo, falta de energia), o sistema de arquivos pode acabar sendo inconsistente?

A mvoperação não é atômica?

Atualização: Até o momento, no IRC, obtive as seguintes perspectivas:

  1. é atômico, portanto, inconsistências não podem acontecer
  2. 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
  3. primeiro apaga o ponteiro e, em seguida, copia o ponteiro para que a inconsistência seja que o arquivo tenha referência 0

Alguém pode esclarecer?

graphtheory92
fonte

Respostas:

11

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=orderedmodo. (Observe que esta postagem do blog não é sobre renamesi 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 renameseja atômico. A documentação do kernel para ext4 declara que o ext4 com a auto_da_allocopção (que é o padrão nos kernels modernos), bem como o ext4, fornece uma garantia de durabilidade para um writeseguido 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 renameque 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.

Gilles 'SO- parar de ser mau'
fonte
13

A operação de renomeação é muito rápida em qualquer sistema de arquivos, por isso é improvável que seja interrompida, mas em um sistema de arquivos clássico certamente pode ser interrompida - se ele criar o link de destino primeiro, poderá deixar dois links em um arquivo - o que é legal, mas o arquivo pensa que só possui um, o que pode causar problemas se um for excluído posteriormente. Por outro lado, se ele remover o link de origem primeiro, o arquivo poderá ser perdido. A execução do fsck geralmente detecta e corrige qualquer uma das condições, embora se o arquivo for perdido, ele será colocado em um diretório "perdido + encontrado" com um nome arbitrário, e não no local desejado - e se tiver dois links, a contagem de links simplesmente seja atualizado, para que o arquivo exista em dois locais se o sistema de arquivos suportar isso.

Se você precisar que um sistema de arquivos seja robusto diante de falhas de energia, use um sistema de arquivos de registro no diário , como NTFS, EXT3 ou XFS. A maioria dos sistemas modernos usará um sistema de arquivos com registro no diário por padrão, embora você deva estar ciente de que o FAT não é um sistema de arquivos com registro no diário se você o usar para unidades externas.

Um sistema de arquivos de registro em diário usa um sistema de "entrada dupla" - grava no arquivo de diário o fato de que pretende movê-lo e, em seguida, executa a movimentação. Quando o sistema de arquivos é verificado na inicialização, se foi interrompido, ele notará que a movimentação não foi concluída e a refará.

Existem dois tipos de sistemas de arquivos de registro no diário - diário de metadados e diário completo. O registro no diário de metadados significa que ele não controla as alterações no conteúdo do arquivo no sistema de diário (portanto, você pode acabar perdendo o conteúdo se estiver gravando em um arquivo), mas ainda acompanhará as informações importantes do sistema de arquivos, como o conteúdo do diretório , propriedades do arquivo etc.


Quando as pessoas falam sobre a operação de renomeação ser atômica, elas significam que ela não pode ser observada no meio da transição por outro processo no sistema, e não pode ser deixada pela metade pela interrupção do mvpróprio comando ^C. O processo físico de gravação em cada diretório, cujo espaço de armazenamento pode estar em locais muito diferentes no disco, não pode ser uma operação verdadeiramente atômica no nível do hardware.


Para completar, observarei que também existem algumas operações incidentais de E / S associadas a uma renomeação, além de criar o novo link no diretório de destino e removê-lo no antigo - atualizando o mtime de ambos os diretórios, possivelmente estendendo o tamanho de alocação do diretório de destino, alterando o ..link e a contagem de links dos diretórios pai, se o arquivo for um diretório. Além disso, não tenho certeza se o atime do arquivo em si é afetado.

Random832
fonte
Um periódico não garante atomicidade em falhas de energia. Eu acho que o ext3 e o ext4 garantem que 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?
Gilles 'SO- stop be evil'
@Gilles, você tem alguma informação sobre como isso pode ser garantido teoricamente sem um diário? Quero dizer, no nível básico, estamos falando sobre sincronizar gravações em dois arquivos diferentes para garantir que você nunca obtenha o resultado de que apenas um deles foi executado.
Random832
Os sistemas de arquivos estruturados em log mantêm a consistência, não substituindo os blocos que estão em uso. Isso é adequado para mídia flash, onde a substituição de dados existentes é cara. O log não é realmente como um diário, porque nada é reproduzido durante a montagem - embora você possa dizer que todo o sistema de arquivos é o diário (exceto que a montagem nunca envolve reproduzir a coisa toda na memória, pois seria muito lento). A descrição do LogFS na Wikipedia é uma boa visão geral.
Gilles 'SO- stop be evil'
1

Esta pergunta foi feita de uma maneira um pouco diferente no Superusuário. A página da Wikipedia no mvcomando também explica muito bem:

Mover arquivos dentro do mesmo sistema de arquivos geralmente é implementado de maneira diferente da cópia do arquivo e da remoção do original. Nas plataformas que não suportam a renomeação de syscall, um novo link é adicionado ao novo diretório e o original é excluído. Os dados do arquivo não são acessados.

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.

Benjamin B.
fonte
2
o sistema renomeado chama uma abstração do sistema operacional? Desde hardware sábio, eu poderia sempre ser capaz de interromper uma série de operações desde renomear deve ser uma série de operações
graphtheory92
Não, não é uma abstração do sistema operacional, mas pensei em afirmar "portanto, é altamente improvável que o sistema de arquivos se torne inconsistente ..." tornaria as coisas excessivamente complicadas. Eu concordo com você embora.
Benjamin B.
2
Essa resposta me deixa pensando por que a renamechamada 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.
Tanner Swett
1
@ graphtheory92: Se uma chamada do sistema é atômica, isso não significa que a operação do disco resultante (ou uma série de operações do disco!) também seja atômica. ------ Eu posso imaginar que, movendo um arquivo (contagem de links físicos 1) e cortando a energia, a conexão do disco rígido ou travando o kernel no momento certo, você pode acabar com dois links físicos (o original e o novo ) para o arquivo com a contagem de links físicos ainda sendo 1. ------ Acho que existem duas soluções básicas para o problema: a) software - journaling FS que pode se recuperar automaticamente de estados inconsistentes. b) transações suportadas por HW.
Pabouk # 9/15
2
A garantia de atomicidade a que você se refere diz respeito à observação por outros processos. Não é válido se o sistema travar.
Gilles 'SO- stop be evil'