Umount recursivo após montagem rbind

13

Às vezes, ao entrar em um chroot, é necessário montar / sys e / dev usando -rbind em vez de -bind para garantir que tudo esteja no lugar certo quando alguém procura.

O problema surge quando desmontar.

Uma quantidade simples sempre falha; com as crianças sendo montadas também parece estar em uso:

$ umount /mnt/chroot/sys
umount: /mnt/chroot/sys: device is busy.
    (In some cases useful info about processes that use
     the device is found by lsof(8) or fuser(1))

Outra solução possível é listar as montagens de proc e desmontar cada uma das seguintes:

$ grep /mnt/chroot/sys /proc/mounts | cut -f2 -d" " | sort -r | xargs umount

No entanto, isso também falha porque as montagens recursivas não são realmente registradas no mtab:

/mnt/chroot/sys/kernel/security is not mounted (according to mtab)

Talvez a solução seja realizar uma quantidade preguiçosa, mas isso me parece bastante perigoso.

Existe uma maneira melhor de fazer isso que eu perdi?

natecornell
fonte
1
Tem certeza de que /mnt/chroot/sys/kernel/securityestá montado nesse ponto? Qual é a saída de grep /sys/kernel/security /proc/mounts? umountnão precisa que seu argumento seja listado /etc/mtab. Se você passar -n, ele não abrirá o arquivo.
Gilles 'SO- stop be evil'
Se você olhar atentamente para o meu comando grep para criar os xargs para umount, eu só estou enviando-as montagens listados em / proc / mounts
natecornell

Respostas:

11

Isso funcionou corretamente para mim - /unix//a/264488/4319 :

mount --rbind /dev /mnt/test
mount --make-rslave /mnt/test
umount -R /mnt/test

Era importante ter os dois primeiros comandos como dois comandos separados: não combine --rbinde --make-rslaveem uma chamada de montagem.

Sem --make-rslave, o comportamento era indesejado (e não obteve êxito):

  • umount -l também afetaria os antigos pontos de montagem originais,
  • e umount -Rseria afetado pelos arquivos ocupados (abertos) sob os pontos de montagem antigos originais. (Muito inesperado ...)
imz - Ivan Zakharyaschev
fonte
Não sei se isso foi corrigido em uma versão recente do monte, mas é perfeitamente ok para combinar --rbinde --make-rslaveno mesmo montar invocação:mount --rbind --make-rslave /dev /mnt/test
Javi Merino
1
Embora você possa combinar os dois argumentos, ele faz uma montagem não recursiva. Portanto, ele realmente não funciona como planejado.
11117 Miral
10

O crédito é para Gilles por esta resposta; Gilles observou na pergunta comenta que a opção '-n' ignora o mtab e desmonta qualquer coisa listada em / proc / mounts.

Na página de manual:

-n     Unmount without writing in /etc/mtab.

Então, para responder à minha pergunta de como desvendar uma montagem --rbind, este é o comando completo que funcionou para mim:

grep /mnt/chroot/sys /proc/mounts | cut -f2 -d" " | sort -r | xargs umount -n

Merci, Gilles!

natecornell
fonte
1
Tentando mount --rbind / /mnt && umount -n /mnt/dev/shm(ou pts), eu entendo umount: /mnt/dev/shm: target is busy. umount -l /mntmata o sistema (por exemplo, sudo falha ao dizer que stdin não é um tty). Isso está em um sistema Fedora instalado. Eu acho que é um problema antigo da mina: unix.stackexchange.com/questions/269695/...
sourcejedi
3

Desde o util-linux v2.23 ( 25/04/2013 ), o umountcomando suporta a -R, --recursiveopção

Aqui está o que a página de manual diz:

Desmonte recursivamente cada diretório especificado. A recursão para cada diretório será interrompida se qualquer operação de desmontagem na cadeia falhar por qualquer motivo. O relacionamento entre pontos de montagem é determinado pelas /proc/self/mountinfo entradas. O sistema de arquivos deve ser especificado pelo caminho do ponto de montagem; uma desmontagem recursiva pelo nome do dispositivo (ou UUID) não é suportada.

Paul Tobias
fonte
0

Obrigado por isso. Eu uso isso em meus scripts para desmontar toda a árvore de chroot: (Certifique-se de definir $ MNT de acordo)

for dir in $(grep "$MNT" /proc/mounts | cut -f2 -d" " | sort -r)
do
    umount $dir 2> /dev/null
    (( $? )) && umount -n $dir
done
Justin Sane
fonte