A montagem '-o remount, ro' é garantida para falhar se houver arquivos abertos para gravação?

5

Estou trabalhando em uma alternativa segura e livre de condições de corrida para umount -l com dispositivos removíveis:

Estou pensando em:

  1. umount --move sob um diretório 000 permissions para que nenhum outro arquivo possa ser aberto por caminho absoluto
  2. Processos de interatividade (ou desligamento normal) com arquivos abertos para gravação
  3. Remontar atomicamente somente leitura somente se a etapa (2) estiver concluída
  4. Interromper / encerrar processos somente leitura que possam causar problemas
  5. Finalmente, temos umount de sucesso

Existe uma condição de corrida na etapa (3) em que um arquivo com caminho relativo pode ser aberto rw após a última interceptação interativa e antes do mount -o remount,ro .

mount -o remount,ro é garantido para falhar se houver algum arquivo no sistema de arquivos aberto para gravação?

A página de manual está em silêncio sobre isso, e estou um pouco paranóico depois de descobrir que os dispositivos são graváveis mesmo após blockdev --setro .

    
por Tom Hale 14.08.2017 / 07:20

1 resposta

5

Sim. O código relevante está em sb_prepare_remount_readonly (como no Linux 4.0, o código pode ser organizado de forma diferente em outras versões). A lógica é:

  • Para cada instância do monte:
    • Se essa instância não for somente leitura:
      • Impede que qualquer novo gravador se registre ( MNT_WRITE_HOLD ).
      • Se houver gravadores registrados, defina o sinalizador de erro (return EBUSY ).
  • Se houver arquivos removidos (inode count = 0), mas ainda não excluídos (ainda presentes porque o arquivo está aberto), defina o sinalizador de erro.
  • Se o sinalizador de erro não estiver definido, marque a partição como somente leitura.
  • Para cada instância do monte:
    • Pare de impedir que os escritores se registrem.

Gravadores registrados são arquivos abertos para gravação, bem como operações contínuas que gravam metadados ( mkdir , chmod , etc.). Confira as chamadas para mnt_want_write que é onde a contagem de escritores registrados é incrementada.

O design do sistema garante que uma remontagem somente leitura seja uma barreira de registro de gravação: se for bem-sucedida, não haverá gravador registrado, em particular, não pode haver nenhum arquivo aberto para gravação no momento da operação de remontagem . Após a remontagem, nenhum arquivo pode ser aberto para gravação, portanto, ainda não há arquivos abertos para gravação.

    
por 17.08.2017 / 02:04