¿Cuál es la diferencia entre ln -s y mount --bind?

36

Estoy tratando de entender la diferencia entre usar ln -sy mount --bind. En el escenario básico, puedo usar ambos para acceder a un directorio desde otro lugar. ¿En qué escenarios esos dos se comportarán de manera diferente?

Łukasz
fuente
77
Debo advertir en contra rm -rde a mount --bind. Con a ln, elimina el enlace, mientras que para a --bind, tiene el mismo efecto que ejecutarlo rm -ren el objetivo. No es bueno, como encontré poco antes de reconstruir uno de mis servidores ...
Mark K Cowan
@MarkKCowan es cierto a menos que haya creado un enlace duro .
JohnnyQ
@JohnnyQ No se pueden enlazar directorios
Mark K Cowan

Respuestas:

33

Se comportarán de manera diferente en al menos dos casos:

  • En un chroot , si el objetivo del enlace está fuera del chroot, el enlace estará muerto. Aún se podrá acceder a una montura de unión.
  • Varios programas pueden distinguir entre enlaces simbólicos y directorios o archivos reales. Pocos (si los hay) pueden distinguir entre un directorio o archivo y el que está montado en él. Esto también se extiende a enlaces simbólicos a algo ( A) que tienen algo más ( B) montado en ellos. El enlace mostrará el contenido de mount target ( B) en lugar del original ( A).

Además, puede enlazar montar un directorio o archivo en un directorio o archivo existente, enmascarando el contenido original (haciendo que el contenido original sea inaccesible a menos que el original se haya montado en otro lugar). Un enlace simbólico requiere que el original se mueva o se elimine.

muru
fuente
16

Bueno, ln -screa un enlace simbólico, mientras que mount --bindcrea una montura.

Un enlace simbólico es un tipo especial de archivo. Si lo hace ln -s /var/target /var/link, /var/linkhabrá un archivo que contiene la ruta " /var/target" en él. La única diferencia entre un enlace simbólico y un archivo ordinario es que cuando un programa intenta realizar una operación en un enlace simbólico, la operación generalmente se realiza en el destino en lugar del archivo. Entonces, si lo hace ls /var/link, el lsprograma intentará obtener una lista de directorio para /var/link, pero en realidad obtendrá una lista de directorio para /var/target.

Sin embargo, los enlaces simbólicos siguen siendo solo archivos. Pueden ser renombrados y eliminados y todo ese jazz. Tenga en cuenta que no puede crear un enlace simbólico (o un archivo ordinario) /var/linksi ya hay un archivo llamado /var/link; primero deberías deshacerte de él.

Un montaje no es un archivo; Es un registro que el núcleo guarda en la memoria. Si lo hace mount --bind /var/target /var/mount, el núcleo registrará el hecho de que /var/mountahora es un nuevo nombre para /var/target. (No conozco los detalles; en particular, no sé si montar algo en un subdirectorio /var/targethará que aparezca /var/mounttambién, o por qué o por qué no. Se agradecerán las modificaciones de esta respuesta). Así que ahora si lo hace ls /var/mount, sucederá lo mismo que lo hizo ls /var/target, porque /var/mounty /var/targetson el mismo directorio.

Las monturas no son archivos. No sé qué pasaría si intentaras renombrar o eliminar /var/mount. Tenga en cuenta que no puede montar nada a /var/mount menos que ya haya un directorio en /var/mount.

Tanner Swett
fuente
1
No he usado mount --bind, pero dudo que pueda replicar el comportamiento de un enlace simbólico como ln -s ../../myfile .. Si mueve eso a otro directorio, apuntará a otro lugar porque es un enlace relativo. Esto puede ser útil si necesita hacer una copia de seguridad de un subárbol y aún así los enlaces funcionan en la copia de seguridad.
Joe
10

Además, ln -s sobreviviría a un reinicio; mientras que mount --bind no lo haría, a menos que edite / etc / fstab para hacerlo persistente.

Mark Williams
fuente
2

Además de las otras respuestas. El sistema no permite enlaces duros al directorio:

# ln mydir mpoint
ln: `mydir': hard link not allowed for directory

La montura le permite crear enlaces duros, es decir, dos o más nombres para el mismo inodo :

# mount -B mydir/ mpoint/
# ls -d -i *
807175  mpoint/  807175  mydir/

(Uno puede encontrar que ayuda para la copia de seguridad de instantáneas con la versión anterior de rsync).

Además, tenga en cuenta que este montaje no está completo:

# mount -B -oro mydir/ mpoint/
mount: warning: mpoint/ seems to be mounted read-write.
# mount | grep mpoint
/root/learn/mydir on /root/learn/mpoint type none (rw,bind)

Por lo tanto, el soporte aún es de lectura y escritura, incluso si solicité la opción ro (solo lectura).

Udi
fuente