Mucha gente sigue diciendo que Linux no guarda información sobre los montajes de enlace, por lo que no hay forma de obtener una lista de ellos y sus fuentes. Aquí hay unos ejemplos:
de uno de los comentarios aquí :
IIRC esta información no se guarda en ningún lado: después
mount --bind
, las dos copias son equivalentes, no hay una que sea más "original" que la otra. Después de todo, no podría haber original si ya hubiera desmontado/mnt
.de una respuesta en este sitio :
Entonces, la única forma de recordar qué monturas eran monturas de unión es el registro de los comandos de montura que quedan
/etc/mtab
. Una operación de montaje de enlace se indica mediante la opción de montaje de enlace (que hace que se ignore el tipo de sistema de archivos). Pero mount no tiene la opción de enumerar solo los sistemas de archivos montados con un conjunto particular de conjuntos de opciones.de un informe de error de Debian :
Esto es intencional Ambos puntos de montaje son totalmente iguales en todos los sentidos, por lo que el núcleo no mantiene ningún indicador para diferenciarlos.
Sin embargo, lo anterior no tiene sentido. La herramienta findmnt
puede enumerar las rutas de origen de los montajes de enlace (en forma de device[source-path]
; También estoy tratando de hacer que solo enumere la ruta de origen y no el dispositivo). Si el kernel de Linux va a mantener un montaje de enlace, entonces esa información tiene que almacenarse en algún lugar , de lo contrario no podría saber que /home
está vinculada /users
. Entonces, ¿dónde están estos datos? ¿Está almacenado en alguna región oscura en la RAM? ¿ findmnt
Mira en /proc
algún lado?
fuente
findmnt
está ejecutando y qué opciones le está dando? El mío no lo imprime así y mirando el código fuente que parece estar usando,_PATH_PROC_MOUNTINFO
que parece/proc/self/mountinfo
no tener esta información tampoco./proc/self/mountinfo
relativamente recientemente fue reestructurado. Estaba en mi máquina RHEL6 antes, que no tenía la información de la ruta, pero mi máquina RHEL7 sí y, como se menciona en su enlace, Wheezy también./dev/A
se monta en/B
y lo hacemount --bind /B /C
, los núcleos más antiguos solo recuerdan/B → /dev/A
y/C → /dev/A
, no recuerdan ninguna relación entre/B
y/C
. Por lo tanto, desmontar/B
naturalmente no tiene ningún efecto/C
. Los núcleos más nuevos recuerdan que/C
fue un montaje de enlace/B
, pero de una manera que no impide/C
continuar trabajando si no/B
está montado, no sé exactamente cómo.Respuestas:
Has malentendido un poco; los dos puntos de montaje son iguales en términos de permisos, banderas, etc. porque el enlace redirige efectivamente el acceso de una ruta a otra. Pero todavía son distintos .
Si observa
/proc/self/mountinfo
, verá la vista del núcleo del mundo de montaje para este proceso (los espacios de nombres hacen las cosas más complicadas; no hay una sola vista de la tabla de montaje).man 5 proc
explicará el formato de este archivo, pero puede ver la jerarquía del árbol y dónde los montajes de enlace tienen su "padre". Este es el archivo quefindmnt
analiza.fuente
Linux no mantiene la información sobre qué montaje era un montaje de enlace . Mantiene información sobre todas las monturas, incluidas las monturas de enlace .
Es bastante similar a los enlaces duros. Los montajes enlazan a sistemas de archivos como los nombres de archivos enlazan a inodes. Las únicas diferencias son que los montajes también tienen indicadores por punto de montaje y pueden referirse a un subdirectorio del sistema de archivos de destino en lugar de la raíz del sistema de archivos.
Cuando crea un enlace duro, el sistema de archivos no guarda qué nombre de archivo era el original y cuál era el enlace duro. Ambos simplemente se refieren al mismo inodo. Si desvincula el archivo original, la situación no se puede distinguir si creó directamente el archivo con el segundo nombre de archivo.
Regresar a los montajes de enlace: el núcleo mantiene una tabla que contiene el sistema de archivos (identificado por un par mayor: número menor), el punto de montaje, la ruta relativa a la raíz del sistema de archivos y algunos indicadores. Puede acceder a esta lista mirando
/proc/self/mountinfo
. (Se vuelve más complicado cuando hay espacios de nombres involucrados, como mencionó @ stephen-harris).findmnt
analiza esta lista.Si su raíz es
/dev/sda1
con el mayor: menor8:1
y ejecutamount --bind /a /b
/proc/self/mountinfo
contendrá líneas similares a esta:Si
/home
está/dev/sda2
con el mayor: menor8:2
y ejecutamount --bind /home /users
, se verá así:Las columnas relevantes para su pregunta son la tercera, la cuarta y la quinta. Esta es la identificación del sistema de archivos (para sistemas de archivos reales es lo mismo que el dispositivo mayor: menor; para sistemas de archivos virtuales como tmpfs es [0: contador ]), la ruta relativa a la raíz del sistema de archivos que está vinculada al punto de montaje (generalmente / para normal monturas, puede ser cualquier cosa para monturas de unión) y el punto de montaje.
Para conocer el significado de las columnas restantes, consulte la documentación del kernel de Linux .
findmnt
llama a la ruta de origen relativa a la raíz del sistema de archivos "FSROOT". Puedes usarfindmnt -o TARGET,FSROOT
para conseguirlo. Si desea la ruta de origen absoluta, probablemente necesite analizarlo/proc/self/mountinfo
usted mismo y combinar la información sobre los montajes para el mismo sistema de archivos.Para obtener más información, consulte mi respuesta a "Enumerar solo montajes de enlace" .
fuente
/proc/self/mountinfo
pueden contener líneas como2 1 8:1 /a /b rw - ext4 /dev/sda1 rw,errors=remount-ro
, a continuación, Linux sin duda hace mantener un poco de información acerca de montaje de vínculos.mount --bind /home/melab /mnt
la línea resultante podría parecerse a cualquiera de los siguientes, dependiendo de cuál de/home
y/home/melab
es un punto de montaje:3 1 8:1 /home/melab /mnt rw - ext4 /dev/sda1 rw
,3 1 8:2 /melab /mnt rw - ext4 /dev/sda2 rw
,3 1 8:3 / /mnt rw - ext4 /dev/sda3 rw
/
en la cuarta columna a menudo indica un montaje de enlace. Pero también podría ser un subvolumen Btrfs./dev/sda3
supone que debe montarse en/home/melab
?/dev/sda1
as/
,/dev/sda2
as/home
y/dev/sda3
as/home/melab