Como desmontar corretamente os diretórios montados depois de fazer o chroot?

1

Normalmente, eu montei alguns diretórios para chroot environtment assim:

mount -t proc /proc /mnt/chroot/proc
mount --rbind /dev /mnt/chroot/dev
mount --rbind /sys /mnt/chroot/sys
mount --rbind /run /mnt/chroot/run

Mas, depois de terminar, não consigo desmontar esses diretórios montados e há uma mensagem para obter uma lista de processos em execução que usam os diretórios, o que me fornece uma lista de várias linhas de processos. Então, como desmontar corretamente esses diretórios?

    
por Mas Bagol 04.05.2015 / 16:47

2 respostas

1

A maneira normal de descobrir o que está impedindo um sistema de arquivos de ser desmontado é listar os processos que possuem um arquivo aberto nele (ou um descritor de arquivo, ou seu diretório atual, etc.):

lsof /path/to/mount/point
fuser -m /path/to/mount/point

Revise a lista de processos e elimine-os, se necessário.

Existem também algumas maneiras em que o próprio kernel pode ter algo acontecendo que impede a desmontagem, por exemplo, se houver outro ponto de montagem abaixo dele (por exemplo, você não pode desmontar /mnt/chroot enquanto /mnt/chroot/proc está montado ).

Quando você tem montagens de ligação, os comandos, como os arquivos de lista acima, abrem através de qualquer um dos caminhos para o sistema de arquivos. Por exemplo, fuser -m /mnt/chroot/run lista processos que possuem arquivos abertos nesse sistema de arquivos, sejam eles acessados via /run ou via /mnt/chroot/run .

Para descobrir o que está usando o ponto de montagem, liste os processos e os caminhos por meio dos quais eles têm arquivos abertos e faça alguma filtragem nos caminhos. Por exemplo:

lsof /mnt/chroot/run | grep /mnt/chroot

ou para obtê-los todos

lsof | grep /mnt/chroot

ou você pode acessar /proc diretamente:

ls -l /proc/[0-9]*/fd/* | grep /mnt/chroot

Para processamento automatizado (supondo um% recentesed que suporte -z para delimitadores nulos):

find /proc/[0-9]*/fd -type l -printf '%p %l/
lsof /path/to/mount/point
fuser -m /path/to/mount/point
' | sed -nz 's!^/proc/\([0-9]*\)/fd/[0-9]* /mnt/chroot/.*!!p' | sort -nu

Se você realmente não consegue encontrar o que mantém um sistema de arquivos montado, mas precisa recuperar o ponto de montagem, pode afastar o ponto de montagem criando um diretório vazio em algum lugar e executando mount --move /current/mount/point /empty/directory/out/of/the/way . Você também pode fazer uma desmontagem lenta ( umount -l ), o que faz com que o sistema de arquivos não tenha nenhum ponto de montagem (portanto, os arquivos nele não podem mais ser abertos), mas ser montado enquanto houver arquivos abertos ou outras referências sobre isso.

    
por 06.05.2015 / 02:20
1

Se houver processos rodando "dentro" do chroot (mesmo depois que o seu shell tenha saído), é provável que você não seja capaz de desmontar os sistemas de arquivos (digamos, você não pode simplesmente puxar o sistema de arquivos desses pés).

Nesse caso, reinsira o chroot (em um shell) e pare os serviços, ou simplesmente mate-os (mesmo que "de fora" do chroot), se você não se importa com o estado deles, etc.

    
por 04.05.2015 / 19:58

Tags