GNU/Linux >> Tutoriales Linux >  >> Linux

¿Una montura de unión?

¿Qué es un "montaje de enlace"? ¿Cómo hago uno? ¿Para qué sirve?

Me han dicho que use un montaje de enlace para algo, pero no entiendo qué es ni cómo usarlo.

Respuesta aceptada:

¿Qué es un montaje de vinculación?

Una montura de enlace es una vista alternativa de un árbol de directorios. Clásicamente, el montaje crea una vista de un dispositivo de almacenamiento como un árbol de directorios. En cambio, un montaje de enlace toma un árbol de directorios existente y lo replica en un punto diferente. Los directorios y archivos en el montaje de enlace son los mismos que los originales. Cualquier modificación en un lado se refleja inmediatamente en el otro lado, ya que las dos vistas muestran los mismos datos.

Por ejemplo, después de ejecutar el comando Linux-

mount --bind /some/where /else/where

los directorios /some/where y /else/where tienen el mismo contenido, que es el contenido de /some/where . (Si /else/where no estaba vacío, su contenido anterior ahora está oculto).

A diferencia de un enlace físico o un enlace simbólico, un montaje de vinculación no afecta lo que se almacena en el sistema de archivos. Es una propiedad del sistema en vivo.

¿Cómo creo un montaje de vinculación?

bindfs

Los bindfs filesystem es un sistema de archivos FUSE que crea una vista de un árbol de directorios. Por ejemplo, el comando

bindfs /some/where /else/where

hace /else/where un punto de montaje bajo el cual el contenido de /some/where son visibles.

Dado que bindfs es un sistema de archivos separado, los archivos /some/where/foo y /else/where/foo aparecen como archivos diferentes a las aplicaciones (el sistema de archivos bindfs tiene su propio st_dev valor). Cualquier cambio en un lado se refleja "mágicamente" en el otro lado, pero el hecho de que los archivos sean los mismos solo es evidente cuando uno sabe cómo funciona bindfs.

Bindfs no tiene conocimiento de los puntos de montaje, por lo que si hay un punto de montaje en /some/where , aparece como otro directorio en /else/where . Montar o desmontar un sistema de archivos debajo de /some/where aparece debajo de /else/where como un cambio del directorio correspondiente.

Bindfs puede alterar algunos de los metadatos del archivo:puede mostrar permisos falsos y propiedad de los archivos. Consulte el manual para obtener más detalles y vea los ejemplos a continuación.

Un sistema de archivos bindfs se puede montar como un usuario no root, solo necesita el privilegio para montar sistemas de archivos FUSE. Dependiendo de su distribución, esto puede requerir estar en el fuse grupo o ser permitido a todos los usuarios. Para desmontar un sistema de archivos FUSE, use fusermount -u en lugar de umount , por ejemplo

fusermount -u /else/where

nulos

FreeBSD proporciona los nullfs sistema de archivos que crea una vista alternativa de un sistema de archivos. Los siguientes dos comandos son equivalentes:

mount -t nullfs /some/where /else/where
mount_nullfs /some/where /else/where

Después de emitir cualquiera de los comandos, /else/where se convierte en un punto de montaje en el que el contenido de /some/where son visibles.

Dado que nullfs es un sistema de archivos separado, los archivos /some/where/foo y /else/where/foo aparecen como archivos diferentes a las aplicaciones (el sistema de archivos nullfs tiene su propio st_dev valor). Cualquier cambio en un lado se refleja "mágicamente" en el otro lado, pero el hecho de que los archivos sean los mismos solo es aparente cuando uno sabe cómo funciona nullfs.

A diferencia de los bindfs de FUSE, que actúan a nivel del árbol de directorios, los nullfs de FreeBSD actúan más profundamente en el kernel, por lo que los puntos de montaje se encuentran en /else/where. no son visibles:solo el árbol que forma parte del mismo punto de montaje que /some/where se refleja en /else/where .

El sistema de archivos nullfs puede utilizarse con otras variantes de BSD (OS X, OpenBSD, NetBSD), pero no está compilado como parte del sistema predeterminado.

Montaje de enlace de Linux

Bajo Linux, los montajes de enlace están disponibles como una característica del kernel. Puedes crear uno con el mount comando, pasando el --bind opción de línea de comando o rbind opción de montaje. Los siguientes dos comandos son equivalentes:

mount --bind /some/where /else/where
mount -o bind /some/where /else/where

