ln -s和mount -bind有什么区别?

我试图了解使用ln -smount --bind之间的区别。 在基本场景中,我可以使用它们从其他地方访问一个目录。 在哪些情况下,这两种行为会有所不同?

在至少两种情况下,它们的行为会有所不同:

  • 在chroot中 ,如果链接目标位于chroot之外,则链接将死亡。 仍然可以访问绑定装载。
  • 有几个程序可以区分符号链接和实际目录或文件。 很少(如果有的话)可以区分目录或文件以及安装在其上的目录或文件。 这也扩展到符号链接到( A )某些东西( B )安装在它们上面。 该链接将显示安装目标( B )的内容而不是原始( A )。

此外,您可以将目录或文件绑定到现有目录或文件上,屏蔽原始内容(呈现原始内容不可访问,除非原始绑定安装在其他位置)。 符号链接要求移动或删除原始文件。

好吧, ln -s创建一个符号链接,而mount --bind创建一个mount。

符号链接是一种特殊类型的文件。 如果你执行ln -s /var/target /var/link ,那么/var/link将是一个包含路径“ /var/target ”的文件。 符号链接和普通文件之间的唯一区别是,当程序尝试对符号链接执行操作时,通常在目标而不是文件上执行操作。 所以现在如果你执行ls /var/linkls程序将尝试获取/var/link的目录列表,但实际上会获得/var/target的目录列表。

但是,符号链接仍然只是文件。 它们可以被重命名和删除以及所有爵士乐。 请注意,如果已经有一个名为/var/link文件,则无法创建名为/var/link的符号链接(或普通文件)。 你需要先摆脱它。

mount不是文件; 它是内核保留在内存中的记录。 如果你mount --bind /var/target /var/mount ,内核将记录/var/mount现在是/var/target的新名称这一事实。 (我不知道细节;特别是,我不知道在/var/target的子目录中安装某些内容是否会使它显示在/var/mount中,或者为什么或为什么不显示。编辑此内容答案将不胜感激。)所以现在如果你做ls /var/mount ,就会发生同样的事情,好像你做了ls /var/target ,因为/var/mount/var/target是同一个目录。

坐骑不是文件。 我不知道如果你试图重命名或删除/var/mount会发生什么。 请注意, 除非/var/mount已有目录, 否则无法在/var/mount安装任何内容。

此外,ln -s可以在重启后存活; 而mount -bind不会,除非你编辑/ etc / fstab使其持久化。

除了其他答案。 系统不允许硬链接到目录:

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

使用mount可以为同一个inode创建类似硬链接的名称,即两个或多个名称:

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

(人们可以发现它有助于使用旧版本的rsync进行快照备份。)

另请注意,此挂载不完整:

 # 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) 

因此,即使我要求选项ro(只读),挂载仍然是可读写的。