Se necesita un directorio existente como punto de montaje .
$ ls
$ sudo mount /dev/sdb2 ./datadisk
mount: mount point ./datadisk does not exist
$ mkdir datadisk
$ sudo mount /dev/sdb2 ./datadisk
$
Me resulta confuso ya que superpone los contenidos existentes del directorio. Hay dos posibles contenidos del directorio del punto de montaje que pueden cambiarse inesperadamente (para un usuario que no está realizando el montaje).
¿Por qué no mount
sucede en un directorio recién creado? Así es como los sistemas operativos gráficos muestran los medios extraíbles. Sería claro si el directorio está montado (existe) o no está montado (no existe). Estoy bastante seguro de que hay una buena razón, pero aún no he podido descubrirlo.
udisksctl
. ¿Por qué usarmount
?better design than Unix!
[cita requerida]Respuestas:
Este es un caso de un detalle de implementación que se ha filtrado.
En un sistema UNIX, cada directorio consta de una lista de nombres asignados a números de inodo . Un inodo contiene metadatos que le dicen al sistema si es un archivo, directorio, dispositivo especial, canalización con nombre, etc. Si es un archivo o directorio, también le dice al sistema dónde encontrar el contenido del archivo o directorio en el disco. La mayoría de los inodos son archivos o directorios. La
-i
opción parals
listará los números de inodo.El montaje de un sistema de archivos toma un inodo de directorio y establece un indicador en la copia en memoria del núcleo para decir "en realidad, cuando busque el contenido de este directorio, mire este otro sistema de archivos" (vea la diapositiva 10 de esta presentación ). Esto es relativamente fácil ya que está cambiando un solo elemento de datos.
¿Por qué no crea una entrada de directorio para que apunte al nuevo inodo? Hay dos formas de implementarlo, las cuales tienen desventajas. Una es escribir físicamente un nuevo directorio en el sistema de archivos, ¡pero eso falla si el sistema de archivos es de solo lectura! La otra es agregar a cada proceso de listado de directorio una lista de cosas "adicionales" que realmente no están allí. Esto es incómodo y potencialmente incurre en un pequeño impacto en el rendimiento en cada operación de archivo.
Si desea puntos de montaje creados dinámicamente, el
automount
sistema puede hacer esto. Sistemas de archivos no son de disco especiales también pueden crear directorios a voluntad, por ejemploproc
,sys
,devfs
y así sucesivamente.Editar: vea también la respuesta a ¿Qué sucede cuando 'monta sobre' una carpeta existente con contenido?
fuente
sudo mount --bind / /mnt ; ls /mnt/proc
-> vacío. Me pregunto cómo funciona.fs/namespace.c
, creo; No estoy familiarizado con la fuente y no quería pasar demasiado tiempo perforando los detalles. La "bandera en el inodo" que obtuve de la presentación vinculada./var/cache
algún momento cuando/var
no se pudo montar). Consulte tambiénpath_resolution(7)
. (Las páginas de manual de Linux anteriores tenían esa página de manual en la sección 2, como die.net). Identifique cómo Linux funciona realmente internamente, para optimizar la comprobación de cada componente del directorio como un posible montaje. ¿Quizás anclar esa entrada VFS en caché?fs/namei.c
(ruta -> búsqueda de inodo) llama a namespace.c sin embargolookup_mnt()
. Hay una bandera en la dentry (entrada de caché de directorio). Pero eso es solo una optimización, también conocida como detalle de implementación. No le dice qué sistema de archivos está montado allí; tienes que mirar en la mesa de montaje. (Consulte m_hash (), para obtener más detalles sobre la implementación. Linux, al menos, evita comparaciones de cadenas adicionales, y AFAICS al mismo tiempo se las arregla para reutilizar dentry en, por ejemplo, monturas de enlace, porque está escrito por asistentes).man 8 mount
::mount --bind foo foo
. Lamount
llamada de enlace solo adjunta (parte de) un solo sistema de archivos, no es posible submontar. Toda la jerarquía de archivos, incluidos los submontajes, se adjunta un segundo lugar mediante :mount --rbind olddir newdir
Si se
mount(2)
requiere la creación de un nuevo directorio para ser el punto de montaje, no podría montar nada bajo un sistema de archivos de solo lectura. Eso sería tonto, por lo que podemos descartarlo.Si mount creara opcionalmente un nuevo directorio para ser el punto de montaje, sería extraño. No es como montar / desmontar todo el tiempo, por lo que poner lógica adicional en el núcleo para realizar estos dos pasos con una sola llamada al sistema no sería una aceleración importante. Simplemente déjelo al espacio del usuario para hacer una
mkdir(2)
llamada al sistema si lo desea. La respuesta de Dmitry señala quemount(2)
hacer ambas cosas lo haría no atómico. Y te gustaría un argumento adicional paramount(2)
con banderas modo comoopen(2)
se lleva, paraO_CREAT
,O_EXCL
, etc. Sólo sería tonto en comparación con dejar el espacio de usuario hacerlo.¿O tal vez estabas preguntando sobre cómo hacer esto
mount(8)
(el programa tradicional que hacemount(2)
llamadas al sistema)? Eso sería posible, pero ya hay un producto perfectamente buenomkdir(1)
para el trabajo, y el diseño de Unix se trata de buenas herramientas pequeñas que se pueden combinar. Si desea una herramienta que haga ambas cosas, es fácil escribir un script de shell para construir esa herramienta a partir de dos herramientas más simples. (O, como comentó muru,udisksctl
ya lo hace, por lo que no tiene que escribirlo). Además, Linux es normalmount(8)
desde util-linux admite elmount -o x-mount.mkdir[=mode]
uso de sux-
sintaxis para las opciones de espacio de usuario, en lugar de las opciones que se pasan al sistema de archivos.Ahora la pregunta más interesante: ¿por qué tiene que haber un directorio en el sistema de archivos principal?
Como señala la respuesta de pjc50 (¡sin relación, a pesar de que tiene mis iniciales!), Hacer que los puntos de montaje aparezcan en los listados del directorio requeriría una verificación adicional en cada uno
readdir()
.Tener puntos de montaje como directorios en el directorio que los contiene (en el FS primario) es un buen truco.
readdir()
no tiene que notar que es un punto de montaje en absoluto. Eso solo sucede si el punto de montaje se usa como un componente de ruta. La resolución de ruta, por supuesto, tiene que verificar la tabla de montaje para cada componente de directorio de una ruta.fuente
If mount(2) required the creation of a new directory to be the mount point, you couldn't mount anything under a read-only filesystem. That would be dumb
- Yo diría que es más inteligente: desde la perspectiva del usuario, un sistema de archivos de solo lectura no debería cambiar, pero permitir montajes significa que puedero
. Hay muchos casos de uso para sistemas de archivos de solo lectura donde su argumento no tiene sentido.man 8 mount
:x-mount.mkdir[=mode]
Permitir hacer un directorio de destino (punto de montaje). El modo de argumento opcional especifica el modo de acceso al sistema de archivos utilizado para lamkdir(2)
notación octal. El modo predeterminado es 0755. Esta funcionalidad solo es compatible con usuarios root./tmp
y/home
. O montado en NFS de solo lectura/usr
con un local/usr/local
montado en él. O, más generalmente, cualquier imagen compartida de solo lectura con una parte modificable montada sobre ella. (Las modificaciones locales a una imagen de solo lectura también se pueden hacer por archivo con sistemas de archivos personalizados como overlayfs u otros sistemas de archivos de unión para Linux, utilizados en imágenes de arranque LiveCD). Inicialmente estaba pensando en el RO raíz montado inicialmente en RO arranque, pero hacer que rw pueda suceder antes de otras monturas.El montaje en el directorio existente hace una llamada a
mount
prácticamente atómica: tiene éxito o falla, al menos desde la perspectiva del usuario. Simount
tuviera que crear el punto de montaje en sí, tendría dos puntos de falla, lo que haría imposible garantizar un retroceso limpio. Imagine el siguiente escenario:mount
crea con éxito el punto de montajemount
intenta montar un nuevo sistema de archivos en ese directorio, pero fallamount
intenta eliminar el punto de montaje, pero fallaEl sistema termina con un efecto secundario de un error
mount
.Aqui hay otro más:
umount
desmonta con éxito un sistema de archivosumount
intenta eliminar el punto de montaje, pero fallaAhora, ¿debería
umount
devolver el éxito o el fracaso?fuente
mount
tiene 8 códigos de retorno diferentes para errores que también se pueden combinar. Simplemente podría agregar otro cuando falla la eliminación del directorio. man7.org/linux/man-pages/man8/mount.8.html#RETURN_CODESmount
sistema no lo crea. Aunque tal vez eso fue solo mi interpretación / expectativa de lo que pensé que el OP quería preguntar, o lo que hubiera preguntado si hubiera preguntado.Otro caso que puede ocurrir:
Cuando inicia, una imagen básica de solo lectura se carga en el directorio raíz. Por lo tanto, le gustaría anularlo cuando desee amontonar la raíz real. Entonces puede imaginar que mount syscall simplemente cambie el punto de
ro
montaje arw
.Aquí, imaginemos que tiene un problema con el sistema de archivos en el punto de montaje raíz, le gustaría intentar repararlo. Con la superposición de montaje, puede desmontar el sistema de archivos y usarlo
fsck
en la imagen básica para resolverlo.Esta característica también puede ser útil en sistemas que necesitan una seguridad sólida para realizar un seguimiento del cambio entre una
ro
partición y unarw
.fuente
mount
necesario, crear un nuevo directorio en la ubicación del punto de montaje que no podría montar nada encima de un sistema de archivos de solo lectura? El primer párrafo es confuso: no es así como funciona Linux initrd. Utiliza lapivot_root
llamada del sistema para cambiar la raíz fs, no solo montar más cosas sobre ella. Eso hizo difícil seguir tu lógica en los siguientes párrafos, porque pensé que estabas hablandopivot_root(2)
.pivot_root
y luegoumount
el disco ram. Pero initramfs es rootfs: no puedes nipivot_root
rootfs ni desmontarlo . En su lugar, elimine todo de rootfs para liberar el espacio (find -xdev / -exec rm {} \;
), supere rootfs con la nueva raíz (cd /newmount; mount --move . /; chroot .
), adjunte stdin / stdout / stderr a la nueva / dev / console yexec
la nuevainit
Siempre me he preguntado eso también.
Un contenedor simple como:
guardado como un script ejecutable nombrado
mount
en un directorio que sobrescribe/bin
en su RUTA debe ocuparse de esto si le molesta demasiado(Antes de ejecutar el
mount
binario real , crea un directorio con el nombre del último argumentomount
, si dicho directorio ya no existe).Alternativamente, si no desea invocaciones fallidas del
mount
contenedor para crear directorios, puede hacer:fuente
mount
comando usar el directorio así creado?mount /dev/foo /some/path
:? Supuse que funcionaría como loudisksctl
hace, así que correríamount /dev/foo
.eval
expandir$#
, utilizando"${@:-1}"
. Probé esto con DASH, ya que creo que no admite nada más allá de lo que POSIX sh debe admitir./bin/dash -c 'echo ${@:-1}' foo bar
impresionesbar
.man -o x-mount.mkdir
...