问题描述
我试图了解使用ln -s
和mount --bind
之间的区别。在基本方案中,我可以使用这两种方法从其他位置访问一个目录。在什么情况下,这两种行为会有所不同?
最佳思路
在至少两种情况下,它们的行为将有所不同:
-
在chroot中,如果链接目标在chroot之外,则链接将失效。绑定安装仍然可以访问。
-
几个程序可以区分符号链接和实际目录或文件。很少有人(如果有的话)可以区分目录或文件与目录或文件之间的区别。这也扩展到指向某些内容(
A
)的符号链接,而这些内容上还装有其他内容(B
)。该链接将显示安装目标(B
)的内容,而不是原始目标(A
)的内容。
另外,您可以在现有目录或文件上绑定安装目录或文件,从而掩盖原始内容(除非将原始内容绑定安装在其他位置,否则将无法访问原始内容)。符号链接要求将原始文件移动或删除。
次佳思路
好吧,ln -s
创建一个符号链接,而mount --bind
创建一个安装。
符号链接是一种特殊类型的文件。如果执行ln -s /var/target /var/link
,则/var/link
将是一个包含路径“ /var/target
”的文件。符号链接和普通文件之间的唯一区别是,当程序尝试对符号链接执行操作时,该操作通常在目标而不是文件上执行。因此,现在如果您执行ls /var/link
,则ls
程序将尝试获取/var/link
的目录列表,但实际上将获得/var/target
的目录列表。
但是,符号链接仍然只是文件。可以重命名和删除它们以及所有爵士乐。请注意,如果已经有一个名为/var/link
的文件,则不能创建名为/var/link
的符号链接(或普通文件);您需要先摆脱它。
坐骑不是文件;它不是文件。这是内核保留在内存中的记录。如果执行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将在重新启动后幸存下来;除非您编辑/etc /fstab使其永久,否则mount –bind不会。