-
Montar una carpeta dentro de otra carpeta de Debian
En Debian podemos hacer que el contenido de una carpeta aparezca también dentro de otra ruta del sistema de archivos sin copiar los datos ni crear un enlace simbólico. Para ello podemos utilizar un bind mount, una funcionalidad del kernel de Linux que permite montar un directorio existente en otro punto del árbol de directorios. Este mecanismo resulta especialmente útil cuando una aplicación espera encontrar determinados archivos en una ruta concreta, cuando queremos reorganizar la estructura de directorios sin mover físicamente los datos o cuando queremos presentar el mismo directorio desde varias ubicaciones.
Supongamos que tenemos nuestros datos almacenados en:
/home/nipegun/Datos
y queremos que esos mismos datos también aparezcan en:
/mnt/Datos
Primero creamos el directorio que utilizaremos como punto de montaje:
sudo mkdir -p /mnt/Datos
Después realizamos el bind mount:
sudo mount --bind /home/nipegun/Datos /mnt/Datos
A partir de ese momento, al acceder a:
/mnt/Datos
veremos exactamente el mismo contenido que existe en:
/home/nipegun/Datos
No estamos copiando los archivos. Ambas rutas apuntan a los mismos objetos del sistema de archivos. Por tanto, si modificamos, creamos o eliminamos un archivo desde cualquiera de las dos rutas, el cambio será visible inmediatamente desde la otra.
Podemos comprobar que realmente se trata de un punto de montaje utilizando:
findmnt /mnt/Datos
También podemos verlo mediante:
mount | grep "/mnt/Datos"
Qué ocurre con los permisos
Un bind mount no crea una nueva copia de los permisos ni modifica los propietarios de los archivos. Los UID, GID y permisos Unix siguen siendo exactamente los mismos que los del directorio original. Por ejemplo, si tenemos:
/home/nipegun/Datos/documento.txt
con los siguientes permisos:
-rw-r--r-- 1 nipegun nipegun documento.txt
después del bind mount veremos esos mismos permisos al consultar:
/mnt/Datos/documento.txt
Por tanto, un bind mount no sirve para saltarnos los permisos del sistema de archivos. Si nuestro usuario no puede leer, escribir o ejecutar determinado archivo desde la ruta original, tampoco podrá hacerlo desde la ruta montada. También debemos tener en cuenta los permisos de los directorios padre que debemos atravesar para llegar al punto de montaje. Por ejemplo:
/mnt/Datos
puede contener archivos accesibles para nuestro usuario, pero necesitaremos también permiso de ejecución sobre:
/mnt
para poder atravesarlo.
Qué ocurre con el contenido previo de la carpeta de destino
Si el directorio utilizado como destino ya contiene archivos, estos no se eliminan, pero dejan temporalmente de ser visibles mientras el bind mount está activo. Por ejemplo, si antes del montaje tenemos:
/mnt/Datos/archivo-antiguo.txt
y posteriormente ejecutamos:
sudo mount --bind /home/nipegun/Datos /mnt/Datos
el contenido original de `/mnt/Datos` quedará oculto detrás del montaje. Cuando desmontemos el bind mount, volveremos a ver esos archivos.
Desmontar la carpeta
Para eliminar el bind mount utilizamos:
sudo umount /mnt/Datos
Los archivos originales de `/home/nipegun/Datos` permanecerán intactos. Podemos comprobar posteriormente que el punto de montaje ya no existe con:
findmnt /mnt/Datos
Hacer permanente el bind mount
El comando `mount –bind` crea un montaje temporal. Después de reiniciar Debian desaparecerá. Si queremos que se cree automáticamente durante el arranque podemos declararlo en `/etc/fstab`. Editamos:
sudo nano /etc/fstab
y añadimos:
/home/nipegun/Datos /mnt/Datos none bind 0 0
Podemos probar la configuración sin reiniciar ejecutando:
sudo mount -a
Conviene comprobar después que el montaje se ha realizado correctamente:
findmnt /mnt/Datos
De esta forma Debian realizará automáticamente el bind mount durante el arranque.
Hacer el montaje sin sudo
Normalmente un usuario corriente no puede ejecutar directamente:
mount --bind /home/nipegun/Datos /home/nipegun/Montado
porque crear montajes requiere el privilegio `CAP_SYS_ADMIN`. Una posibilidad es autorizar previamente ese montaje mediante `/etc/fstab`. Por ejemplo:
/home/nipegun/Datos /home/nipegun/Montado none bind,user 0 0
La modificación de `/etc/fstab` tendremos que realizarla inicialmente como root, pero una vez configurada podremos montar el directorio como usuario normal mediante:
mount /home/nipegun/Montado
Y desmontarlo mediante:
umount /home/nipegun/Montado
La opción `user` permite que un usuario no privilegiado realice específicamente ese montaje definido en `/etc/fstab`, sin concederle permiso general para realizar cualquier montaje del sistema. Además, el usuario que realiza el montaje será normalmente quien pueda desmontarlo.
Si queremos permitir que distintos usuarios puedan realizar o desmontar ese montaje podemos utilizar `users` en lugar de `user`:
/home/nipegun/Datos /home/nipegun/Montado none bind,users 0 0
Debemos tener en cuenta que las opciones `user` y `users` aplican también restricciones de seguridad por defecto, como `nosuid`, `nodev` y `noexec`, salvo que configuremos explícitamente otras opciones cuando sean necesarias.
Realizar un bind mount dentro de un namespace de usuario
Linux también permite crear espacios de nombres aislados. En sistemas donde los unprivileged user namespaces estén permitidos podemos crear un namespace en el que nuestro usuario disponga de capacidades administrativas únicamente dentro de ese entorno. Podemos iniciar uno mediante:
unshare --user --map-root-user --mount
Dentro del nuevo namespace apareceremos como root desde el punto de vista de ese namespace:
id
Y, si la configuración y las restricciones del kernel lo permiten, podremos realizar determinados montajes dentro de ese namespace:
mount --bind /home/nipegun/Datos /home/nipegun/Montado
La diferencia fundamental es que el montaje sólo existirá dentro de ese mount namespace. Otra terminal normal de nuestro sistema no verá necesariamente ese montaje y, cuando finalice el namespace, el montaje desaparecerá. Esta técnica resulta especialmente interesante para entornos aislados, sandboxes, procesos de compilación y contenedores.
Utilizar bindfs cuando necesitamos modificar la representación de los permisos
Si además de montar una carpeta dentro de otra queremos que desde la nueva ruta aparezcan propietarios o permisos diferentes, un bind mount convencional no es suficiente. Podemos utilizar `bindfs`, que implementa este comportamiento mediante FUSE. En Debian podemos instalarlo mediante:
sudo apt update sudo apt install bindfs
Por ejemplo, podemos montar:
bindfs /home/nipegun/Datos /home/nipegun/Montado
Al utilizar FUSE podemos realizar determinados montajes desde espacio de usuario sin necesitar los privilegios que requiere un bind mount convencional. Además, `bindfs` permite transformar propietarios, grupos y permisos visibles desde el punto de montaje, lo que lo convierte en una alternativa interesante cuando necesitamos presentar los mismos archivos de forma diferente a determinadas aplicaciones o usuarios.
Bind mount frente a enlace simbólico
Para muchos casos sencillos también podríamos utilizar un enlace simbólico:
ln -s /home/nipegun/Datos /home/nipegun/Montado
Sin embargo, conceptualmente no funcionan de la misma forma.
- Un enlace simbólico es simplemente un archivo especial que contiene una referencia a otra ruta.
- Un bind mount, en cambio, hace que el kernel presente directamente un directorio existente en otro punto del sistema de archivos.
Esto significa que determinadas aplicaciones, servicios, chroots, sandboxes o mecanismos que inspeccionan puntos de montaje pueden comportarse de manera diferente ante un enlace simbólico y ante un bind mount.
Podemos comprobar claramente la diferencia utilizando `findmnt`. Un enlace simbólico no aparecerá como un sistema de archivos montado, mientras que un bind mount sí:
findmnt /home/nipegun/Montado
Cuando simplemente necesitamos acceder cómodamente a otra ruta, un enlace simbólico suele ser suficiente y no requiere privilegios especiales. Cuando necesitamos que otra ruta del árbol de directorios se comporte realmente como un punto de montaje del mismo directorio, utilizaremos un bind mount.