Desmontaje recursivo después del montaje rbind

13

Al ingresar un chroot a veces es necesario montar / sys y / dev usando -rbind en lugar de -bind para asegurar que todo esté en su lugar cuando alguien va a buscar.

El problema viene al desmontar.

Un simple montaje siempre falla; con los niños montados también parece estar en 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))

Otra posible solución es enumerar los montajes de proc y desmontar cada uno de ellos así:

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

Sin embargo, esto también falla porque los montajes recursivos no están realmente registrados en el mtab:

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

Tal vez la solución es realizar un montaje perezoso, pero esto me parece bastante peligroso.

¿Hay una mejor manera de hacer esto que me haya perdido?

natecornell
fuente
1
¿Estás seguro de que /mnt/chroot/sys/kernel/securityestá montado en ese punto? ¿Cuál es la salida de grep /sys/kernel/security /proc/mounts? umountno necesita su argumento para aparecer en la lista /etc/mtab. Si lo pasa -n, no abrirá el archivo en absoluto.
Gilles 'SO- deja de ser malvado'
Si observa detenidamente mi comando grep para crear los xargs para umount, solo le enviaré las monturas enumeradas en / proc / mounts
natecornell

Respuestas:

11

Esto funcionó para mí correctamente: /unix//a/264488/4319 :

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

Era importante tener los dos primeros comandos como dos comandos separados: no combinar --rbindy --make-rslaveen una invocación de montaje.

Sin --make-rslaveel comportamiento no deseado (y no exitoso):

  • umount -l afectaría también a los viejos puntos de montaje originales,
  • y umount -Rse vería afectado por los archivos ocupados (abiertos) en los puntos de montaje antiguos originales. (Muy inesperado ...)
imz - Ivan Zakharyaschev
fuente
No sé si esto se ha solucionado en una versión reciente de la montura, pero está perfectamente bien combinar --rbindy --make-rslaveen la misma invocación de montura:mount --rbind --make-rslave /dev /mnt/test
Javi Merino
1
Si bien puede combinar los dos argumentos, hace que haga un montaje no recursivo. Por lo tanto, en realidad no funciona según lo previsto.
Miral
10

El crédito va a Gilles por esta respuesta; Gilles señaló en los comentarios de la pregunta que el modificador '-n' ignora el mtab y desmonta todo lo que aparece en / proc / mounts.

Desde la página del manual:

-n     Unmount without writing in /etc/mtab.

Entonces, para responder mi pregunta sobre cómo desentrañar un montaje --rbind, este es el comando completo que funcionó para mí:

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

Merci, Gilles!

natecornell
fuente
1
Intentando mount --rbind / /mnt && umount -n /mnt/dev/shm(o pts), lo entiendo umount: /mnt/dev/shm: target is busy. umount -l /mntmata el sistema (por ejemplo, sudo falla diciendo que stdin no es un tty). Esto está en un sistema Fedora instalado. Supongo que es un viejo problema mío: unix.stackexchange.com/questions/269695/…
sourcejedi
3

Desde util-linux v2.23 (25-abr-2013) el umountcomando admite la -R, --recursiveopción.

Esto es lo que dice la página del manual:

Desmonta recursivamente cada directorio especificado. La recursión para cada directorio se detendrá si alguna operación de desmontaje en la cadena falla por algún motivo. La relación entre los puntos de montaje está determinada por las /proc/self/mountinfo entradas. El sistema de archivos debe especificarse por la ruta del punto de montaje; un desmontaje recursivo por nombre de dispositivo (o UUID) no es compatible.

Paul Tobias
fuente
0

Gracias por eso. Lo uso en mis scripts para desmontar todo el árbol chroot: (Asegúrese de configurar $ MNT en consecuencia)

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