Dispositivo gravável mesmo depois de 'blockdev --setro'

3

Eu quero usar a funcionalidade de umount -l e, em seguida, remover o dispositivo subjacente com a maior segurança possível.

  • Não consigo usar umount --force para desmontar o sistema de arquivos, pois ele ficou invisível para novos processos.
  • Não consigo usar lsof para obter uma lista precisa dos arquivos abertos, pois o sistema de arquivos tornou-se invisível para novos processos.
  • Se eu usar lsof antes de umount -l , há uma contenção de corrida de um novo arquivo sendo aberto entre as duas invocações.

Estou testando uma alternativa: sync && blockdev --setro /dev/<device>

O manual para blockdev --setro diz apenas:

Set read-only.

A página man está faltando alguma coisa? Isso parece criar um arquivo em um --setro device:

# mount /dev/loop0 mountpoint/
# blockdev --setro /dev/loop0
# echo test > mountpoint/f
# sync
# umount mountpoint
# mount /dev/loop0 mountpoint/
mount: /tmp/mountpoint: WARNING: device write-protected, mounted read-only.
# cat mountpoint/f
test
#

Ambiente:

$ uname -a
Linux svelte 4.9.39-1-MANJARO #1 SMP PREEMPT Fri Jul 21 08:25:24 UTC 2017 x86_64 GNU/Linux
$ blockdev --version
blockdev from util-linux 2.30
    
por Tom Hale 12.08.2017 / 09:27

1 resposta

2

Eu acho que blockdev --setro funciona de forma semelhante a chmod : afeta apenas as futuras aberturas do objeto.

Mas posso oferecer uma solução alternativa para seu problema de detecção:

  1. O valor /proc/$PID/cwd é alterado para / após a desmontagem lenta.
  2. Os caminhos dos arquivos abertos do processo mostrados em /proc/$PID/fd são movidos para / , por exemplo, /mnt/tmp/output se torna /output .

Portanto, você pode primeiro filtrar todos os processos com cmd / . Pode haver falsos positivos entre eles, mas isso é muito rápido. A próxima etapa (não necessariamente completa, mas provavelmente mais rápida) é verificar /proc/$PID/fd de todos esses processos para arquivos que não existem nos caminhos mostrados.

A verificação completa, mas provavelmente não tão rápida, é executar stat para todos os arquivos em /proc/$PID/fd . Mostra o dispositivo original. Então você pode verificar esse valor antes do umount para facilitar as coisas.

    
por 12.08.2017 / 11:18