我试图理解使用ln -s
和之间的区别mount --bind
。在基本情况下,我可以使用两者从其他地方访问一个目录。在什么情况下,这两者的行为会有所不同?
答案1
他们至少在两种情况下会表现出不同:
- 在一个chroot,如果链接目标在 chroot 之外,则链接将失效。绑定挂载仍可访问。
- 有多个程序可以区分符号链接和实际目录或文件。但很少有程序(如果有的话)可以区分目录或文件和挂载在其上的目录或文件。这也扩展到指向某个对象(
A
)的符号链接,而该对象上挂载了其他对象(B
)。链接将显示挂载目标(B
)的内容,而不是原始内容(A
)。
此外,您还可以将目录或文件绑定挂载到现有目录或文件上,从而屏蔽原始内容(除非原始内容在其他地方绑定挂载,否则原始内容将无法访问)。符号链接要求移动或删除原始内容。
答案2
嗯,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 不是一个文件;它是内核保存在内存中的记录。如果你执行了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
。
答案3
此外,ln -s 会在重启后继续存在;而 mount --bind 则不会,除非您编辑 /etc/fstab 使其持久存在。
答案4
除了两者之间的概念差异(目前已有的答案对此进行了很好的解释)之外,还有一个功能性的东西可能会造成一些混乱,因为它的行为并不像人们最初预期的那样(这是我的情况)。它涉及目录。
设置
创建一个符号链接以及相同的挂载点目录:
[cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> uname -a Linux cfati-5510-0 4.19.128-microsoft-standard #1 SMP Tue Jun 23 12:58:10 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> cat /etc/lsb-release | grep LTS DISTRIB_DESCRIPTION="Ubuntu 20.04.2 LTS" [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> echo $- himBHs [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll total 0 drwxrwxrwx 1 cfati cfati 4096 Feb 26 2021 ./ drwxrwxrwx 1 cfati cfati 4096 Feb 26 2021 ../ [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ln -s /mnt/e/Work/Dev/Utils/cup-vm/test0 ln [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> mkdir mnt [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> sudo mount --bind /mnt/e/Work/Dev/Utils/cup-vm/test0 mnt [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> # Check the 2 [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll total 0 drwxrwxrwx 1 cfati cfati 4096 Feb 26 2021 ./ drwxrwxrwx 1 cfati cfati 4096 Feb 26 2021 ../ lrwxrwxrwx 1 cfati cfati 34 Feb 26 2021 ln -> /mnt/e/Work/Dev/Utils/cup-vm/test0/ drwxrwxrwx 1 cfati cfati 4096 Feb 26 2021 mnt/ [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll ln lrwxrwxrwx 1 cfati cfati 34 Feb 26 2021 ln -> /mnt/e/Work/Dev/Utils/cup-vm/test0/ [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll ln/ total 0 drwxrwxrwx 1 cfati cfati 4096 Feb 26 2021 ./ drwxrwxrwx 1 cfati cfati 4096 Feb 26 2021 ../ drwxrwxrwx 1 cfati cfati 4096 Feb 26 2021 dir0/ -rwxrwxrwx 1 cfati cfati 0 Feb 26 2021 file0.txt* [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll mnt total 0 drwxrwxrwx 1 cfati cfati 4096 Feb 26 2021 ./ drwxrwxrwx 1 cfati cfati 4096 Feb 26 2021 ../ drwxrwxrwx 1 cfati cfati 4096 Feb 26 2021 dir0/ -rwxrwxrwx 1 cfati cfati 0 Feb 26 2021 file0.txt* [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]>
测试
一切都按预期进行。以下是 2 在树中向上移动一层时的行为:
挂载点:
[cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll mnt/.. total 0 drwxrwxrwx 1 cfati cfati 4096 Feb 26 2021 ./ drwxrwxrwx 1 cfati cfati 4096 Feb 26 2021 ../ lrwxrwxrwx 1 cfati cfati 34 Feb 26 2021 ln -> /mnt/e/Work/Dev/Utils/cup-vm/test0/ drwxrwxrwx 1 cfati cfati 4096 Feb 26 2021 mnt/ [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll mnt/../ ln/ mnt/ [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll mnt/../mnt/ # With TAB completion (previous line) total 0 drwxrwxrwx 1 cfati cfati 4096 Feb 26 2021 ./ drwxrwxrwx 1 cfati cfati 4096 Feb 26 2021 ../ drwxrwxrwx 1 cfati cfati 4096 Feb 26 2021 dir0/ -rwxrwxrwx 1 cfati cfati 0 Feb 26 2021 file0.txt*
符号链接:
[cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll ln/.. total 0 drwxrwxrwx 1 cfati cfati 4096 Feb 26 2021 ./ drwxrwxrwx 1 cfati cfati 4096 Feb 14 03:37 ../ drwxrwxrwx 1 cfati cfati 4096 Feb 26 2021 test0/ drwxrwxrwx 1 cfati cfati 4096 Dec 24 2019 windows/ [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll ln/../ ln/ mnt/ [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll ln/../ln # With TAB completion (previous line) ls: cannot access 'ln/../ln': No such file or directory
如图所示,父级目录是相对于目标计算的。当使用不包含在符号链接编辑目录