Por que MNT_DETACH preguiçoso ou `umount -l` não é seguro / perigoso?

10

Eu li em alguns lugares que umount -lnão é seguro:

Em uma resposta de @cas :

não use umounta --lazyopção se você se preocupa com quando a unidade externa pode ser desconectada com segurança

Um comentário de @frostschutz :

umount --lazynão é seguro e não pode ser tornado seguro. [...]

Este util-linux comentário de Ruediger Meier :

Você deve evitar o uso umount -l. Apenas mate todos os processos que estão usando /tmp/mountpointe depois desmonte sem opção -l.

Por que é umount -linseguro / perigoso?

Existe uma maneira de torná-lo seguro?

Tom Hale
fonte

Respostas:

12

Uma desmontagem preguiçosa cria uma montaria de gato de Schrödinger

  • Você não pode saber se o dispositivo está realmente desmontado ou não
  • O sistema de arquivos "não montado" permanece acessível em algumas circunstâncias
  • O sistema de arquivos "desmontado" não é acessível em algumas circunstâncias

Há uma falsa sensação de segurança : parece que o sistema de arquivos foi desmontado, mas, na realidade, só foi oculto no espaço para nome / hierarquia do arquivo.

  • Os processos ainda podem gravar via descritores de arquivo aberto
  • Arquivos novos ou existentes podem ser abertos para gravação por processos com um diretório ativo dentro do ponto de montagem através de nomes de caminho relativos

Isso significa que se você umount -l /media/hddnão conseguir mais acessar /media/hdd/dir/file(nome do caminho absoluto), mas se tiver um processo com diretório /media/hddativo, ainda poderá criar novos processos que podem ler / gravar ./dir/file(nome do caminho relativo).

Se você tentar desmontar o dispositivo, receberá uma mensagem confusa:

# umount --force --all-targets /dev/sdb2
umount: /dev/sdb2: not mounted

Isso faz parecer que o dispositivo não foi montado, mas ainda pode haver processos gravando no disco.

Como existem várias situações não óbvias que podem causar o bloqueio de umount , o sistema de arquivos ainda não pode ser desmontado, embora lsof +f -- /dev/devicenão mostre nada.

Você nunca saberá se o sistema de arquivos realmente desmonta. Não há como descobrir.

Dispositivos removíveis

Se você cria umount -lum disco removível, está no limbo-land: não pode ter certeza de que todos os dados pendentes foram gravados no disco.

O melhor que você pode fazer após a umount -lé garantir que todas as gravações sejam concluídas e impedir futuras gravações , mas você ainda não pode garantir que elas foram desmontadas.

Com dispositivos removíveis, se o dispositivo não estiver adequadamente desmontado, poderá ocorrer um comportamento estranho na próxima vez em que for conectado:

  • O dispositivo receberá um nome de dispositivo incrementado, ou seja, /dev/sdbse tornará /dev/sdc. As mensagens de log do kernel ainda podem se referir /dev/sdb, embora esse dispositivo não exista mais como um arquivo em /dev. (A única maneira que sei resolver isso é reiniciar.)

  • A corrupção do btrfs pode resultar. O btrfs espera que apenas um sistema de arquivos com um determinado UUID esteja presente ao mesmo tempo. O kernel ainda vê o mesmo UUID disponível no dispositivo fantasma e no novo dispositivo. (Eu tive que reconstruir meu disco rígido de backup btrfs).

systemd Pegadinhas

Tom Hale
fonte
"Arquivos novos ou existentes podem ser abertos para gravação por processos com um diretório de trabalho dentro do ponto de montagem através de nomes de caminho relativos" Esta é a informação que eu estava procurando. Você tem links ou referências adicionais?
Jonathon Reinhart
@ Jonathon verificar homem umount. Eu precisaria pesquisar no Google de outra forma. Por favor, poste suas descobertas se você fizer isso.
Tom Hale
Eu li umount(2)várias vezes recentemente. Ele diz apenas "Executar uma desmontagem lenta: torne o ponto de montagem indisponível para novos acessos, desconecte imediatamente o sistema de arquivos e todos os sistemas de arquivos montados abaixo um do outro e da tabela de montagem e efetue a desmontagem quando o ponto de montagem deixar de estar ocupado . " Infelizmente, porém, isso é menos detalhado do que você forneceu.
Jonathon Reinhart
umount(8)diz que um sistema de arquivos está ocupado "por exemplo, quando há arquivos abertos, ou quando algum processo tem seu diretório ativo, ou quando um arquivo de troca está em uso". Isso não soa como uma lista definitiva, mas provavelmente é tão boa quanto poderei encontrar.
Jonathon Reinhart
Eu elaborei um pouco o que você disse e adicionei outros exemplos nesta resposta . Obrigado pela informação!
Jonathon Reinhart