Como o findmnt é capaz de listar montagens de bind?

8

Nota para moderadores: não feche isto como duplicado. Eu não estou procurando informações sobre como listar montagens de ligação. Eu estou perguntando como o kernel mantém esta informação e como findmnt é capaz de acessá-la.

Muitas pessoas continuam dizendo que o Linux não guarda informações sobre montagens de bind, então não há como obter uma lista delas e suas fontes. Aqui estão alguns exemplos:

  • de um dos comentários aqui :

    IIRC esta informação não é mantida em qualquer lugar: depois de mount --bind , as duas cópias são equivalentes, não há uma que seja mais “original” que a outra. Afinal, não haveria nenhum original se você já tivesse desmontado /mnt .

  • de uma resposta neste site :

    Portanto, a única maneira de lembrar quais montagens foram ligadas é o log dos comandos de montagem restantes em /etc/mtab . Uma operação de montagem de ligação é indicada pela opção de montagem de ligação (que faz com que o tipo de sistema de arquivos seja ignorado). Mas o mount não tem opção de listar apenas sistemas de arquivos montados com um conjunto particular de conjuntos de opções.

  • de um relatório de erros do Debian :

    Isso é intencional. Ambos os pontos de montagem são totalmente iguais de todas as maneiras o kernel não mantém nenhum sinalizador para diferenciá-los.

O acima é um absurdo embora. A ferramenta findmnt é capaz de listar os caminhos de origem das montagens de ligação (na forma de device[source-path] ; também estou tentando fazer com que ela liste apenas o caminho de origem e não o dispositivo) . Se o kernel do Linux é para manter uma montagem de ligação, então essa informação tem que ser armazenada em algum lugar , caso contrário, não poderia saber que /home está vinculado a /users . Então, onde estão esses dados? É armazenado em alguma região obscura na RAM? O findmnt procura /proc em algum lugar?

    
por Melab 13.07.2016 / 03:50

2 respostas

10

Você entendeu mal um pouco; os dois pontos de montagem são iguais em termos de permissões, sinalizadores, etc., porque a ligação redireciona efetivamente o acesso de um caminho para outro. Mas eles ainda são distintos .

Se você olhar para /proc/self/mountinfo , verá a visualização do kernel do mundo da montagem para esse processo (espaços de nomes tornam as coisas mais complicadas; não há apenas uma exibição da tabela de montagem). / p>

man 5 proc explicará o formato deste arquivo, mas você pode ver a hierarquia da árvore e onde as montagens de ligação têm seu "pai". Este é o arquivo que findmnt analisa.

    
por 13.07.2016 / 04:06
5

O Linux não mantém as informações sobre qual montagem era uma montagem de ligação . Ele mantém informações sobre todas as montagens, incluindo montagens de bind .

É bastante semelhante aos links físicos. Montagens link para sistemas de arquivos como nomes de arquivos para inodes. As únicas diferenças são que as montagens também possuem sinalizadores por ponto de montagem e podem se referir a um subdiretório do sistema de arquivos de destino em vez da raiz do sistema de arquivos.

Quando você cria um link físico, o sistema de arquivos não salva qual nome de arquivo é o original e qual é o link físico. Ambos simplesmente se referem ao mesmo inode. Se você desvincular o arquivo original, a situação é indistinguível se você criou diretamente o arquivo com o segundo nome de arquivo.

Voltar para montagens de ligação: O kernel mantém uma tabela que contém o sistema de arquivos (identificado por um dos principais: pares de números menores), o ponto de montagem, o caminho relativo à raiz do sistema de arquivos e alguns sinalizadores. Você pode acessar essa lista observando /proc/self/mountinfo . (Isso fica mais complicado quando os namespaces estão envolvidos, como mencionado por @ stephen-harris). findmnt analisa essa lista.

Se a sua raiz for /dev/sda1 com o principal: menor 8:1 e você executar mount --bind /a /b /proc/self/mountinfo conterá linhas semelhantes a esta:

1 0 8:1 / / rw - ext4 /dev/sda1 rw,errors=remount-ro
2 1 8:1 /a /b rw - ext4 /dev/sda1 rw,errors=remount-ro

Se o seu /home for /dev/sda2 com o principal: menor 8:2 e você executar mount --bind /home /users , ficará assim:

1 0 8:1 / / rw - ext4 /dev/sda1 rw,errors=remount-ro
2 1 8:2 / /home rw - ext4 /dev/sda2 rw
3 1 8:2 / /users rw - ext4 /dev/sda2 rw

As colunas relevantes para sua pergunta são a terceira, a quarta e a quinta. Estes são os ids do sistema de arquivos (para real sistemas de arquivos é o mesmo que o dispositivo maior: menor; para sistemas de arquivos virtuais como tmpfs é [0: contador ]), o caminho relativo ao a raiz do sistema de arquivos que está ligada ao ponto de montagem (geralmente / para montagens normais, pode ser qualquer coisa para montagens de ligação) e o ponto de montagem.
Para o significado das colunas restantes, consulte a documentação do kernel do Linux .

findmnt chama o caminho de origem relativo à raiz do sistema de arquivos "FSROOT". Você pode usar findmnt -o TARGET,FSROOT para obtê-lo. Se você deseja o caminho de origem absoluto, provavelmente precisará analisar /proc/self/mountinfo e combinar as informações sobre as montagens para o mesmo sistema de arquivos.

Para obter mais informações, consulte minha resposta para "List only bind bounts" .

    
por 21.02.2017 / 02:30