¿Por qué mi montaje de enlace es visible fuera de su espacio de nombres de montaje?

12

Así que estoy tratando de entender cómo funciona el espacio de nombres de montaje de Linux. Entonces, hice un pequeño experimento, abrí dos terminales y ejecuté lo siguiente:

Terminal 1

root@goliath:~# mkdir a b
root@goliath:~# touch a/foo.txt
root@goliath:~# unshare --mount -- /bin/bash
root@goliath:~# mount --bind a b
root@goliath:~# ls b
foo.txt

Terminal 2

root@goliath:~# ls b
foo.txt

¿Cómo es que el montaje es visible en la Terminal 2? Como no es parte del espacio de nombres de montaje, esperaba que el directorio apareciera vacío aquí. También intenté pasar -o shared=noy usar --make-privateopciones con mount, pero obtuve el mismo resultado.

¿Qué me estoy perdiendo y cómo puedo hacer que sea realmente privado?

Error fatal
fuente
los montajes son para todo el sistema, no son específicos de un entorno de shell. compartido, esclavo, privado e inamovible no son lo que crees que son. lea man mount.
cas
3
@cas: De acuerdo, eso --make-privateno es lo que quiero. Pero, ¿no es ese el objetivo de los espacios de nombres de montaje (que no son de todo el sistema)?
FatalError

Respuestas:

11

Si está en una distribución basada en systemd con una util-linuxversión inferior a 2.27, verá este comportamiento poco intuitivo. Esto se debe a que CLONE_NEWNSpropaga indicadores, como shareddepender de una configuración en el kernel. Esta configuración es normalmente private, pero systemd cambia esto a shared. A partir de util-linux2.27, se realizó un parche que cambia el comportamiento predeterminado del unsharecomando para usarlo privatecomo comportamiento de propagación predeterminado para que sea más intuitivo.

Solución

Si está en un sistema systemd con <2.27 util-linux, debe volver a montar el sistema de archivos raíz después de ejecutar el unsharecomando:

# unshare --mount -- /bin/bash
# mount --make-private -o remount /

Si está en un sistema systemd con> = 2.27 util-linux, debería funcionar como se esperaba en el ejemplo que dio en su pregunta, textualmente, sin la necesidad de volver a montar. Si no es así: pase --propagation privateal unsharecomando para forzar que la propagación del espacio de nombres de montaje sea privada.

Dave
fuente
0

esto no funcionó en ubuntu (15.04 y 14.04). Funcionó en Fedora. y para fedora. si necesita --make-private o no, también puede verificar

cat / proc / self / mountinfo | grep compartido

si se comparte, significa que algún otro espacio de nombres aún puede ver los montajes. Entonces es un problema relacionado con el sistema. Puedes usar --make-private para que funcione

Kennan
fuente