Aquí, el "dispositivo" /some/where no es una partición de disco como en el caso de un sistema de archivos en disco, sino un directorio existente. El punto de montaje /else/where debe ser un directorio existente como de costumbre. Tenga en cuenta que no se especifica ningún tipo de sistema de archivos de ninguna manera:hacer un montaje de vinculación no implica un controlador de sistema de archivos, copia las estructuras de datos del núcleo del montaje original.

mount --bind también admite el montaje de un no directorio en un no directorio:/some/where puede ser un archivo normal (en cuyo caso /else/where también debe ser un archivo normal).

Un montaje de enlace de Linux es casi indistinguible del original. El comando df -T /else/where muestra el mismo dispositivo y el mismo tipo de sistema de archivos que df -T /some/where . Los archivos /some/where/foo y /else/where/foo son indistinguibles, como si fueran enlaces duros. Es posible desmontar /some/where , en cuyo caso /else/where permanece montado.

Con kernels más antiguos (no sé exactamente cuándo, creo que hasta algún 3.x), los montajes de enlace eran realmente indistinguibles del original. Los núcleos recientes rastrean los montajes de enlace y exponen la información a través de PID /mountinfo, que permite findmnt para indicar el montaje vinculante como tal.

Puede colocar entradas de montaje vinculante en /etc/fstab . Solo incluye rbind (o rbind etc.) en las opciones, junto con cualquier otra opción que desee. El "dispositivo" es el árbol existente. La columna del sistema de archivos puede contener none o bind (se ignora, pero usar un nombre de sistema de archivos sería confuso). Por ejemplo:

/some/where /readonly/view none bind,ro

Si hay puntos de montaje debajo de /some/where , sus contenidos no son visibles en /else/where . En lugar de rbind , puedes usar rbind , también replique los puntos de montaje debajo de /some/where . Por ejemplo, si /some/where/mnt es un punto de montaje entonces

mount --rbind /some/where /else/where

es equivalente a

mount --bind /some/where /else/where
mount --bind /some/where/mnt /else/where/mnt

Además, Linux permite que los montajes se declaren como compartidos , esclavo , privado o no enlazable . Esto afecta si esa operación de montaje se refleja en un montaje de vinculación que replica el punto de montaje. Para obtener más detalles, consulte la documentación del kernel.

Linux también proporciona una forma de mover montajes:where --bind copias, --move mueve un punto de montaje.

Es posible tener diferentes opciones de montaje en dos directorios montados en enlace. Sin embargo, hay una peculiaridad:hacer el montaje de enlace y configurar las opciones de montaje no se puede hacer atómicamente, tienen que ser dos operaciones sucesivas. (Los núcleos más antiguos no permitían esto). Por ejemplo, los siguientes comandos crean una vista de solo lectura, pero hay una pequeña ventana de tiempo durante la cual /else/where es lectura-escritura:

mount --bind /some/where /else/where
mount -o remount,ro,bind /else/where

¡No puedo hacer que funcionen las monturas enlazadas!

Si su sistema no es compatible con FUSE, un truco clásico para lograr el mismo efecto es ejecutar un servidor NFS, hacer que exporte los archivos que desea exponer (permitiendo el acceso a localhost ) y montarlos en la misma máquina. Esto tiene una sobrecarga significativa en términos de memoria y rendimiento, por lo que los montajes de vinculación tienen una ventaja definitiva donde están disponibles (que está en la mayoría de las variantes de Unix gracias a FUSE).

Relacionado:¿Cómo depurar un script bash?

Casos de uso

Vista de solo lectura

Puede ser útil crear una vista de solo lectura de un sistema de archivos, ya sea por razones de seguridad o simplemente como una capa de seguridad para asegurarse de que no lo modificará accidentalmente.

Con enlaces:

bindfs -r /some/where /mnt/readonly

Con Linux, de forma sencilla:

mount --bind /some/where /mnt/readonly
mount -o remount,ro,bind /mnt/readonly

Esto deja un breve intervalo de tiempo durante el cual /mnt/readonly es de lectura-escritura. Si esto es un problema de seguridad, primero cree el montaje de enlace en un directorio al que solo pueda acceder la raíz, hágalo de solo lectura y luego muévalo a un punto de montaje público. En el fragmento a continuación, tenga en cuenta que es importante que /root/private (el directorio sobre el punto de montaje) es privado; los permisos originales en /root/private/mnt son irrelevantes ya que están ocultos detrás del punto de montaje.

