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

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

我试图理解使用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/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

答案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
    

    如图所示,父级目录是相对于目标计算的。当使用不包含在符号链接编辑目录

相关内容