Como o sistema de arquivos escreve atomicamente um bloco no disco?

7

O bloco é uma abstração fornecida pelo sistema de arquivos, o tamanho do bloco é múltiplos inteiros do tamanho do setor do disco. Suponha que um sistema de arquivos usa 4K como tamanho de bloco, e o tamanho do setor de disco é 512B, quando o sistema de arquivos emite um pedido de gravação para o driver de disco, como escrever todo o bloco 4K em disco (evitar gravação parcial)? / strong> Eu quero saber como o kernel moderno resolve esse problema, mas eu não quero mergulhar na base de código Linux para encontrar a resposta. Qualquer ajuda será apreciada.

    
por StrikeW 28.04.2016 / 11:07

3 respostas

4

Um disco deve conceder que um setor seja escrito atomicamente. O tamanho do setor foi de 512 bytes e hoje é normalmente 4096 bytes para discos maiores.

Para não ter problemas com "blocos" parcialmente escritos, é importante escrever tudo em uma ordem especial.

Note que a única razão pela qual pode haver uma parte parcialmente escrita no sistema de arquivos é uma queda de energia ou algo semelhante.

O método é:

  • Primeiro, escreva todo o conteúdo do arquivo e verifique se isso funcionou

  • Em seguida, escreva os metadados e certifique-se de que todas as estruturas de dados nos metadados se encaixem em um único setor de disco e não abranjam um limite de setor. Isto é, e. importante para nomes de arquivos de tamanho variável como conteúdo de diretório.

por 28.04.2016 / 12:09
1

Isso depende da tecnologia de armazenamento subjacente.

Alguns armazenamentos permitem que um determinado tamanho de bloco seja armazenado atomicamente, normalmente uma potência de 2 que é pelo menos 256 e geralmente na faixa de 1kB-4kB. Se for esse o caso, a camada do sistema de arquivos pode substituir os blocos, desde que a substituição do bloco resulte em um estado de sistema válido. Isso é bom quando se escreve o conteúdo de um arquivo (o Unix não dá nenhuma garantia de atomicidade para isso), mas nem sempre ao escrever metadados do sistema de arquivos.

Outra abordagem que não requer qualquer cooperação da camada de disco (além de saber que gravar em um bloco não pode danificar o conteúdo de outros blocos) é nunca apagar blocos existentes, mas sempre gravar em blocos de armazenamento que atualmente não são em uso. Se a gravação for bem-sucedida, uma referência a esse bloco poderá ser incluída em outro bloco, substituindo uma referência a uma versão anterior desse bloco; o bloco contendo a versão anterior é marcado como livre. Isso é mais lento, pois a atualização de um bloco requer a atualização de outro bloco, o que, por sua vez, requer a atualização de outro bloco, etc. A recursão é interrompida em um bloco para o qual o sistema mantém várias cópias; se houver uma falha durante a gravação de uma das cópias, as outras cópias serão usadas. A escolha da cópia correta pode ser feita com base em uma comparação de maioria, se houver três ou mais, ou com base em somas de verificação, se houver duas cópias.

Depois, há sistemas de arquivos log-estruturados , onde os blocos continuam sendo adicionados no final da lista de bloqueios. Os metadados básicos do sistema de arquivos são os encontrados no último bloco válido. O último bloco é determinado pela verificação de registros de data e hora dos blocos.

(Nota: esta resposta é sobre questões genéricas de implementação do sistema de arquivos, eu não tenho ido e verificado o que vários sistemas de arquivos em várias mídias de armazenamento em várias variantes Unix realmente fazem.)

    
por 29.04.2016 / 01:17
-2

Geralmente, todos os SOs moderm terão uma chamada de sistema para gravar dados em um arquivo (no Linux, temos write system call).

E porque todas as chamadas do sistema devem ser atômicas. Então, escrever todo o tamanho do bloco (usando apenas uma chamada de sistema) será atômico.

    
por 28.04.2016 / 11:15