Verificar overmount?

2

/proc/self/mountinfo fornece uma lista de pontos de montagem. Eu suspeito que eles estão classificados com a última montagem criada por último (e mount --move não tem efeito sobre eles).

Então é possível verificar se uma montagem se tornou inacessível, devido a uma montagem movida ou criada mais recentemente?

man proc mostra que o primeiro campo de /proc/self/mountinfo é um "ID de montagem". Mas isso não explica nenhuma maneira de verificar o ID de montagem mais alto em um determinado caminho.

statvfs() ( /usr/bin/stat -f ) pode recuperar outra coisa, um "ID do sistema de arquivos". Eu vejo valores aparentemente únicos nele por sistema de arquivos ... e embora não ajude a pergunta que fiz aqui, também seria suficiente para o meu problema original ... se houvesse também uma maneira de associar um ID de sistema de arquivos com os caminhos de montagem e todas as opções de montagem. ( statvfs() retorna "flags de montagem", mas não opções específicas do sistema de arquivos, ao contrário de /proc/self/mountinfo ).

Um segundo interesse nisso é que eu relatei a detecção incompleta de montagem excessiva como uma falta falta em df .

    
por sourcejedi 18.10.2017 / 23:24

2 respostas

1

Parece que você deve conseguir descobrir todos os detalhes da árvore de montagem olhando o campo "ID pai" em mountinfo .

Considere duas montagens /dir/sub e /dir . Se a montagem pai de /dir/sub não for /dir , mas / , então /dir/sub deverá ser mascarado por /dir .

Ou se você tiver duas montagens para o caminho / , uma será pai da outra, e a montagem filho será a mais alta (acessível).

Se você tiver duas montagens ou mais no mesmo caminho, a parte superior dessas montagens é a que não é pai de nenhuma das outras.

Então tente isto:

  1. Olhe para o seu caminho de montagem P. Se houver uma montada em P que seja filha da sua montaria M, então sua montaria M está escondida.
  2. Caso contrário, observe o subprefixo PRE mais longo do seu caminho P, que possui pelo menos uma montagem nele. Procure seu pai monte PAR lá. Se o seu pai monte PAR não está lá, então a sua montagem M está oculto.
  3. Recursivamente: se sua PAR de montagem pai estiver oculta, sua montagem original também estará oculta.

Nota: o caminho / não tem prefixos menores. Se você chegar no passo 2 e seu caminho P for igual a / , então você sabe que o mount M não está oculto.

    
por 18.10.2017 / 23:29
0

Se você tiver acesso a chroot , há um hack que funciona em kernels recentes . Pelo menos funciona no Linux v4.17. Eu não acho que é compatível com shell, mas python é ok.

(Observe que você pode ganhar a chroot se tiver acesso a namespaces de usuários. Use unshare -rm --propagation slave ou equivalente.)

# mount --bind / /mnt
# mount --make-slave /mnt    # don't propagate submounts back to /
# mount --bind / /mnt

Agora temos uma sobrecarga, vamos investigar.

# python3
...
>>> import os
>>> os.chdir("/")
>>> os.system("grep mnt proc/self/mountinfo")
231 73 253:0 / /mnt rw,relatime shared:1 - ext4 /dev/mapper/alan_dell_2016-fedora rw,seclabel
352 231 253:0 / /mnt rw,relatime shared:281 - ext4 /dev/mapper/alan_dell_2016-fedora rw,seclabel
0

>>> os.chroot("/mnt")
>>> os.system("cat proc/self/mountinfo")
352 231 253:0 / / rw,relatime shared:281 - ext4 /dev/mapper/alan_dell_2016-fedora rw,seclabel
0

Esse resultado mostra que há um sistema de arquivos acessível montado em /mnt , e é o sistema de arquivos com o ID de montagem 352, etc.

    
por 18.07.2018 / 23:38