mkdir -p /root/private/mnt
chmod 700 /root/private
mount --bind /some/where /root/private/mnt
mount -o remount,ro,bind /root/private/mnt
mount --move /root/private/mnt /mnt/readonly

Reasignación de usuarios y grupos

Los sistemas de archivos registran usuarios y grupos por su identificación numérica. A veces termina con múltiples sistemas que asignan diferentes ID de usuario a la misma persona. Esto no es un problema con el acceso a la red, pero hace que las identificaciones de usuario no tengan sentido cuando transporta datos de un sistema a otro en un disco. Suponga que tiene un disco creado con un sistema de archivos multiusuario (por ejemplo, ext4, btrfs, zfs, UFS, …) en un sistema en el que Alice tiene el ID de usuario 1000 y Bob tiene el ID de usuario 1001, y desea que ese disco sea accesible en un sistema donde Alice tiene el ID de usuario 1001 y Bob tiene el ID de usuario 1000. Si monta el disco directamente, los archivos de Alice aparecerán como propiedad de Bob (porque el ID de usuario es 1001) y los archivos de Bob aparecerán como propiedad de Alice (porque el el ID de usuario es 1000).

Puede usar bindfs para reasignar ID de usuario. Primero monte la partición del disco en un directorio privado, donde solo la raíz puede acceder. A continuación, cree una vista bindfs en un área pública, con la reasignación de ID de usuario e ID de grupo que intercambie las ID de usuario y las ID de grupo de Alice y Bob.

mkdir -p /root/private/alice_disk /media/alice_disk
chmod 700 /root/private
mount /dev/sdb1 /root/private/alice_disk
bindfs --map=1000/1001:1001/1000:@1000/1001:@1001/1000 /root/private/alice_disk /media/alice_disk

Consulte ¿Cómo se puede acceder de forma permisible a los archivos en la carpeta de inicio del usuario del sistema no arrancado? y montar – enlazar a otro usuario como yo mismo otros ejemplos.

Montaje en jaula o contenedor

Un chroot jail o contenedor ejecuta un proceso en un subárbol del árbol de directorios del sistema. Esto puede ser útil para ejecutar un programa con acceso restringido, p. ejecutar un servidor de red con acceso solo a sus propios archivos y a los archivos que sirve, pero no a otros datos almacenados en la misma computadora). Una limitación de chroot es que el programa está confinado a un subárbol:no puede acceder a subárboles independientes. Los montajes de enlace permiten injertar otros subárboles en ese árbol principal. Esto los hace fundamentales para el uso más práctico de contenedores bajo Linux.

Por ejemplo, suponga que una máquina ejecuta un servicio /usr/sbin/somethingd que solo debería tener acceso a los datos en /var/lib/something . El árbol de directorios más pequeño que contiene estos dos archivos es la raíz. ¿Cómo se puede confinar el servicio? Una posibilidad es hacer enlaces duros a todos los archivos que necesita el servicio (al menos /usr/sbin/somethingd y varias bibliotecas compartidas) en /var/lib/something . Pero esto es engorroso (los enlaces duros deben actualizarse cada vez que se actualiza un archivo) y no funciona si /var/lib/something y /usr están en diferentes sistemas de archivos. Una mejor solución es crear una raíz ad hoc y llenarla con montajes:

mkdir /run/something
cd /run/something
mkdir -p etc/something lib usr/lib usr/sbin var/lib/something
mount --bind /etc/something etc/something
mount --bind /lib lib
mount --bind /usr/lib usr/lib
mount --bind /usr/sbin usr/sbin
mount --bind /var/lib/something var/lib/something
mount -o remount,ro,bind etc/something
mount -o remount,ro,bind lib
mount -o remount,ro,bind usr/lib
mount -o remount,ro,bind usr/sbin
chroot . /usr/sbin/somethingd &

Los espacios de nombres de montaje de Linux generalizan chroots. Los montajes de enlace son cómo se pueden llenar los espacios de nombres de manera flexible. Consulte Hacer que un proceso lea un archivo diferente para el mismo nombre de archivo para ver un ejemplo.

Ejecutar una distribución diferente

