En mi sistema Arch Linux (Linux Kernel 3.14.2), los montajes de enlace no respetan la opción de solo lectura
# mkdir test
# mount --bind -o ro test/ /mnt
# touch /mnt/foo
crea el archivo /mnt/foo
. La entrada relevante en /proc/mounts
es
/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0
Las opciones de montaje no coinciden con mis opciones solicitadas, pero coinciden con el comportamiento de lectura / escritura del montaje de enlace y las opciones utilizadas para montar originalmente /dev/sda2
en/
/dev/sda2 / ext4 rw,noatime,data=ordered 0 0
Sin embargo, si vuelvo a montar el soporte, respeta la opción de solo lectura
# mount --bind -o remount,ro test/ /mnt
# touch /mnt/bar
touch: cannot touch ‘/mnt/bar’: Read-only file system
y la entrada relevante en /proc/mounts/
/dev/sda2 /mnt ext4 ro,relatime,data=ordered 0 0
se parece a lo que podría esperar (aunque en verdad esperaría ver la ruta completa del test
directorio). La entrada /proc/mounts/
para el montaje original de /dev/sda2/
on /
tampoco cambia y permanece en lectura / escritura
/dev/sda2 / ext4 rw,noatime,data=ordered 0 0
Este comportamiento y la solución se conocen desde al menos 2008 y están documentados en la página de manual demount
Tenga en cuenta que las opciones de montaje del sistema de archivos seguirán siendo las mismas que en el punto de montaje original, y no se pueden cambiar pasando la opción -o junto con --bind / - rbind. Las opciones de montaje se pueden cambiar mediante un comando de montaje por separado
No todas las distribuciones se comportan igual. Arch parece no respetar silenciosamente las opciones, mientras que Debian genera una advertencia cuando el montaje de enlace no obtiene montaje de solo lectura
mount: warning: /mnt seems to be mounted read-write.
Hay informes de que este comportamiento fue "arreglado" en Debian Lenny y Squeeze, aunque no parece ser una solución universal ni funciona en Debian Wheezy. ¿Cuál es la dificultad de hacer que el montaje de enlace respete la opción de solo lectura en el montaje inicial?
fuente
mount -t bind
un script de ayuda en bugs.launchpad.net/ubuntu/+source/mountall/+bug/519380/etc/mtab
. Después del montaje inicial, la entrada dice que el montaje es rw y después del montaje dice ro, por lo que informa el estado del montaje correctamente. Es solo el comando de montaje el que falla.mount --bind -o ro
, ambos escupen un mensajemount: warning: «mountpoint» seems to be mounted read-write.
. Parece que Debian cayó o perdió el parche en algún momento ... funciona, sin embargo.Respuestas:
Bind Mount es solo ... bueno ... Bind Mount. Es decir, no es una nueva montura. Simplemente "vincula" / "expone" / "considera" un subdirectorio como un nuevo punto de montaje. Como tal, no puede alterar los parámetros de montaje. Es por eso que recibes quejas:
Pero como dijiste, un montaje de unión normal funciona:
Y luego un montaje de ro también funciona:
Sin embargo, lo que sucede es que está cambiando todo el montaje y no solo este montaje de enlace. Si echas un vistazo a / proc / monturas, verás que tanto el montaje de enlace como el montaje original cambian a solo lectura:
Entonces, lo que está haciendo es como cambiar el montaje inicial a un montaje de solo lectura y luego hacer un montaje de enlace que, por supuesto, será de solo lectura.
ACTUALIZACIÓN 2016-07-20:
Lo siguiente es cierto para los núcleos 4.5, pero no es cierto para los núcleos 4.3 (Esto es incorrecto. Consulte la actualización # 2 a continuación):
El kernel tiene dos banderas que controlan solo lectura:
MS_READONLY
: Indica si el montaje es de solo lecturaMNT_READONLY
: Indica si el "usuario" lo quiere de solo lecturaEn un kernel 4.5, hacer un
mount -o bind,ro
testamento realmente hará el truco. Por ejemplo, esto:creará un montaje de enlace de solo lectura de
/tmp/test/a/d
to/tmp/test/b
, que será visible en/proc/mounts
:Se puede ver una vista más detallada
/proc/self/mountinfo
, que tiene en cuenta la vista del usuario (espacio de nombres). Las líneas relevantes serán estas:Donde en la segunda línea, puede ver que dice ambos
ro
(MNT_READONLY
) yrw
(!MS_READONLY
).El resultado final es este:
ACTUALIZACIÓN 2016-07-20 # 2:
Un poco más de investigación muestra que el comportamiento depende de la versión de libmount que es parte de util-linux. El soporte para esto se agregó con este commit y se lanzó con la versión 2.27:
que también proporciona la solución alternativa. El comportamiento se puede ver usando strace en un montaje más antiguo y más nuevo:
Antiguo:
Nuevo:
Conclusión:
Para lograr el resultado deseado, es necesario ejecutar dos comandos (como ya dijo @Thomas):
Las versiones más recientes de mount (util-linux> = 2.27) hacen esto automáticamente cuando se ejecuta
fuente
mount -o bind,ro
creaba una vista de solo lectura de un sistema de archivos de lectura-escritura (pero ya no parece estar en jadeo).mount --bind /tmp/ /mnt/tmp/; mount -o remount,bind,ro /mnt/tmp/
... entoncestouch /tmp/a
está bien, perotouch /mnt/tmp/b
datouch: cannot touch ‘/mnt/tmp/b’: Read-only file system
. Eso funciona tanto en Debian 3.13 como en kernel.org 3.14.2. Por lo tanto, no solo cambia todo el montaje. Al menos no con los núcleos recientes.La solución adecuada es realmente montarlo dos veces. En la línea de comando:
En
/etc/fstab
:El manual (
man mount
) lo dice así:fuente
Está preguntando desde la perspectiva de la
mount(8)
línea de comando (que es aceptable en este sitio). Ese comando se ha discutido en las otras respuestas y, en algunos casos, extrae la segundamount(2)
llamada al sistema necesaria .Pero, ¿por qué se necesita la segunda llamada al sistema? ¿Por qué una sola
mount(2)
llamada no puede crear el montaje de enlace de solo lectura?La
mount(2)
página del manual explica que, como otros han señalado, se están configurando dos conjuntos de banderas:Dice:
Y con respecto a
MS_REMOUNT
:Creo que el problema surgió cuando se introdujeron los montajes de unión:
Parece que, en lugar de usar
MS_BIND | MS_REMOUNT
como señal para establecer solo los indicadores VFS, podrían haber elegido exceptuar (y aceptar)MS_RDONLY
junto con la inicialMS_BIND
y aplicarla al punto de montaje.Entonces, debido a la semántica algo extraña de la
mount(2)
llamada al sistema:fuente