Otro uso de chroot es instalar una distribución diferente en un directorio y ejecutar programas desde allí, incluso cuando requieren archivos en rutas codificadas que no están presentes o tienen un contenido diferente en el sistema base. Esto puede ser útil, por ejemplo, para instalar una distribución de 32 bits en un sistema de 64 bits que no admite paquetes mixtos, para instalar versiones anteriores de una distribución u otras distribuciones para probar la compatibilidad, para instalar una versión más nueva para probar las funciones más recientes manteniendo un sistema base estable, etc. Consulte ¿Cómo ejecuto programas de 32 bits en un Debian/Ubuntu de 64 bits? para ver un ejemplo en Debian/Ubuntu.

Suponga que tiene una instalación de los últimos paquetes de su distribución en el directorio /f/unstable , donde ejecuta programas cambiando a ese directorio con chroot /f/unstable . Para que los directorios de inicio estén disponibles desde estas instalaciones, móntelos en el chroot:

mount --bind /home /f/unstable/home

El programa schroot hace esto automáticamente.

Acceso a archivos ocultos detrás de un punto de montaje

Cuando monta un sistema de archivos en un directorio, esto oculta lo que hay detrás del directorio. Los archivos en ese directorio se vuelven inaccesibles hasta que se desmonta el directorio. Debido a que los montajes BSD nullfs y Linux bind funcionan a un nivel más bajo que la infraestructura de montaje, un montaje nullfs o un montaje bind de un sistema de archivos expone directorios que estaban ocultos detrás de submontajes en el original.

Relacionado:¿Actualizar los valores de un archivo usando información de otro archivo?

Por ejemplo, suponga que tiene un sistema de archivos tmpfs montado en /tmp . Si hubiera archivos bajo /tmp cuando se creó el sistema de archivos tmpfs, estos archivos aún pueden permanecer, efectivamente inaccesibles pero ocupando espacio en el disco. Ejecutar

mount --bind / /mnt

(Linux) o

mount -t nullfs / /mnt

(FreeBSD) para crear una vista del sistema de archivos raíz en /mnt . El directorio /mnt/tmp es el del sistema de archivos raíz.

Exportaciones NFS en diferentes rutas

Algunos servidores NFS (como el servidor NFS del kernel de Linux antes de NFSv4) siempre anuncian la ubicación real del directorio cuando exportan un directorio. Es decir, cuando un cliente solicita server:/requested/location , el servidor sirve el árbol en la ubicación /requested/location . A veces es deseable permitir que los clientes soliciten /request/location pero en realidad sirve archivos bajo /actual/location . Si su servidor NFS no admite el servicio en una ubicación alternativa, puede crear un montaje de enlace para la solicitud esperada, por ejemplo,

/requested/location *.localdomain(rw,async)

en /etc/exports y lo siguiente en /etc/fstab :

/actual/location /requested/location bind bind

Un sustituto de los enlaces simbólicos

A veces le gustaría hacer un enlace simbólico para crear un archivo /some/where/is/my/file aparecer debajo de /else/where , pero la aplicación que usa file expande enlaces simbólicos y rechaza /some/where/is/my/file . Un montaje de vinculación puede solucionar esto:bind-mount /some/where/is/my a /else/where/is/my y luego realpath informará /else/where/is/my/file estar bajo /else/where , no bajo /some/where .

Efectos secundarios de las monturas vinculantes

Recorridos de directorio recursivos

Si utiliza montajes de vinculación, debe ocuparse de las aplicaciones que atraviesan el árbol del sistema de archivos de forma recursiva, como las copias de seguridad y la indexación (por ejemplo, para crear una base de datos de localización).

Por lo general, los montajes de enlace deben excluirse de los recorridos recursivos de directorios, de modo que cada árbol de directorios solo se recorra una vez, en la ubicación original. Con bindfs y nullfs, configure la herramienta transversal para ignorar estos tipos de sistemas de archivos, si es posible. Los montajes de enlace de Linux no se pueden reconocer como tales:la nueva ubicación es equivalente a la original. Con los montajes de enlace de Linux, o con herramientas que solo pueden excluir rutas y no tipos de sistemas de archivos, debe excluir los puntos de montaje para los montajes de enlace.

Recorridos que se detienen en los límites del sistema de archivos (por ejemplo, find -xdev , rsync -x , du -x , …) se detendrá automáticamente cuando encuentren un punto de montaje bindfs o nullfs, porque ese punto de montaje es un sistema de archivos diferente. Con los montajes de enlace de Linux, la situación es un poco más complicada:hay un límite del sistema de archivos solo si el montaje de enlace está injertando un sistema de archivos diferente, no si está injertando otra parte del mismo sistema de archivos.

Ir más allá de las monturas vinculantes

Los montajes de enlace proporcionan una vista de un árbol de directorios en una ubicación diferente. Exponen los mismos archivos, posiblemente con diferentes opciones de montaje y (con bindfs) propiedad y permisos diferentes. Los sistemas de archivos que presentan una vista alterada de un árbol de directorios se denominan sistemas de archivos superpuestos o sistemas de archivos apilables . Hay muchos otros sistemas de archivos superpuestos que realizan transformaciones más avanzadas. Aquí hay algunos comunes. Si su caso de uso deseado no está cubierto aquí, consulte el repositorio de sistemas de archivos FUSE.

  • loggedfs:registra todos los accesos al sistema de archivos con fines de depuración o supervisión (sintaxis del archivo de configuración, ¿es posible averiguar qué programa o secuencia de comandos creó un archivo determinado?, enumera los archivos a los que accede un programa)

Filtrar archivos visibles

  • clamfs:ejecuta archivos a través de un escáner de virus cuando se leen

  • filterfs — ocultar partes de un sistema de archivos

  • rofs:una vista de solo lectura. Similar a bindfs -r , solo un poco más ligero.

  • Montajes de unión:presentan múltiples sistemas de archivos (llamados ramas ) en un solo directorio:if tree1 contiene foo y tree2 contiene bar entonces su vista de unión contiene ambos foo y bar . Los archivos nuevos se escriben en una rama específica o en una rama elegida de acuerdo con reglas más complejas. Hay varias implementaciones de este concepto, que incluyen:

    • aufs — Implementación del kernel de Linux, pero rechazada en sentido ascendente muchas veces
    • funonfs:implementación de FUSE
    • mhddfs — FUSE, escribe archivos en una rama según el espacio libre
    • superposición:implementación del kernel de Linux, fusionada en sentido ascendente en Linux v3.18
    • unionfs-fuse:FUSE, con funciones de almacenamiento en caché y copia en escritura

Modificar nombres de archivos y metadatos

  • ciopfs:nombres de archivo que no distinguen entre mayúsculas y minúsculas (puede ser útil para montar sistemas de archivos de Windows)
  • convmvfs — convertir nombres de archivo entre juegos de caracteres (ejemplo)
  • posixovl:almacene nombres de archivos Unix y otros metadatos (permisos, propiedad, …) en sistemas de archivos más restringidos como VFAT (ejemplo)

Ver contenidos de archivos alterados

  • avfs:para cada archivo de almacenamiento, presente un directorio con el contenido del archivo (ejemplo, más ejemplos). También hay muchos sistemas de archivos FUSE que exponen archivos específicos como directorios.
  • fuseflt:ejecuta archivos a través de una canalización al leerlos, p. para recodificar archivos de texto o archivos multimedia (ejemplo)
  • lzopfs — descompresión transparente de archivos comprimidos
  • mp3fs:transcodifica archivos FLAC a MP3 cuando se leen (ejemplo)
  • scriptfs:ejecuta scripts para servir contenido (una especie de CGI local) (ejemplo)

Modificar la forma en que se almacena el contenido

  • chironfs:replica archivos en varios almacenamientos subyacentes (RAID-1 en el nivel del árbol de directorios)
  • copyfs:guarde copias de todas las versiones de los archivos
  • encfs — cifrar archivos
  • pcachefs:capa de caché en disco para sistemas de archivos remotos lentos
  • simplecowfs:almacena los cambios a través de la vista proporcionada en la memoria, dejando intactos los archivos originales
  • wayback:guarda copias de todas las versiones de los archivos

Linux
  1. Linux:¿Diferencia entre /dev/console, /dev/tty y /dev/tty0?

  2. ¿Comando para ver dónde está montado un disco?

  3. ¿Montar /tmp y /home en un disco duro separado?

  4. Instalar binarios en /bin, /sbin, /usr/bin y /usr/sbin, interacciones con --prefix y DESTDIR

  5. ¿Cuándo debo usar /dev/shm/ y cuándo debo usar /tmp/?

Listar solo montajes enlazados

hacer eco o imprimir /dev/stdin /dev/stdout /dev/stderr

¿Por qué se requieren < o > para usar /dev/tcp?

¿Deberían vivir los sitios web en /var/ o /usr/ según el uso recomendado?

Poco espacio en /run

¿Cómo hago 'mount --bind' en /etc/fstab?